Atualmente, temos alguns problemas com nosso servidor, nos quais, de forma intermitente, parecemos obter processos apache que simplesmente rodam e rodam, ocupando 100% da CPU.
Ao executar o topo, vemos o seguinte:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20788 www-data 20 0 318m 18m 3984 R 100 0.0 40:29.21 /usr/sbin/apache2 -k start
23523 www-data 20 0 319m 20m 4684 R 100 0.0 4:12.36 /usr/sbin/apache2 -k start
Quero tentar descobrir qual script (ou o que é) está causando isso, então tentei:
strace -p 20788
Mas isso não mostra nenhuma saída (deixei por cerca de 10 minutos e não mostra nada). Pelo meu entendimento, isso pode significar que ele está preso em um loop infinito e não há nenhuma "chamada do sistema" para mostrar.
Há mais alguma coisa que eu possa fazer para mostrar o que está acontecendo?
obrigado
Editar - Esqueci de mencionar, este é um servidor ativo com algumas centenas de usuários a qualquer momento! Portanto, não posso realmente tentar livremente alterar as opções de configuração e reiniciar o apache.
Edit 2 - O backtrace (bt) do gdb não parece ser tão útil quando o PHP não está configurado com --enable-debug - ele mostra apenas "execute ()", mas eu preciso saber o que é o script PHP realmente correndo .. existe alguma outra maneira?
#0 0x00007f6c143fb0c5 in ?? () from /usr/lib/apache2/modules/libphp5.so
#1 0x00007f6c143b040b in execute () from /usr/lib/apache2/modules/libphp5.so
#2 0x00007f6c1438b970 in zend_execute_scripts () from /usr/lib/apache2/modules/libphp5.so
#3 0x00007f6c14337fe3 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so
#4 0x00007f6c1441ae7d in ?? () from /usr/lib/apache2/modules/libphp5.so
#5 0x00007f6c18912508 in ap_run_handler ()
#6 0x00007f6c1891297e in ap_invoke_handler ()
#7 0x00007f6c18922570 in ap_process_request ()
#8 0x00007f6c1891f398 in ?? ()
#9 0x00007f6c18918fa8 in ap_run_process_connection ()
#10 0x00007f6c189271d0 in ?? ()
#11 0x00007f6c1892793a in ?? ()
#12 0x00007f6c189284e7 in ap_mpm_run ()
#13 0x00007f6c188fd4a4 in main ()
fonte
Respostas:
Bem, caso você esteja se sentindo corajoso:
gdb -p 20788
emita
bt
para ver o quadro da pilha, por exemploE BTW, há também
ltrace
para mencionar - tente também.UPD. : bem, ok, já que agora temos uma ideia de que o Apache está realmente executando alguma coisa, por que você não olhava para a
mod_status
saída - uma estendida ?fonte
ltrace
não mostrar qualquer saída também.curl domain.com/server-status > randomfile.html
- depois vi o arquivo. Acabou que era um código antigo de desenvolvedores que fica preso em um loop (arquivo PHP)! Tudo ordenado agora. Obrigado pela ajuda :)Uma abordagem muito fácil é usar
htop
. Você pode classificar os processos de alta CPU e usarstrace
um processolsof
ver os arquivos abertos de um processoltrace
.Descobri que pelo menos uma dessas opções encontra o script que gera a carga e, é claro, você pode usá-lo em um servidor Web de produção para depuração.
fonte
Você poderia tentar:
fonte
Seu comando deve funcionar desde que você faça uma solicitação HTTP que dispara esse PID.
Talvez você queira reconfigurar temporariamente o Apache com apenas um processo filho?
fonte
O PID dessa instância do apache é baixo, pode ser o pai de todo o lote. Isso certamente explicaria o alto uso da CPU (ele permanece por perto, outros são gerados e recuperados de acordo com a carga). Muito tempo acumulado da CPU pode significar que ele está em execução há muito tempo. Nenhuma saída
strace(1)
significa apenas que não houve chamadas do sistema. Sim, pode estar em um loop apertado, mas o apache é essencialmente E / S na rede, então acho que não está fazendo nada útil. Estranho 100% de uma CPU, em qualquer caso.fonte
Tente o seguinte:
1) Inicie um log com data / hora, script PHP e PID usando
getmypid()
2) Assista ao seu servidor com
top
3) Quando o processo apache estiver alto, procure a mesma data / hora e PID em seus logs. Você deve conseguir encontrar o script problemático.
fonte
mod_status
faz seu trabalho muito bem.