Apache gerando um número enorme de processos httpd

3

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?

    
por proximus 25.04.2016 / 17:07

1 resposta

2

Punho, aumentando os parâmetros pré-fabricados só vai piorar sua situação. Então restaure a configuração anterior.

Para descartar qualquer problema / configuração do prefork, tente desativá-lo. A situação muda significativamente? Se assim for, você encontra o seu problema.

Se não, o problema está relacionado a fatores externos: por exemplo, talvez algum bot / script esteja direcionando seu site, abrindo muitas conexões (com o processo relativo do httpd). Se este for o caso, você deve conseguir ver isso nos arquivos de log do Apache.

Se isso não for suficiente, você pode ativar o módulo mod_status para mostrar estatísticas detalhadas. Em seguida, emita apachectl fullstatus para acessar essas estatísticas. Veja aqui e aqui para mais detalhes.

    
por 25.04.2016 / 19:14