Назад | Перейти на главную страницу

Высокая нагрузка при низком использовании ЦП и низком использовании ввода-вывода в Solaris с ZFS и MySQL

У меня есть система Solaris 10 x86_64 с MySQL 5.5. При интенсивном использовании мы получаем очень медленные ответы из базы данных: медленные запросы выполняются за несколько минут, которые обычно возвращаются за доли секунды. Загрузка процессора находится в диапазоне 60-70%. Средняя нагрузка регулярно приближается к 20-м, редко - к 40-м, и я видел это до 50-х. (Два четырехъядерных процессора с включенной функцией HyperThreading.) Это действует как проблема ввода-вывода, как будто он ожидает записи на диски, но я не вижу никаких указаний на то, что существует какая-либо реальная проблема ввода-вывода. Среднее время ожидания диска постоянно равно 0, средняя очередь ожидания находится в диапазоне 0,2-0,3, а процент занятости диска иногда достигает 15%. (Все это согласно сар.)

Хранилище представляет собой zfs zpool из 5 зеркал zdev двух дисков SAS. У меня нет устройства журнала намерений, но я не вижу в этом проблемы с этой рабочей нагрузкой.

Что мне не хватает?

Хотел дать вам ответ, более похожий на Солярис:

На многопроцессорном / многоядерном блоке вы не можете много использовать нагрузку на процессор. Первоначально используйте mpstat скорее, чем prstat / top если вы хотите увидеть, используется ли время от времени одно из ваших ядер в полную силу.

Если mpstat имеет 8 строк вывода, это означает, что у вас есть 8 ядер ЦП, а затем любой процесс, который вы видите в prstat потребление более 12,5% ресурсов ЦП (100/8), вероятно, будет связано с ЦП. Чтобы проверить, действительно ли это так, вы можете использовать prstat -L -p <pid> чтобы увидеть, достигает ли какой-либо отдельный поток этого процесса 12,5%, потому что тогда вы точно знаете, что процесс привязан к процессору. У вас довольно много доступных ядер ЦП на вашем компьютере, но вы всегда должны помнить, что любой отдельный поток обработки может работать только на одном ядре ЦП. Чтобы MySQL мог использовать ваш ящик, становится вопросом, насколько хорошо разделить работу на несколько потоков. Если в MySQL есть одна горячая нить, ваша мощная машина не очень поможет.

Также вы можете найти немало людей, которые посоветуют отключить Intel HyperThreading на серверной рабочей нагрузке Linux / Solaris, потому что на самом деле без него он работает лучше. YMMM. Насколько я понимаю, Intel HyperThreading отлично подходит для рабочих нагрузок настольного типа, но для сервера, который должен делать только одно и делать это быстро, это может нанести ущерб производительности.

Отсюда можно пройти как минимум дюжину маршрутов, поэтому довольно сложно дать вам совет, прежде чем у вас будет больше фактов.

Вы упоминаете, что средняя нагрузка обычно составляет 20, а иногда и 40 или 50. Затем вы упоминаете, что у вас есть 16 доступных процессоров ((2 процессора x 4 ядра) x 2), поэтому средняя загрузка в 20 секунд означает, что ваши процессы борются за процессорное время, а в 40 или 50 у вас есть большое количество ожидания.

Использование процессора и загрузка процессора не очень хорошо сочетаются друг с другом, но я ожидал бы увидеть немного более высокое использование, если что-то не работает правильно.

Есть еще один пост, который хорошо объясняет среднюю нагрузку с использованием сценария трафика на мосту:

Понимание загрузки процессора Linux

Вкратце - в идеальном мире ваша средняя загрузка никогда не превысила бы количество процессоров (в вашем случае - 16).

Скорее всего, это просто перегрузка системы, а не проблема ZFS или MySQL.

** Изменить, я вижу, был добавлен комментарий, в котором говорилось, что вы видите 100% загрузку ЦП. Это также будет соответствовать процессам, которые просто ждут процессорного времени.