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
.
fonte
O que está acontecendo aqui é que você tem 25 threads capazes de aceitar conexões e está enviando 26 solicitações simultâneas. Essa última solicitação fica na fila do soquete, dependendo do tamanho da sua lista de pendências.
O segundo problema é que tudo o que você está executando, que leva de 2 a 3 segundos, está demorando o suficiente para responder que as 25 conexões simultâneas estão diminuindo a velocidade. sleep (1) pode funcionar, mas, algo em que você está travando arquivos ou travando tabelas do mysql, cada solicitação paralela pode estar aguardando a conclusão do processo antes de atingir o tempo limite de 45 segundos.
23mb parece pequeno para um processo apache com mod_php e quaisquer módulos carregados, então, suspeito que você possa estar vendo esses processos apache tendo um pouco mais de RAM à medida que seu aplicativo está sendo executado. Você não pode realmente fazer contas com o MaxClients e uma memória assim ... será um pouco próxima, mas você nunca sabe.
Há uma máquina, processos de 56 e 49 milhões.
outra máquina:
outra máquina:
Portanto, o uso da memória depende muito da tarefa, quais módulos são carregados etc. Nos últimos dois, acredito que desativamos o pdo & pdo_mysql, pois esse aplicativo não os utiliza.
A verdadeira questão é: o que você está fazendo e demorando 3 segundos? No mundo de hoje, isso é uma eternidade e é considerado um aplicativo 'bloqueador'. O Apache normalmente não morre, mas deixa esses encadeamentos na fila de pendências até que possa atendê-los ou o tempo limite das solicitações de espera. Acredito que seu aplicativo provavelmente esteja causando o tempo limite do apache. Experimente em uma página contendo apenas phpinfo (); e veja se os resultados são os mesmos.
fonte