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

У меня есть выделенный сервер 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

иостат это:

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, кажется, имеет много запущенных процессов (постоянно находится в состоянии "слишком много соединений"). Похоже, что ни на одном из моих сайтов не было слишком много трафика, и я не вижу конкретных запросов, требующих больше, чем другие.

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

5 ответов

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

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

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

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

Также проверьте "показать полный список процессов" в 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? Это твоя проблема. Вы испытываете очень высокую конкуренцию ввода-вывода, и у вас есть множество процессов, которые сидят в очереди планировщика и ожидают ввода-вывода диска.

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

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

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

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

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

Другие вопросы по тегам