Atualmente, tenho um servidor Apache2 em execução com mpm-prefork
e mod_php
em um OpenVZ VPS com 512M de RAM real / 1024M que pode ser estourada (sem troca). Depois de executar alguns testes, descobri que o tamanho máximo do processo que o Apache obtém é 23M, então configurei MaxClients
para 25 (23M x 25 = 575 MB, ok para mim). Decidi executar alguns testes de carga no meu servidor, e os resultados me deixaram perplexo.
Estou usando ab
na minha máquina desktop solicitando a página principal de um blog wordpress.
Quando corro ab
com 24 conexões simultâneas, tudo parece bem. Claro, a CPU aumenta, a RAM livre diminui e o resultado é de cerca de 2-3s em tempo de resposta por solicitação.
Mas se eu rodar ab
com 25 conexões simultâneas (limite do meu servidor), o Apache travará após alguns segundos. Ele inicia o processamento das solicitações e, em seguida, para de responder, a CPU volta para 100% ociosa e atinge o ab
tempo limite. O log do Apache diz que foi atingido MaxClients
.
Quando isso acontece, o Apache se mantém bloqueado com 25 processos em execução (todos eles estão em "W" se eu verificar o status do servidor) e somente após a TimeOut
configuração os processos começam a morrer e o servidor começa a responder novamente (no meu caso, está definido 45).
Minha pergunta: esse comportamento é esperado? Por que o Apache morre quando chega MaxClients
? Se funciona com 24 conexões, não deve funcionar com 25, demorando talvez mais tempo para responder a cada solicitação e enfileirar o resto?
Parece-me meio estranho que qualquer criança correndo ab
sozinha possa matar um servidor da Web apenas configurando as conexões simultâneas com os servidores MaxClients
.