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

Этот топ кажется вам здоровым?

Я запускаю сервер со следующими характеристиками:

Исторически все наши проблемы с масштабированием службы были связаны с диском, но в настоящее время мы видим более высокие значения нагрузки, чем раньше, особенно после обновления до 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:

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

  2. Ты бежишь mysqltuner против вашей установки?

  3. HTTP-кеширование - отправляете ли вы хорошую информацию о кешировании статического содержимого? Отключение условных запросов?

  4. Почему ваши процессы Apache такие большие? Вам действительно нужны все эти модули.

  5. Какой диапазон RTT для ваших пользователей? Включено ли сжатие для статического текста / HTML-содержимого и для вывода скрипта?

  6. Если вы используете сайт PHP, есть ли у вас кеш-код операции (например, APC, ioncude, Zend)?

HTH

Я лично беспокоюсь о высокой загрузке ЦП MySQL. верх - это всего лишь снимок; если вы видите, что процессор для mysql постоянно привязан к 50%, я бы выполнил несколько шагов, чтобы понять, почему.

Нагрузка имеет свойство расти в геометрической прогрессии. Время, необходимое MySQL для достижения 50%, будет намного больше, чем время, необходимое для достижения 100%.