Aqui estão minhas restrições de MPM:
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 10
MaxClients 10
MaxRequestsPerChild 2000
</IfModule>
No entanto, apesar disso, tenho mais de 20 processos Apache em execução atualmente e, nas últimas uma ou duas horas, ocorreram de 40 a 50. O MaxClient e o MaxSpareServers não deveriam manter o número de processos sob controle (ou seja, cerca de 10)?
Tem algo que estou perdendo?
Responder1
Apache vem em diferentes sabores, sendo dois dos mais comunspré-garfoetrabalhador. O modelo prefork gera vários processos, mas cada processo trata apenas uma solicitação por vez. O modelo de trabalho, por outro lado, gera vários processos e cada processo possui vários threads, cada thread lidando com uma solicitação por vez.
Dependendo da sua distribuição, você pode estar executando um modelo diferente daquele que espera. Você está esperando um pré-fork, mas tem certeza de que este é o tipo que está sendo executado? Para descobrir digite:
$httpd-V Versão do servidor: Apache/2.2.15 (Unix) Servidor construído: 28 de maio de 2010 07:58:25 Número Mágico do Módulo do Servidor: 20051115:24 Servidor carregado: APR 1.4.2, APR-Util 1.3.9 Compilado usando: APR 1.4.2, APR-Util 1.3.9 Arquitetura: 32 bits Servidor MPM: Pré-fork rosqueado: não bifurcado: sim (contagem de processos variáveis)
Neste caso, o meu Server MPM
é Prefork
, mas o seu pode ser diferente. No meu servidor Debian rodando Apache2 é Worker
:
#/usr/sbin/apache2 -V Versão do servidor: Apache/2.2.9 (Debian) Servidor MPM: Trabalhador
Em algumas máquinas (como RedHat) não é incomum a presença de binários prefork e de trabalho (um chamado httpd
e outro chamado httpd.worker
ou algo semelhante). Você pode querer verificar novamente (usando ps
ou top
ou cat /etc/init.d/httpd
) qual está realmente sendo iniciado.
Responder2
Para qualquer outra pessoa que se depare com esta questão, há outra causa potencial.
Eu sei que você acredita que já encontrou sua resposta, mas com o prefork você deve ver a mesma coisa de qualquer maneira que olhar para seus processos. Você não deve estar usando o pré-garfo.
Isso é por que:
http://httpd.apache.org/docs/2.4/mod/prefork.html
Este Módulo de Multiprocessamento (MPM) implementa um servidor web sem thread e pré-bifurcado.
Uma explicação diferente que encontrei
Carregar o módulo prefork antes que as opções de configuração funcionem, mas se você carregá-lo depois, parece carregar alguns padrões, tornando sua diretiva IfModule inerte. Você provavelmente verá isso apenas em uma configuração personalizada do Apache, já que as distribuições o configurariam corretamente para iniciar.
Funciona- a configuração é aplicada
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>
Não funciona- a configuração não tem efeito
<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
Responder3
Eu me sinto meio estúpido agora, mas isso:Por que o htop mostra muitos processos do Apache2 por ps aux, não?explica meu problema.