Моя установка: у меня есть 3 почти идентичных машины веб-сервера, обслуживающих один и тот же высоконагруженный динамический веб-сайт с простой балансировкой нагрузки по DNS. Сервис работает уже более двух лет с одной и той же конфигурацией apache: apache2, php5, ubuntu 8.04 linux 2.6.24-29-server.
Моя проблема: Примерно две недели назад у меня возникли проблемы с этим конфигом. Почти каждый день у меня есть один маленький момент в течение 5 минут, в течение которого сайт недоступен. Я все еще могу войти на сервер через SSH. Если я бегу htop
, я вижу, что машина просто ничего не делает. У меня работает около 1000 процессов Apache, но нет активности процессора.
Я использовал apache mod_status для отладки этой ситуации. Табло процесса выглядит так:
_C.___K_______________________R._______.__K_K____K___C_______.__
_______C__________.___________________________________.________C
_.____K__________K___K_WK_____._K_____________________________._
W______K__________K________.____________________._______C_______
_C_.__K__K____.._.._____________________________________C_______
_R___________K___.______C________.C_________.______._____C______
____________KKC____K_____K__WC_________________C_____.__.____.__
_____________________C_________K______.____C______._____________
_.___C____.___.___________________________.K______.____K________
W__.___________________C.__.____K________K_______R_._.__._______
__C__C_.__________C__C_______._____W______________C_.___C_______
____.______C_____________C________.____C____________.________._K
__.__________.K_____________K_________._____C____.K__________KW_
__K.W________R_________._______.___W___________.____.__K_____W__
W___.___..________W____K
Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process
Таким образом, большинство процессов просто ждут подключения. Примерно через 5 минут ситуация вернется к норме: на каждой машине у меня будет наименьшее количество процессов, большинство работников имеют статус "." (это означает, что они открыты для обработки запроса) и, конечно, сайт доступен!
так что я пытаюсь найти что-то в журналах, но просто ничего нет ... журнал доступа apache молчит около 4 минут, то же самое относится и к журналу ошибок. Я также не могу понять, что-то не так в других системных журналах.
Ситуация одинакова на всех 3 веб-серверах (все они имеют пиковую нагрузку и одновременно не отвечают), поэтому я не думаю, что это связано с аппаратным обеспечением. но я думаю, это может быть связано с какой-то проблемой сети (tcp).
Любые идеи?
РЕДАКТИРОВАТЬ: еще немного информации, которую я только что обнаружил:
Это случилось снова, и я смог проверить, что я также не могу подключиться локально, когда возникает эта проблема.
Я сделал некоторые статистические данные о соединении с помощью следующей команды: netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
- 109 CLOSE_WAIT
- 2652 УСТАНОВЛЕНО
- 2 FIN_WAIT1
- 11 LAST_ACK
- 12 СЛУШАТЬ
- 91 SYN_RECV
- 1 SYN_SENT
- 16 TIME_WAIT
Если я выполню ту же команду через некоторое время, у меня будет что-то вроде этого:
- 4 ЗАКРЫТИЕ
- 108 УСТАНОВЛЕНО
- 18 FIN_WAIT1
- 182 FIN_WAIT2
- 37 LAST_ACK
- 12 СЛУШАТЬ
- 50 SYN_RECV
- 11276 TIME_WAIT
Таким образом, в обычной ситуации у меня только 100-200 открытых подключений клиентами, обрабатываемыми apache в данный момент. Когда у меня происходит этот «сбой», у меня намного больше связей. Каков наилучший способ проанализировать это?
EDIT2: важные строки в apache2.conf:
KeepAlive On
MaxKeepAliveRequests 20
KeepAliveTimeout 1
<IfModule mpm_prefork_module>
ServerLimit 920
StartServers 30
MinSpareServers 80
MaxSpareServers 120
MaxClients 920
MaxRequestsPerChild 700
</IfModule>
Это предварительная ветка apache2 с php_mod.
Сервер имеет оперативную память 8 ГБ и раздел подкачки 4 ГБ.
tcpdump
) поможет вам понять причину проблемы ... кстати, каковы ваши правила использования памяти и брандмауэра?