Estou executando uma máquina CentOS 6.7 (16 GB vRAM, 8 vCPUs) com uma configuração de servidor web simples (Apache / 2.2.15, PHP / 5.3.3, MySQL / 5.1.66), hospedando uma loja on-line com um número moderado de impressões de páginas (cerca de 2.000 a 4.000 por dia).
O servidor funcionou sem problemas nos últimos 3 anos sem qualquer necessidade de alterar sua configuração. Agora, desde a semana passada - de alguma forma durante a noite - o Apache / HTTP torna-se recorrentemente inacessível após um curto período de tempo (cerca de 30 minutos). Eu verifiquei alguns parâmetros e vi que há muitos processos httpd em execução. ps axf | grep httpd | wc
mostra algo assim:
387 2344 18354
Considerando que a carga não é muito excitante. top
é assim:
Um número muito pequeno de processos httpd é liberado novamente de tempos em tempos, mas o número total continua aumentando constantemente. Se eu executar um service httpd reload
, o número de processos cai para 0 e começa a aumentar novamente nos próximos minutos a horas. Depois de um tempo, o log do Apache me diz:
[error] server reached MaxClients setting, consider raising the MaxClients setting
Eu fiz isso e também ajustei diferentes configurações adicionais, mas isso não ajudou. Não importa qual valor MaxClients
e ServerLimit
estejam definidos, o Apache não irá parar para gerar novos processos httpd até esses limites. Depois disso, o site não está mais acessível.
Não houve aumento nos hits de página de acordo com o AWStats. Além disso, não houve uma única alteração no aplicativo PHP. Além da discriminação que bloqueia todas as solicitações após 30 minutos, o site funciona rápido como de costume. Como uma solução temporária suja e temporária, Cron continua recarregando o Apache a cada meia hora.
As configurações do Prefork / Worker foram as seguintes nos últimos 3 anos:
<IfModule prefork.c>
StartServers 4
MinSpareServers 5
MaxSpareServers 10
ServerLimit 128
MaxClients 128
MaxRequestsPerChild 600
</IfModule>
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
Eu os levantei para:
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 10
ServerLimit 640
MaxClients 640
MaxRequestsPerChild 1000
</IfModule>
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
Após essa alteração, o Apache / HTTP ficou indisponível após cerca de 1 hora.
Como isso pode acontecer de repente e quais opções eu tenho que investigar mais de onde esse comportamento estranho se origina?