У меня есть выделенный сервер 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-сервер использовал пространство подкачки, поскольку, как вы заметили, это полностью снижает производительность сервера. Чтобы не использовать своп, вы должны ограничить использование памяти вашим приложением:
MaxClients
. Имея всего 1 ГБ ОЗУ, вы, вероятно, захотите ограничить Apache использованием 500 МБ или меньше, что означает MaxClients
может потребоваться всего 8 (500 МБ / 60 МБ на процесс = 8). Вы можете поиграть с этим числом, и если сервер начнет менять местами, уменьшите его и перезапустите Apache.Ожидание ввода-вывода очень высокое. Невозможно определить сверху и выводит 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 запускает для ротации и создания статистики из журналов доступа.
Он был запланирован для работы только по ночам, но по какой-то причине он начинался в середине дня, когда у нас была наибольшая нагрузка.