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

Apache разветвляет очень большое количество потоков и зависает

Мы переместили один из наших сайтов на новый сервер, который время от времени полностью зависает. Сначала это происходило очень редко, может быть, раз в месяц, но теперь это стало происходить каждый день. Под зависаниями я подразумеваю, что время ожидания всех запросов истекло, и попытка apache2ctl status или apache2ctl graceful в оболочке приводит к бесконечному ожиданию apache2ctl. Только перезапуск apache2ctl выводит его из этого состояния. Кажется, я ничего не могу найти в журналах ошибок apache, журналы доступа указывают, что apache действительно не обслуживает запросы.

В настоящее время сервер в основном обслуживает один сайт, портал обмена файлами типа rapidshare, обслуживающий около 1 ТБ данных. Он работает под управлением ubuntu lucid, имеет 8 ГБ оперативной памяти и четырехъядерный процессор Intel xeon, с apache-mpm-itk и PHP 5.2.11.

На нем запущен munin, и когда apache зависает, он показывает очень большое количество потоков (650+). Обычное количество потоков составляет около 200, а примерно за 1 час оно увеличивается до 650. Запуск ps в этот раз показывает, что это действительно apache, у которого работает много детей. Загрузка ЦП / использование памяти не кажется проблемой, на данный момент используется только 1,1 ГБ ОЗУ, а загрузка составляет 0,05.

Мне сказали, что Lighttpd или nginx были бы гораздо лучшим решением для такого рода сайтов. Я готов переключиться, но лучше постараюсь заставить его работать с этой настройкой. (на старом сервере тоже был apache)

Был ли mpm-itk плохой идеей? Я в основном выбирал его из соображений безопасности, так как каждый виртуальный хост запускается под другим пользователем. Он работает в конфигурации по умолчанию, полученной из диспетчера пакетов, что плохо, я знаю, но я не уверен, какие значения мне следует настроить.

Я публикую некоторые значения, которые могут быть актуальными, при необходимости попросите еще что-нибудь:

Timeout 300
KeepAlive on
MaxKeepAliveRequests 100
KeepAliveTimeout 15

<IfModule mpm_prefork_module>
    StartServers          5   
    MinSpareServers       5   
    MaxSpareServers      10  
    MaxClients          150 
    MaxRequestsPerChild   0   
</IfModule>

Итак, на какие ценности я должен смотреть? Есть ли что-то конкретное, что я должен искать в журналах?

Если вам не нужна дополнительная безопасность, обеспечиваемая mpm-itk, используйте вместо нее mpm-worker, так как это больше легкий чем остальные. Вероятно, каждый виртуальный хост в конечном итоге запускается в рамках своего собственного процесса, что потребляет больше памяти.