Descobrir o alto processo de uso de CPU que o processo apache está realmente fazendo?

13

Atualmente, temos alguns problemas com nosso servidor, onde, aparentemente, obtemos processos do Apache que apenas são executados e executados, 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

Eu quero tentar descobrir qual script (ou o que quer que seja) 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 que entendi, isso pode significar que ele está preso em um loop infinito e não há "chamadas do sistema" para mostrar.

Há mais alguma coisa que eu possa fazer para mostrar o que está acontecendo?

Obrigado

Editar - Esqueceu de mencionar que este é um servidor ativo com algumas centenas de utilizadores ao mesmo tempo! Então, não posso simplesmente tentar mudar livremente as opções de configuração e reiniciar o apache.

Editar 2 - O backtrace (bt) do gdb não parece ser tão útil quando o PHP não está configurado com --enable-debug - ele só mostra "execute ()" , mas eu preciso saber qual script PHP está realmente rodando .. 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 ()
    
por BT643 13.03.2013 / 18:47

6 respostas

7

Bem, caso você esteja se sentindo corajoso:

gdb -p 20788

em seguida, emita bt para ver o quadro de pilha, para e. g.

E BTW, também há ltrace para mencionar - experimente também.

UPD. : bem, ok, já que agora temos uma ideia de que o Apache está realmente rodando alguma coisa, por que você não olharia para mod_status resultado - Estendido um?

    
por 13.03.2013 / 19:51
1

Você pode tentar:

  • iotop (mostrando a E / S no sistema)
  • netstat -t (mostrando conexões)
  • Dê uma olhada nos arquivos de log do apache e descubra o que o servidor fez
  • defina alguns RLimits para o processo do apache. Quando esses limites forem atingidos, o processo será eliminado, fornecendo mais algumas informações
por 13.03.2013 / 19:50
0

Seu comando deve funcionar desde que você faça uma solicitação HTTP que acione esse PID.

Talvez você queira temporariamente reconfigurar o Apache com apenas um processo filho?

    
por 13.03.2013 / 19:36
0

O PID dessa instância do apache é baixo, pode ser o pai de todo o lote. Isso certamente explicaria o alto uso de CPU (ele fica por perto, outros são gerados e recuperados de acordo com a carga). Muito tempo de CPU acumulado pode significar que ele está sendo executado há muito tempo. Nenhuma saída de strace(1) significa que não fez chamadas do sistema. Sim, pode estar em um loop apertado, mas o apache é essencialmente I / O sobre o 'net, então eu acho que não está fazendo nada útil. Estranho 100% de uma CPU, em qualquer caso.

    
por 13.03.2013 / 23:06
0

Tente isto:

1) Inicie um log com data / hora, script PHP e o PID usando getmypid()

2) Em seguida, assista ao seu servidor com top

3) Quando você vê o processo do apache indo alto, procure a mesma data / hora e PID em seus logs. Você deve ser capaz de encontrar o script problemático.

    
por 07.07.2015 / 00:43
0

Uma abordagem muito fácil é usar htop . Você pode classificar os altos processos da CPU e usar

  • s para strace de um processo
  • l para lsof para ver os arquivos abertos de um processo
  • L para ltrace .

Descobri que pelo menos uma dessas opções localiza o script que gera a carga e é claro que você pode usar isso em um servidor da web de produção para depurar.

    
por 29.07.2016 / 11:54