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

apache порождает слишком много процессов, несмотря на maxclient и другие ограничения

Вот мои ограничения 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 не показывает? объясняет мою проблему.