Назад | Перейти на главную страницу

Apache порождает огромное количество процессов httpd

Я использую компьютер 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 для доступа к этой статистике. Видеть Вот и Вот Больше подробностей.