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

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)?

Я что-то упускаю?

решение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 — нет?объясняет мою проблему.

Связанный контент