Высокая нагрузка на сервер
У меня есть выделенный сервер 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.