Perfil de memória PHP

95

Qual é uma boa maneira de traçar o perfil do uso de memória de uma página PHP? Por exemplo, para ver quanta memória meus dados estão usando e / ou quais chamadas de função estão alocando mais memória.

  • xdebug não parece fornecer informações de memória em seu recurso de criação de perfil.

  • xdebug faz fornecê-la em seu recurso de rastreamento. Isso é muito próximo do que eu quero, exceto que a grande quantidade de dados é opressora, pois mostra deltas de memória para cada chamada de função. Se fosse possível ocultar chamadas abaixo de uma certa profundidade, talvez com alguma ferramenta GUI, isso resolveria meu problema.

Mais alguma coisa?

JW.
fonte
Confira a palestra de Rasmus Lerdorf chamada "Simple is Hard" ( talks.php.net/show/froscon08 para slides, youtube.com/watch?v=RWRYX5eJbG0 para vídeos). Ele aborda várias ferramentas úteis, como "inclued" ( pecl.php.net/package/inclued ), xdebug e KCacheGrind.
TML
Eu encontrei um patch para xdebug , que fornece informações de memória nos perfis. Até agora está funcionando muito bem.
JW.
1
Como você disse, o xdebug fornece informações em rastreamentos de funções. Felizmente, eles também fornecem um script para interpretar isso. derickrethans.nl/xdebug-and-tracing-memory-usage.html Parece estar funcionando para mim até agora ...
Luke H

Respostas:

10

O Xdebug reimplementou o rastreamento de memória no 2.6 (2018-01-29) que pode ser usado no Qcachegrind ou ferramenta semelhante. Apenas certifique-se de selecionar a opção de memória :)

Dos documentos:

Desde o Xdebug 2.6, o criador de perfil também coleta informações sobre quanta memória está sendo usada e quais funções e métodos aumentam o uso de memória.

Não estou familiarizado com o formato do arquivo, mas seu Qcachegrind funcionou muito bem para mim no rastreamento de alguns problemas de memória.

amostra qcachegrind

SeanDowney
fonte
4
E eles até usaram meu ingresso. :)
JW.
O Xdebug abandonou o suporte para PHP 5 na versão 2.6.
powtac
Se isso ajudar alguém ... ao usar php-fpm, pid pode não mudar entre diferentes solicitações. Com profiler_output_name padrão, isso leva o xdebug a sobrescrever os dados anteriores. Alterar este valor usando algo mais do xdebug.org/docs/all_settings#trace_output_name
aligot
estou tentando usar qcachegrind agora e não entendo o que estou vendo. Não vejo números de memória em lugar nenhum. Quanta memória cada variável ocupa? Quero algo que possa rastrear a execução e mostrar a memória em cada ponto e quais variáveis ​​estão ocupando essa memória. Onde posso obter mais informações sobre isso?
john ktejik
72

Como você provavelmente sabe, o Xdebug abandonou o suporte a perfis de memória desde a versão 2. *. Pesquise a string "funções removidas" aqui: http://www.xdebug.org/updates.php

Funções removidas

Removido o suporte para perfis de memória, pois não funcionava corretamente.

Tentei outra ferramenta e funcionou bem para mim.

https://github.com/arnaud-lb/php-memory-profiler

Isso é o que fiz no meu servidor Ubuntu para ativá-lo:

sudo apt-get install libjudy-dev libjudydebian1
sudo pecl install memprof
echo "extension=memprof.so" > /etc/php5/mods-available/memprof.ini
sudo php5enmod memprof
service apache2 restart

E então no meu código:

<?php

memprof_enable();

// do your stuff

memprof_dump_callgrind(fopen("/tmp/callgrind.out", "w"));

Finalmente abra o callgrind.outarquivo com o KCachegrind

Usando Google gperftools (recomendado!)

Em primeiro lugar, instale o Google gperftools baixando o pacote mais recente aqui: https://code.google.com/p/gperftools/

Então, como sempre:

sudo apt-get update
sudo apt-get install libunwind-dev -y
./configure
make
make install

Agora em seu código:

memprof_enable();

// do your magic

memprof_dump_pprof(fopen("/tmp/profile.heap", "w"));

Em seguida, abra seu terminal e execute:

pprof --web /tmp/profile.heap

pprof criará uma nova janela em sua sessão de navegador existente com algo como mostrado abaixo:

Perfil de memória PHP com memprof e gperftools

Xhprof + Xhgui (o melhor na minha opinião para o perfil de CPU e memória)

Com Xhprof e Xhgui você também pode traçar o perfil do uso da CPU ou apenas do uso da memória, se esse for o seu problema no momento. É uma solução muito completa, dá-lhe total controlo e os logs podem ser escritos tanto no mongo como no sistema de ficheiros.

Para mais detalhes veja minha resposta aqui .

Fogo Preto

Blackfire é um profiler PHP da SensioLabs, os caras do Symfony2 https://blackfire.io/

Se você usar o fantoche para configurar sua máquina virtual, ficará feliz em saber que é compatível ;-)

Francesco Casula
fonte
Como você fez isso funcionar? Tentei colocar memprof_enableem meu código PHP e consegui PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable(). Eu fiz gperftools make install do código-fonte atual deles.
Andrey Pokhilko
Execute a php -ino cli ou a phpinfo()para ver se você está carregando a extensão corretamente. Se você não o tiver, provavelmente vale a pena dar uma olhada em seus *.iniarquivos.
Francesco Casula
5
Nota: a versão mais recente suporta apenas php7. Se você usa php5, instale com sudo pecl install memprof-1.0.0.
Djizeus
18

Bem, isso pode não ser exatamente o que você está procurando, mas o PHP tem algumas funções embutidas que resultarão no uso de memória. Se você quiser apenas ver quanta memória uma chamada de função está usando, você pode usar memory_get_peak_usage () antes e depois de uma chamada e tirar a diferença.

Você usa a mesma técnica em torno de seus dados usando um memory_get_usage () muito semelhante .

Abordagem pouco sofisticada, mas é uma maneira rápida de verificar um trecho de código. Eu concordo que xdebug mem deltas pode ser muito prolixo para ser útil às vezes, então geralmente eu apenas o uso para restringir a uma seção de código e, em seguida, despejo o uso de memória específico para pequenos pedaços manualmente.

zumbat
fonte
0

http://geek.michaelgrace.org/2012/04/tracing-php-memory-usage-using-xdebug-and-mamp-on-mac/

Estou em um Mac, então se você estiver no Windows, terá que testar isso, mas funciona para mim.

Modifiquei meu arquivo tracefile-analyser.php e adicionei o caminho para o binário PHP no topo para que você pudesse chamá-lo no terminal como um script unix normal.

#!/Applications/MAMP/bin/php5.3/bin/php
<?php
if ( $argc <= 1 || $argc > 4 )
{

Não se esqueça de fazer o chmod desse arquivo para 755.

Você pode criar facilmente um script de watchr ruby ​​para chamar automaticamente o script cada vez que ele cria um arquivo de perfil de memória (* .xt). Dessa forma, você pode continuar testando e vendo suas melhorias sem ter que executar o comando repetidamente.

2upmedia
fonte