depuração encadeada em apache / php no servidor de produção

4

Eu tenho um sistema Linux com o apache httpd e PHP que é carregado usando LoadModule php5_module /usr/lib/apache2/modules/libphp5.so .

Eu habilitei o módulo mod_status do apache e vejo um segmento específico que está preso fazendo algo desde ontem. Eu também confirmo isso fazendo ps -axu | grep apache , o que, entre os muitos tópicos, me dá esse segmento específico:

www-data  5636  0.0  0.1 423556 23560 ?      S    XXXXX   0:04 /usr/sbin/apache2 -k start

Note que XXXXX é algo como Jan02, que é ontem. Além disso, o pid (5636) corresponde ao pid do thread preso que vejo na página mod_status do apache.

A minha pergunta é: como posso fazer um despejo de thread ou algo similar para ver exatamente onde no código PHP esta coisa está presa? Talvez esteja esperando por algo (i / o, rede, db) mas eu não sei o quê.

No mundo do java, eu faço um kill -3 pid e obtenho um bom dump de thread legível, o que me mostraria exatamente onde exatamente aquele thread em particular estava preso. Existe uma técnica semelhante para a terra php?

    
por cherouvim 13.07.2016 / 12:41

2 respostas

2

As seguintes instruções são centradas no Linux:

  • Identifique o processo com falha / preso

No seu caso, o processo está no estado S , que significa man ps :

S sleep interrompível (esperando que um evento seja concluído)

Então, sim, provavelmente está aguardando que alguma operação de rede ou sistema de arquivos seja concluída.

  • Rastreie chamadas e sinais do sistema com strace

Anexe o programa strace ao encadeamento suspenso executando:

# strace -p 

Isso mostrará a você, em tempo real, as ações ou, mais precisamente, as syscalls executadas pelo programa, por exemplo, você poderá ver um loop com open() retornando um erro como ENOENT significa que um arquivo em particular não está lá.

Sua saída ps indica que o processo não está consumindo CPU (3ª coluna), portanto, o problema aqui provavelmente não está relacionado a um loop, mas apenas a uma operação de espera, como um arquivo bloqueado, aguardando um soquete ou um externo ação.

  • kill e coredumps

O programa kill , que é usado para enviar um sinal particular para um programa em execução está longe de ser relacionado ao java, ele pode muito bem ser usado para enviar o sinal 3 ( SIGQUIT ) que fechará o programa e gere um arquivo core . A geração de um arquivo core é permitida apenas se as permissões corretas de ulimit estiverem em vigor, verifique com o comando ulimit -c . Se ele diz 0 , você deve modificá-lo, por exemplo, para unlimited :

ulimit -c unlimited

Só então você deve reiniciar o aplicativo e provocar um coredump enviando um kill -3 .

    
por 08.08.2016 / 08:14
1

Você deseja instalar a extensão PHP xdebug e habilita o log de rastreamento . Em seguida, ele criará um arquivo, que terá estatísticas para cada função executada - o tempo necessário para concluir, a quantidade de memória consumida, o caminho para o arquivo que contém essa função, etc.

Esses dados ajudarão você a identificar qual função precisa ser corrigida, mas cuidado com o fato de que o log de rastreamento completo aumenta muito rapidamente e você pode querer rastrear apenas parte de seu aplicativo (que também é descrito no guia acima) ...

    
por 08.08.2016 / 08:37