Я использую компьютер CentOS 6.7 (16 ГБ vRAM, 8 vCPU) с простой настройкой веб-сервера (Apache / 2.2.15, PHP / 5.3.3, MySQL / 5.1.66), на котором размещен интернет-магазин с умеренным количеством количество показов страницы (около 2 000 ~ 4 000 в день).
Сервер работал без сбоев в течение последних 3 лет без необходимости изменения его конфигурации. Теперь, с прошлой недели - как-то в одночасье - Apache / HTTP периодически становится недоступным через короткий промежуток времени (около 30 минут). Я проверил некоторые параметры и увидел, что запущено много процессов httpd. ps axf | grep httpd | wc
показывает что-то вроде этого:
387 2344 18354
Тогда как нагрузка не очень захватывающая. top
выглядит так:
Время от времени снова запускается очень небольшое количество процессов httpd, но их общее количество почти постоянно увеличивается. Если я запустил service httpd reload
, количество процессов снова падает до 0 и снова начинает увеличиваться в течение следующих нескольких минут или часов. Через некоторое время журнал Apache сообщает мне:
[error] server reached MaxClients setting, consider raising the MaxClients setting
Я сделал это, а также изменил другие параметры конфигурации, но это не помогло. Независимо от того, какое значение MaxClients
и ServerLimit
установлены на, Apache не прекратит запускать новые процессы httpd до этих пределов. После этого сайт больше не будет доступен.
По данным AWStats, увеличения количества обращений к страницам не произошло. Более того, в приложении PHP не было ни одного изменения. За исключением того, что все запросы блокируются через 30 минут, сайт работает быстро, как обычно. В качестве грязного и временного обходного пути Cron продолжает перезагружать Apache каждые полчаса.
Настройки Prefork / Worker за последние 3 года были следующими:
<IfModule prefork.c>
StartServers 4
MinSpareServers 5
MaxSpareServers 10
ServerLimit 128
MaxClients 128
MaxRequestsPerChild 600
</IfModule>
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
Я поднял их до:
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 10
ServerLimit 640
MaxClients 640
MaxRequestsPerChild 1000
</IfModule>
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
После этого изменения Apache / HTTP стал недоступен примерно через 1 час.
Как это может произойти внезапно и какие варианты у меня есть, чтобы выяснить, откуда взялось это странное поведение?
Во-первых, увеличение параметров предварительной вилки только ухудшит ваше положение. Так что восстановите предыдущую конфигурацию.
Чтобы исключить какие-либо проблемы с предварительной вилкой / неправильную конфигурацию, попробуйте отключить ее. Ситуация существенно меняется? Если да, то вы нашли свою проблему.
В противном случае проблема связана с внешними факторами: например, возможно, какой-то бот / скрипт нацеливается на ваш веб-сайт, открывая множество соединений (с относительным процессом httpd). Если это так, вы должны увидеть это в файлах журнала Apache.
Если этого недостаточно, вы можете включить mod_status
модуль для отображения подробной статистики. Затем выдайте apachectl fullstatus
для доступа к этой статистике. Видеть Вот и Вот Больше подробностей.