Profilazione della memoria PHP


95

Qual è un buon modo per profilare l'utilizzo della memoria di una pagina PHP? Ad esempio, per vedere quanta memoria stanno utilizzando i miei dati e / o quali chiamate di funzione stanno allocando più memoria.

  • xdebug non sembra fornire informazioni sulla memoria nella sua funzione di profilazione.

  • xdebug lo fornisce nella sua funzione di tracciamento. Questo è abbastanza vicino a quello che voglio, tranne che l'enorme quantità di dati è travolgente, poiché mostra i delta di memoria per ogni singola chiamata di funzione. Se fosse possibile nascondere le chiamate al di sotto di una certa profondità, magari con qualche strumento GUI, risolverebbe il mio problema.

C'è niente altro?


Guarda il discorso di Rasmus Lerdorf intitolato "Simple is Hard" ( talks.php.net/show/froscon08 per le diapositive, youtube.com/watch?v=RWRYX5eJbG0 per il video). Esamina molti strumenti utili come "inclued" ( pecl.php.net/package/inclued ), xdebug e KCacheGrind.
TML

Ho trovato una patch per xdebug , che fornisce informazioni sulla memoria nei profili. Finora funziona molto bene.
JW.

1
Come dici tu, xdebug fornisce informazioni nelle tracce delle funzioni. Fortunatamente, forniscono anche uno script per interpretarlo. derickrethans.nl/xdebug-and-tracing-memory-usage.html Sembra funzionare per me finora ...
Luke H

Risposte:


10

Xdebug ha reimplementato il tracciamento della memoria in 2.6 (2018-01-29) che può essere utilizzato in Qcachegrind o uno strumento simile. Basta assicurarsi di selezionare l'opzione di memoria :)

Dai documenti:

A partire da Xdebug 2.6, il profiler raccoglie anche informazioni sulla quantità di memoria utilizzata e su quali funzioni e metodi Gnd aumentano l'utilizzo della memoria.

Non ho familiarità con il formato del file, ma Qcachegrind ha funzionato alla grande per me nel tracciare un paio di problemi di memoria.

qcachegrind campione


4
E hanno persino usato il mio biglietto. :)
JW.

Xdebug ha abbandonato il supporto per PHP 5 nella versione 2.6.
powtac

Se aiuta qualcuno ... quando si usa php-fpm, pid potrebbe non cambiare tra le diverse richieste. Con il nome_output_profiler predefinito, questo porta xdebug a sovrascrivere i dati precedenti. Modifica questo valore utilizzando qualcos'altro da xdebug.org/docs/all_settings#trace_output_name
aligot

Sto provando a usare qcachegrind ora e non capisco cosa sto guardando. Non vedo i numeri di memoria da nessuna parte. Quanta memoria occupa ciascuna variabile? Voglio qualcosa che possa tracciare l'esecuzione e mostrare la memoria in ogni punto e quali variabili occupano quella memoria. Dove posso ottenere maggiori informazioni su questo?
john ktejik

72

Come probabilmente saprai, Xdebug ha abbandonato il supporto per i profili di memoria dalla versione 2. *. Cerca la stringa "funzioni rimosse" qui: http://www.xdebug.org/updates.php

Funzioni rimosse

Rimosso il supporto per la profilazione della memoria in quanto non funzionava correttamente.

Quindi ho provato un altro strumento e ha funzionato bene per me.

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

Questo è quello che ho fatto sul mio server Ubuntu per abilitarlo:

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 poi nel mio codice:

<?php

memprof_enable();

// do your stuff

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

Infine apri il callgrind.outfile con KCachegrind

Utilizzo di Google gperftools (consigliato!)

Prima di tutto installa Google gperftools scaricando l'ultimo pacchetto qui: https://code.google.com/p/gperftools/

Quindi come sempre:

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

Ora nel tuo codice:

memprof_enable();

// do your magic

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

Quindi apri il tuo terminale e avvia:

pprof --web /tmp/profile.heap

pprof creerà una nuova finestra nella sessione del browser esistente con qualcosa come mostrato di seguito:

Profilazione della memoria PHP con memprof e gperftools

Xhprof + Xhgui (il migliore secondo me per profilare sia cpu che memoria)

Con Xhprof e Xhgui puoi anche profilare l'utilizzo della CPU o solo l'utilizzo della memoria se questo è il tuo problema al momento. È una soluzione molto completa, ti dà il pieno controllo ei log possono essere scritti sia su mongo che nel filesystem.

Per maggiori dettagli vedere la mia risposta qui .

Fuoco nero

Blackfire è un profiler PHP di SensioLabs, i ragazzi di Symfony2 https://blackfire.io/

Se usi puphpet per configurare la tua macchina virtuale sarai felice di sapere che è supportato ;-)


Come hai fatto a farlo funzionare? Ho provato a inserire il memprof_enablemio codice PHP e ottengo PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable(). Ho fatto gperftools installarli dal codice sorgente corrente.
Andrey Pokhilko

Esegui a php -isulla cli o a phpinfo()per vedere se l'estensione viene caricata correttamente. Se non ce l'hai, probabilmente vale la pena dare un'occhiata ai tuoi *.inifile.
Francesco Casula

5
Nota: l'ultima versione supporta solo php7. Se usi php5, installa con sudo pecl install memprof-1.0.0.
Djizeus

18

Bene, questo potrebbe non essere esattamente quello che stai cercando, ma PHP ha un paio di funzioni integrate che produrranno l'utilizzo della memoria. Se volessi solo vedere quanta memoria sta usando una chiamata di funzione, potresti usare memory_get_peak_usage () prima e dopo una chiamata e prendere la differenza.

Usi la stessa tecnica intorno ai tuoi dati usando memory_get_usage () molto simile .

Approccio piuttosto poco sofisticato, ma è un modo rapido per controllare un pezzo di codice. Sono d'accordo che xdebug mem delta può essere troppo prolisso per essere utile a volte, quindi spesso lo uso solo per restringere a una sezione di codice, quindi scarico manualmente l'utilizzo specifico della memoria per piccoli pezzi.


0

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

Sono su un Mac, quindi se sei su Windows dovrai testarlo, ma per me funziona.

Ho modificato il mio file tracefile-analyzer.php e ho aggiunto il percorso al binario PHP in alto in modo che tu possa chiamarlo nel terminale come un normale script unix.

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

Non dimenticare di modificare questo file in 755.

È possibile creare facilmente uno script watchr ruby ​​per chiamare automaticamente lo script ogni volta che crea un file del profilo di memoria (* .xt). In questo modo potresti continuare a testare e vedere i tuoi miglioramenti senza dover eseguire il comando più e più volte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.