У меня есть выделенный сервер 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 запущено много процессов (постоянно находится в состоянии «Слишком много соединений»). Ни один из у моих сайтов слишком много трафика, и я не вижу конкретных запросов, требующих больше, чем другие.
Не могли бы вы предложить способ отладки / решения этой ситуации?
Я предположил бы Вашу основу проблем загрузки от Вашего чрезмерного использования области подкачки из-за исчерпывания памяти. Как только Ваши приложения израсходовали всю доступную RAM (1 ГБ), они собираются начать использовать область подкачки (1.6 из используемой 2GB), который увеличит Вашу загрузку IO (81.0%wa).
Вы почти никогда не хотите, чтобы Ваш сервер ЛАМПЫ должен был использовать область подкачки как, как Вы заметили, это полностью наносит вред производительности сервера. Для не использования подкачки, необходимо ограничить использование памяти приложения:
MaxClients
. Только с 1 ГБ RAM Вы, вероятно, хотите ограничить Apache использованием 500 МБ или меньше что означает a MaxClients
только из 8 может быть необходим (500MB/60MB для каждого процесса = 8). Можно играть с этим числом и если сервер начинает подкачивать, уменьшают его и перезапускают Apache.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
? Это - Ваша проблема. Вы испытываете очень высокую конкуренцию IO, и у Вас есть много процессов, сидящих без дела в очереди планировщика, ожидающей диска IO для случая.
Я рекомендовал бы провести некоторое время, исследовав Вашу дисковую ситуацию. Вероятно, что необходимо добавить дополнительные шпиндели или более быстрые диски.
Ожидание IO супер высоко. Не возможно определить от вершины и iostat выводов, что уничтожает диск. Я выполнил бы iotop, чтобы видеть, можно ли найти преступника IO.
Также проверьте "шоу полный processlist" в MySQL для понимания то, что выполняют запросы. Это могли быть один или несколько запросов, срывающих вещи.
Наконец, включенное состояние сервера в Apache и доступе проверки регистрируется для получения представления в то, что Apache пытается сделать. Возможно, кто-то очищает много раз?
Следующее может указать, становитесь ли Вы хлопнувшими одним хостом. Это должно отобразить все текущие соединения с портом 80 заказанных количеством
netstat -anp |awk '/:80/ {print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
"Слишком много соединений" - означают, что Вы должны увеличить значение max_connections в конфигурации mysql. Это может быть результат многих апачских процессов, пытающихся соединяться с mysql сервером и застрявшим ожиданием, когда достигают mysql max_connections предел. Может быть то, что сторона приложения не закрывает соединение правильно или Вас, если это - нормальная нагрузка, Вы должны увеличить пределы. Я думаю, что необходимо контролировать где подключения mysql, прибывающие из, и как подключения mysql дескриптора/завершения приложения.
Спасибо всем за ответы. Они были все допустимы и полезны.
Фактический преступник был на самом деле cpanellogd
- процесс, который cpanel выполняет, чтобы повернуть и создать статистику из журналов доступа.
Это, как планировали, будет работать только ночами, но по некоторым причинам это запускалось в середине дня, когда у нас есть большая часть загрузки.