Я запускаю сервер со следующими характеристиками:
Исторически все наши проблемы с масштабированием службы были связаны с диском, но в настоящее время мы видим более высокие значения нагрузки, чем раньше, особенно после обновления до Ubuntu 10.04. Сервер обрабатывает около 50 запросов в секунду. Своп не используется и не должен быть активным. Набор данных MySQL составляет несколько гигабайт, но доступ должен быть достаточно хорошо оптимизирован.
> top
top - 10:42:50 up 16 days, 18:49, 1 user, load average: 20.02, 16.17, 11.44
Tasks: 277 total, 4 running, 273 sleeping, 0 stopped, 0 zombie
Cpu0 : 38.6%us, 3.3%sy, 0.0%ni, 58.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 37.9%us, 3.3%sy, 0.0%ni, 58.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 25.9%us, 3.0%sy, 0.0%ni, 69.5%id, 1.3%wa, 0.0%hi, 0.3%si, 0.0%st
Cpu3 : 23.5%us, 2.0%sy, 0.0%ni, 67.9%id, 0.0%wa, 0.0%hi, 6.6%si, 0.0%st
Cpu4 : 16.4%us, 1.3%sy, 0.0%ni, 82.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu5 : 15.3%us, 1.3%sy, 0.0%ni, 83.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu6 : 14.3%us, 1.0%sy, 0.0%ni, 84.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu7 : 2.3%us, 0.6%sy, 0.0%ni, 97.1%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8187668k total, 8117276k used, 70392k free, 178920k buffers
Swap: 4198968k total, 2084k used, 4196884k free, 6159328k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
32216 mysql 20 0 2026m 788m 4132 S 41 9.9 1292:40 mysqld
8104 www-data 20 0 491m 106m 95m S 4 1.3 1:57.62 apache2
27072 www-data 20 0 684m 112m 101m S 4 1.4 2:51.47 apache2
3391 www-data 20 0 683m 109m 98m S 4 1.4 2:22.29 apache2
16822 www-data 20 0 682m 114m 104m S 4 1.4 3:33.05 apache2
27068 www-data 20 0 555m 113m 102m S 4 1.4 2:53.77 apache2
27118 www-data 20 0 683m 119m 106m S 4 1.5 4:41.48 apache2
1036 www-data 20 0 685m 112m 100m S 3 1.4 2:27.24 apache2
3503 www-data 20 0 556m 81m 70m S 3 1.0 0:33.77 apache2
29803 www-data 20 0 682m 111m 101m S 3 1.4 2:47.09 apache2
1345 www-data 20 0 491m 115m 104m S 3 1.4 4:04.62 apache2
3001 www-data 20 0 379m 109m 98m S 3 1.4 2:13.36 apache2
[... 75 Apache processes with similar specs, but less CPU]
У меня вопрос - вы вообще видите какие-либо проблемы с высокими числами нагрузки? Время отклика увеличилось, но всего на ~ 30%. Включают ли цифры нагрузки в какой-то мере активность диска? Есть ли какие-нибудь комментарии, на что мне следует обратить внимание при оптимизации? Большое спасибо!
> iotop
Total DISK READ: 179.70 K/s | Total DISK WRITE: 1735.81 K/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
16512 be/4 mysql 0.00 B/s 22.94 K/s ?unavailable? mysqld
20701 be/4 mysql 0.00 B/s 0.00 B/s ?unavailable? mysqld
21556 be/4 mysql 0.00 B/s 22.94 K/s ?unavailable? mysqld
28998 be/4 www-data 0.00 B/s 3.82 K/s ?unavailable? apache2 -k start
12771 be/4 mysql 0.00 B/s 3.82 K/s ?unavailable? mysqld
16824 be/4 www-data 0.00 B/s 3.82 K/s ?unavailable? apache2 -k start
2700 be/4 mysql 0.00 B/s 7.65 K/s ?unavailable? mysqld
3074 be/4 mysql 22.94 K/s 0.00 B/s ?unavailable? mysqld
17585 be/4 mysql 0.00 B/s 15.29 K/s ?unavailable? mysqld
30723 be/4 mysql 7.65 K/s 0.00 B/s ?unavailable? mysqld
29906 be/4 www-data 0.00 B/s 3.82 K/s ?unavailable? apache2 -k start
29907 be/4 mysql 0.00 B/s 15.29 K/s ?unavailable? mysqld
13547 be/4 www-data 0.00 B/s 3.82 K/s ?unavailable? apache2 -k start
7444 be/4 www-data 0.00 B/s 3.82 K/s ?unavailable? apache2 -k start
1944 be/4 mysql 149.11 K/s 0.00 B/s ?unavailable? mysqld
16825 be/4 mysql 0.00 B/s 7.65 K/s ?unavailable? mysqld
32223 be/4 mysql 0.00 B/s 3.82 K/s ?unavailable? mysqld
7801 be/4 www-data 0.00 B/s 3.82 K/s ?unavailable? apache2 -k start
5808 be/4 mysql 0.00 B/s 11.47 K/s ?unavailable? mysqld
8104 be/4 www-data 0.00 B/s 3.82 K/s ?unavailable? apache2 -k start
18890 be/4 www-data 0.00 B/s 0.00 B/s ?unavailable? apache2 -k start
1 be/4 root 0.00 B/s 0.00 B/s ?unavailable? init
2 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [kthreadd]
3 rt/4 root 0.00 B/s 0.00 B/s ?unavailable? [migration/0]
В Linux средняя загрузка включает процессы, находящиеся в непрерывном спящем режиме (включая доступ к диску). Однако ваш верхний результат, похоже, не указывает на большое время ожидания ввода-вывода. Поскольку верхние проценты являются усредненными, я мог бы запустить верхнее обновление при высокочастотном обновлении (возможно, -d.1 или -d.5) и в качестве следующего шага искать всплески в ожидании ввода-вывода, которые не проявляются при частоте опроса по умолчанию.
Стандартные системные метрики (нагрузка, ЦП, память и т. Д.) Обычно являются хорошими индикаторами того, насколько ограничена производительность системы, но в конечном итоге значение производительности зависит от того, насколько быстро она может обработать запрос. На практике рекомендуется отслеживать эти показатели и устанавливать пороговые значения, но в конечном итоге они служат лишь индикатором фактической производительности системы.
Я думаю, что архитектура могла бы быть лучше - по приблизительным оценкам, стоимость описанного вами сервера могла бы позволить купить 4Gb / двухпроцессорную / raid 1+ (5/0) для базы данных и как минимум 2 машины с низкими характеристиками для запуска на веб-серверах (я предполагаю, что там где-то есть mod_php или mod_perl), которые, вероятно, будут значительно быстрее.
Конечно, похоже, что большую часть боли здесь вызывает процесс mysqld, но похоже, что apache выполняет довольно много операций ввода-вывода. Какая часть вашего идентификатора памяти используется для кеширования ввода-вывода? RSS для этих процессов Apache также выглядит высоким (размер VIRT тоже - но это, вероятно, следствие высокого RSS) примерно в 10 раз больше, чем значение на ближайшем блоке LAMP, который я смог найти.
Я бы порекомендовал здесь следовать обычному рецепту, но сначала взглянем на материал mysql:
mysql - у вас включено медленное ведение журнала запросов? Вы проанализировали его, чтобы определить потенциальную оптимизацию базы данных
Ты бежишь mysqltuner против вашей установки?
HTTP-кеширование - отправляете ли вы хорошую информацию о кешировании статического содержимого? Отключение условных запросов?
Почему ваши процессы Apache такие большие? Вам действительно нужны все эти модули.
Какой диапазон RTT для ваших пользователей? Включено ли сжатие для статического текста / HTML-содержимого и для вывода скрипта?
Если вы используете сайт PHP, есть ли у вас кеш-код операции (например, APC, ioncude, Zend)?
HTH
Я лично беспокоюсь о высокой загрузке ЦП MySQL. верх - это всего лишь снимок; если вы видите, что процессор для mysql постоянно привязан к 50%, я бы выполнил несколько шагов, чтобы понять, почему.
Нагрузка имеет свойство расти в геометрической прогрессии. Время, необходимое MySQL для достижения 50%, будет намного больше, чем время, необходимое для достижения 100%.