Вот мои ограничения MPM:
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 10
MaxClients 10
MaxRequestsPerChild 2000
</IfModule>
Однако, несмотря на это, в настоящее время у меня работает более 20 процессов apache, а за последние час или два их было 40-50. Разве MaxClient и MaxSpareServers не должны держать под контролем количество процессов (т.е. около 10)?
Что-то мне не хватает?
Apache бывает разных видов, два из наиболее распространенных: Prefork и рабочий. Модель prefork порождает несколько процессов, но каждый процесс обрабатывает только один запрос за раз. С другой стороны, рабочая модель порождает несколько процессов, и каждый процесс имеет несколько потоков, каждый из которых обрабатывает один запрос за раз.
В зависимости от вашего дистрибутива вы можете использовать модель, отличную от той, которую вы ожидаете. Вы ожидаете prefork, но уверены ли вы, что это тот тип, который работает? Чтобы узнать введите:
$ httpd -V Server version: Apache/2.2.15 (Unix) Server built: May 28 2010 07:58:25 Server's Module Magic Number: 20051115:24 Server loaded: APR 1.4.2, APR-Util 1.3.9 Compiled using: APR 1.4.2, APR-Util 1.3.9 Architecture: 32-bit Server MPM: Prefork threaded: no forked: yes (variable process count)
В этом случае мой Server MPM
является Prefork
но ваш может быть другим. На моем сервере Debian с Apache2 это Worker
:
# / usr / sbin / apache2 -V Server version: Apache/2.2.9 (Debian) Server MPM: Worker
На некоторых машинах (таких как RedHat) нередко присутствуют как предварительные, так и рабочие двоичные файлы (один называется httpd
а другой позвонил httpd.worker
или что-то подобное). Вы можете перепроверить (используя ps
или top
или cat /etc/init.d/httpd
), который фактически запускается.
У любого, кто сталкивается с этим вопросом, есть еще одна потенциальная причина.
Я знаю, что вы верите, что уже нашли свой ответ, но с 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
Сейчас я чувствую себя глупо, но вот это: Почему htop показывает множество процессов apache2, а ps aux не показывает? объясняет мою проблему.