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

Высокая нагрузка на сервер

У меня есть выделенный сервер cpanel LAMP, и последние 2 дня у меня были проблемы с загрузкой.

Вот так выглядит мой топ (отсортировано по M):

top - 14:26:04 up 1 day,  1:08,  2 users,  load average: 33.10, 36.63, 38.92
Tasks: 359 total,   1 running, 355 sleeping,   1 stopped,   2 zombie
Cpu(s):  4.2%us,  0.8%sy,  0.0%ni, 13.6%id, 81.0%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:   1034896k total,   998084k used,    36812k free,     8716k buffers
Swap:  2040212k total,  1606552k used,   433660k free,    87388k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 5088 mysql     15   0  336m 106m 3868 S  1.3 10.6 310:15.37 mysqld
15797 nobody    18   0  331m  65m 1988 S  3.0  6.4   0:04.64 httpd
15635 nobody    19   0  371m  63m 1840 S  0.0  6.3   0:00.88 httpd
15664 nobody    18   0  374m  63m 1832 S  1.3  6.2   0:00.43 httpd
15769 nobody    19   0  336m  59m 1700 S  0.0  5.9   0:00.29 httpd
15721 nobody    18   0  324m  59m 1732 S  1.0  5.9   0:00.29 httpd
15697 nobody    18   0  304m  59m 1692 S  0.0  5.8   0:00.46 httpd

iostat это:

Linux 2.6.18-164.15.1.el5 (hostname)   05/20/2011

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          21.93    0.33    4.91   12.03    0.00   60.79

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda              65.16      1069.51      1285.65   96981151  116580545
sda1              0.00         0.03         0.00       3023         31
sda2             18.59       444.95       159.37   40347535   14451402
sda3              7.15       129.47       113.45   11740498   10287608
sda4              0.00         0.00         0.00          6          0
sda5              1.25        12.88        44.49    1167658    4034632
sda6              3.92        11.25       525.79    1020250   47677744
sda7              5.56       108.71        96.29    9857739    8731832
sda8             28.70       362.20       346.25   32843994   31397296

Кажется, что в Mysql запущено много процессов (постоянно «Слишком много соединений»). Похоже, что ни один из моих сайтов не имеет слишком большого трафика, и я не вижу конкретных запросов, требующих больше, чем другие.

Не могли бы вы предложить способ отладки / решения этой ситуации?

Я предполагаю, что ваши проблемы с загрузкой связаны с чрезмерным использованием пространства подкачки из-за нехватки памяти. Как только ваши приложения израсходуют всю доступную оперативную память (1 ГБ), они начнут использовать пространство подкачки (используется 1,6 из 2 ГБ), что увеличит вашу нагрузку ввода-вывода (81,0% wa).

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

  • Уменьшите максимальное количество клиентов Apache, обычно с MaxClients. Имея всего 1 ГБ ОЗУ, вы, вероятно, захотите ограничить Apache использованием 500 МБ или меньше, что означает MaxClients может потребоваться всего 8 (500 МБ / 60 МБ на процесс = 8). Вы можете поиграть с этим числом, и если сервер начнет менять местами, уменьшите его и перезапустите Apache.
  • Возможно уменьшить использование памяти MySQL. Поскольку у вас есть только 1 ГБ оперативной памяти, вы можете ограничить использование MySQL. Судя по вашему верхнему результату, на данный момент все в порядке, но если он станет слишком большим, вам, возможно, придется поиграть с конфигурацией. «Правильный объем» оперативной памяти для MySQL зависит от вашей базы данных и приложения. Я мог бы дать тяжелому приложению db 500 МБ, но очень легкому - всего 50 МБ.
  • Следите за использованием памяти, какими бы ни были другие запущенные вами приложения. Наличие всего 1 ГБ на сервере LAMP ограничивает объем памяти, который вы можете выделить для всего, что, в конечном итоге, ограничит вашу емкость обслуживания.

Ожидание ввода-вывода очень высокое. Невозможно определить сверху и выводит iostat, что убивает диск. Я бы запустил iotop, чтобы узнать, сможете ли вы найти виновника ввода-вывода.

Также проверьте «показать полный список процессов» в MySQL, чтобы понять, какие запросы выполняются. Это может быть один или несколько запросов, мешающих работе.

Наконец, включите статус сервера в Apache и проверьте журналы доступа, чтобы получить представление о том, что Apache пытается сделать. Может, кто-то скребет снова и снова?

Следующее может указывать на то, что вас обрушивает один хост. Он должен отображать все текущие подключения к порту 80, упорядоченные по количеству

netstat -anp |awk '/:80/ {print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
Cpu(s):  4.2%us,  0.8%sy,  0.0%ni, 13.6%id, 81.0%wa,  0.0%hi,  0.3%si,  0.0%st

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

Я бы рекомендовал потратить некоторое время на изучение ситуации с вашим диском. Вероятно, вам потребуется добавить дополнительные шпиндели или более быстрые диски.

«Слишком много соединений» - означает, что вам нужно увеличить значение max_connections в конфигурации mysql. Это может быть результатом того, что многие процессы apache пытаются подключиться к серверу mysql и застревают в ожидании при достижении лимита max_connections mysql. Может быть, что сторона приложения не закрывает соединение должным образом, или вам, если это нормальная нагрузка, вам нужно увеличить лимиты. Я думаю, вам нужно отслеживать, откуда приходят mysql-соединения и как ваше приложение обрабатывает / закрывает mysql-соединения.

Всем спасибо за ответы. Все они были полезны и полезны.

Фактическим виновником на самом деле был cpanellogd - процесс, который cpanel запускает для ротации и создания статистики из журналов доступа.

Он был запланирован для работы только по ночам, но по какой-то причине он начинался в середине дня, когда у нас была наибольшая нагрузка.