Вот мои ограничения MPM:
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 10
MaxClients 10
MaxRequestsPerChild 2000
</IfModule>
Однако, несмотря на это, у меня сейчас запущено более 20 процессов Apache, а за последний час или два их было около 40-50. Разве MaxClient и MaxSpareServers не должны держать количество процессов под контролем (т. е. около 10)?
Я что-то упускаю?
решение1
Apache выпускается в разных вариантах, два из которых наиболее распространены:префоркирабочий. Модель prefork порождает несколько процессов, но каждый процесс обрабатывает только один запрос за раз. С другой стороны, модель worker порождает несколько процессов, и каждый процесс имеет несколько потоков, каждый поток обрабатывает один запрос за раз.
В зависимости от вашего дистрибутива вы можете использовать другую модель, нежели та, которую вы ожидаете. Вы ожидаете prefork, но уверены ли вы, что это тот тип, который запущен? Чтобы узнать, введите:
$httpd -V Версия сервера: Apache/2.2.15 (Unix) Сервер создан: 28 мая 2010 07:58:25 Магический номер модуля сервера: 20051115:24 Сервер загружен: APR 1.4.2, APR-Util 1.3.9 Скомпилировано с использованием: APR 1.4.2, APR-Util 1.3.9 Архитектура: 32-битная MPM сервера: Prefork резьбовое: нет разветвление: да (переменное количество процессов)
В этом случае у меня Server MPM
так, Prefork
но у вас может быть по-другому. На моем сервере Debian с Apache2 это Worker
:
#/usr/sbin/apache2 -V Версия сервера: Apache/2.2.9 (Debian) MPM сервера: Рабочий
На некоторых машинах (например, RedHat) не редкость, когда присутствуют как prefork, так и worker-бинарные файлы (один вызывается, httpd
а другой вызывается httpd.worker
или что-то подобное). Вы можете перепроверить (используя ps
или top
или cat /etc/init.d/httpd
), какой из них на самом деле запускается.
решение2
Для тех, кто сталкивается с этим вопросом, есть еще одна потенциальная причина.
Я знаю, что вы считаете, что уже нашли ответ, но с prefork вы должны увидеть то же самое, как бы вы ни смотрели на его процессы. Вы, должно быть, не использовали prefork.
Вот почему:
http://httpd.apache.org/docs/2.4/mod/prefork.html
Этот многопроцессорный модуль (MPM) реализует непоточный веб-сервер с предварительным разветвлением.
Другое объяснение, с которым я столкнулся
Загрузка модуля prefork до параметров конфигурации работает, но если вы загружаете его после, то, похоже, вместо этого загружаются некоторые значения по умолчанию, что делает вашу директиву IfModule инертной. Скорее всего, вы увидите это только в настроенной конфигурации Apache, поскольку дистрибутивы должны правильно настроить его для запуска.
Работает- конфигурация применена
LoadModule mpm_prefork_module /usr/lib/apache2/modules/mod_mpm_prefork.so
<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 1
MaxSpareServers 0
ServerLimit 4
MaxClients 4
MaxRequestsPerChild 4000
</IfModule>
Не работает- конфигурация не имеет никакого эффекта
<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 1
MaxSpareServers 0
ServerLimit 4
MaxClients 4
MaxRequestsPerChild 4000
</IfModule>
LoadModule mpm_prefork_module /usr/lib/apache2/modules/mod_mpm_prefork.so
решение3
Сейчас я чувствую себя немного глупо, но вот что:Почему htop показывает много процессов apache2, а ps aux — нет?объясняет мою проблему.