Como rastrear o alto processo de CPU do Apache para um virtualhost particular

4

Olhando para a saída de top , percebo que intermitentemente há um ou dois processos do Apache consumindo uma alta quantidade de CPU - em qualquer lugar entre 50% - 90%

Os picos no uso da CPU vão e vêm rapidamente a cada 10 segundos.

Existem vários outros processos do Apache em execução que consomem algo entre 2% - 4%

Eu pesquisei todas as várias maneiras de tentar descobrir qual virtualhost / website é responsável por esses processos. No entanto, como eles vêm e vão rapidamente, não consigo encontrar uma maneira confiável de fazer isso.

Eu tentei lsof e também observei a saída de server-status , mas como os processos não duram muito tempo, o ID do processo é reutilizado e não é possível vinculá-lo ao virtualhost que está causando a questão.

Por exemplo, se eu executar lsof no ID do processo em questão, ele listará uma dezena de arquivos de log virtuais diferentes que compartilharam esse ID de processo nos últimos segundos. Estou convencido de que há um virtualhost em falta, mas não consigo descobrir qual deles.

Também verifiquei o log de consultas lentas do MySQL e isso não revela nada de interessante.

    
por MrCarrot 08.04.2014 / 11:38

1 resposta

2

Minha recomendação: adicione tempo de resposta aos seus registros.

Não é perfeito, pois não há garantia de que as solicitações que causam o pico demorem mais tempo para serem veiculadas do que outras, mas é provável, e fornece um ponto de partida para a investigação.

Para fazer isso, você desejará definir um novo LogFormat e CustomLog que inclua o parâmetro% D. Veja a documentação do Apache mod_log_config .

Outra opção, provavelmente um pouco baixa, mas que pode dar uma idéia da natureza da carga, seria usar strf no processo pai do apache com -f para seguir os filhos, e -c mostrar o tempo do cpu por chamada, por exemplo strace -f -c -p <apache parent pid>

Depois de conhecer as chamadas do sistema que levam mais tempo, você poderá rastreá-las diretamente. Por exemplo, digamos que o servidor esteja gastando muito tempo fazendo write (), você poderia fazer strace -f -e trace=write -p <apache parent pid> e examinar essas chamadas com mais detalhes.

    
por 08.04.2014 / 11:49