O Apache bifurca um número muito alto de threads e trava

2

Mudamos um dos nossos sites para um novo servidor, que de vez em quando trava completamente. No começo, isso acontecia muito raramente, talvez uma vez por mês, mas agora está começando a acontecer todos os dias. Por travamentos, quero dizer que todos os pedidos terminam, e tentando o status apache2ctl, ou apache2ctl gracioso em um shell resulta no apache2ctl esperando indefinidamente. Apenas a emissão de uma reinicialização apache2ctl a expulsa desse estado. Não consigo encontrar nada nos logs de erro do apache, os logs de acesso indicam que o apache não está atendendo solicitações.

Atualmente, o servidor serve principalmente um único site, um portal de compartilhamento de arquivos semelhante ao rapidshare, que atende cerca de 1 TB de dados. Ele está rodando o ubuntu lúcido, tem 8GB de ram e um processador Intel xeon quad core, com apache-mpm-itk e PHP 5.2.11.

Ele tem o Munin rodando nele, e nos momentos em que o apache está pendurado, ele mostra um número muito alto de threads (650+). O número usual de threads é de aproximadamente ~ 200 e vai para 650 em aproximadamente 1 hora. Executar o ps neste momento revela que é realmente o apache que tem muitos filhos correndo. O uso de carga / memória da CPU não parece ser um problema, no momento ele está usando apenas 1,1 GB de RAM e a carga é de 0,05.

Foi-me dito que o Lighttpd, ou nginx, teria sido uma solução muito melhor para este tipo de site. Estou disposto a mudar, mas prefiro tentar e fazer com que funcione com essa configuração. (o servidor antigo também estava executando o apache)

O mpm-itk foi uma má ideia? Eu escolhi principalmente para a segurança de ter cada virtualhost executado sob um usuário diferente. Ele está sendo executado na configuração padrão extraída do gerenciador de pacotes, o que é ruim, eu sei, mas não tenho certeza de quais valores devo ajustar.

Estou postando alguns valores que podem ser relevantes, por favor, peça qualquer outra coisa, se necessário:

Timeout 300
KeepAlive on
MaxKeepAliveRequests 100
KeepAliveTimeout 15

<IfModule mpm_prefork_module>
    StartServers          5   
    MinSpareServers       5   
    MaxSpareServers      10  
    MaxClients          150 
    MaxRequestsPerChild   0   
</IfModule>

Então, quais valores devo estar olhando? Existe alguma coisa em particular que eu deva fazer para os logs?

    
por K. Norbert 14.07.2010 / 10:59

1 resposta

1

Se você não precisa da segurança extra fornecida pelo mpm-itk, use o mpm-worker no lugar, pois é mais leve do que o resto. É concebível que cada host virtual acabe sendo executado dentro de seu próprio processo, o que consumiria mais memória.

    
por 14.07.2010 / 13:31