Perfilado de memoria PHP

95

¿Cuál es una buena manera de perfilar el uso de memoria de una página PHP? Por ejemplo, para ver cuánta memoria están usando mis datos y / o qué llamadas de función están asignando más memoria.

  • xdebug no parece proporcionar información de memoria en su función de creación de perfiles.

  • xdebug lo proporciona en su función de seguimiento. Esto está bastante cerca de lo que quiero, excepto que la gran cantidad de datos es abrumadora, ya que muestra deltas de memoria para cada llamada de función. Si fuera posible ocultar llamadas por debajo de cierta profundidad, tal vez con alguna herramienta GUI, eso resolvería mi problema.

¿Hay algo mas?

JW.
fuente
Echa un vistazo a la charla de Rasmus Lerdorf titulada "Lo simple es difícil" ( talk.php.net/show/froscon08 para diapositivas, youtube.com/watch?v=RWRYX5eJbG0 para video). Repasa muchas herramientas útiles como "inclued" ( pecl.php.net/package/inclued ), xdebug y KCacheGrind.
TML
Encontré un parche para xdebug , que proporciona información de memoria en los perfiles. Hasta ahora está funcionando muy bien.
JW.
1
Como dices, xdebug proporciona información en seguimientos de funciones. Afortunadamente, también proporcionan un guión para interpretar eso. derickrethans.nl/xdebug-and-tracing-memory-usage.html Parece que me está funcionando hasta ahora ...
Luke H

Respuestas:

10

Xdebug reimplementó el seguimiento de memoria en 2.6 (2018-01-29) que se puede usar en Qcachegrind o una herramienta similar. Solo asegúrate de seleccionar la opción de memoria :)

De los documentos:

Desde Xdebug 2.6, el generador de perfiles también recopila información sobre cuánta memoria se está utilizando y qué funciones y métodos que aumentan el uso de la memoria.

No estoy familiarizado con el formato del archivo, pero Qcachegrind me ha funcionado muy bien para rastrear un par de problemas de memoria.

qcachegrind muestra

SeanDowney
fuente
4
E incluso usaron mi boleto. :)
JW.
Xdebug eliminó el soporte para PHP 5 en la versión 2.6.
Powtac
Si ayuda a alguien ... al usar php-fpm, es posible que pid no cambie entre diferentes solicitudes. Con profiler_output_name predeterminado, esto lleva a xdebug a sobrescribir los datos anteriores. Cambie este valor usando algo más de xdebug.org/docs/all_settings#trace_output_name
aligot
Estoy tratando de usar qcachegrind ahora y no entiendo lo que estoy viendo. No veo números de memoria en ninguna parte. ¿Cuánta memoria ocupa cada variable? Quiero algo que pueda rastrear la ejecución y mostrar la memoria en cada punto, y qué variables están ocupando esa memoria. ¿Dónde puedo obtener más información sobre esto?
john ktejik
72

Como probablemente sepa, Xdebug eliminó el soporte de creación de perfiles de memoria desde la versión 2. *. Busque la cadena "funciones eliminadas" aquí: http://www.xdebug.org/updates.php

Funciones eliminadas

Se eliminó la compatibilidad con la creación de perfiles de memoria porque no funcionaba correctamente.

Así que probé otra herramienta y funcionó bien para mí.

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

Esto es lo que hice en mi servidor Ubuntu para habilitarlo:

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

Y luego en mi código:

<?php

memprof_enable();

// do your stuff

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

Finalmente abra el callgrind.outarchivo con KCachegrind

Usando Google gperftools (¡recomendado!)

Primero que nada, instale Google gperftools descargando el último paquete aquí: https://code.google.com/p/gperftools/

Entonces, como siempre:

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

Ahora en tu código:

memprof_enable();

// do your magic

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

Luego abre tu terminal y lanza:

pprof --web /tmp/profile.heap

pprof creará una nueva ventana en su sesión de navegador existente con algo como se muestra a continuación:

Perfilado de memoria PHP con memprof y gperftools

Xhprof + Xhgui (el mejor en mi opinión para perfilar tanto la CPU como la memoria)

Con Xhprof y Xhgui también puede perfilar el uso de la CPU o solo el uso de la memoria si ese es su problema en este momento. Es una solución muy completa, le brinda control total y los registros se pueden escribir tanto en mongo como en el sistema de archivos.

Para obtener más detalles, consulte mi respuesta aquí .

Fuego negro

Blackfire es un generador de perfiles PHP de SensioLabs, los chicos de Symfony2 https://blackfire.io/

Si usa puphpet para configurar su máquina virtual, le alegrará saber que es compatible ;-)

Francesco Casula
fuente
¿Cómo lo hiciste funcionar? Intenté poner memprof_enableen mi código PHP y obtengo PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable(). Hice gperftools para instalar desde el código fuente actual de ellos.
Andrey Pokhilko
Ejecute a php -ien el cli o a phpinfo()para ver si está cargando la extensión correctamente. Si no lo tiene allí, probablemente valga la pena echar un vistazo a sus *.iniarchivos.
Francesco Casula
5
Nota: la última versión solo admite php7. Si usa php5, instálelo con sudo pecl install memprof-1.0.0.
Djizeus
18

Bueno, esto puede no ser exactamente lo que está buscando, pero PHP tiene un par de funciones integradas que generarán el uso de la memoria. Si solo quisiera ver cuánta memoria está usando una llamada de función, puede usar memory_get_peak_usage () antes y después de una llamada, y tomar la diferencia.

Usas la misma técnica con tus datos usando el memory_get_usage () muy similar .

Enfoque bastante poco sofisticado, pero es una forma rápida de verificar un fragmento de código. Estoy de acuerdo en que xdebug mem deltas puede ser demasiado detallado para ser útil a veces, por lo que a menudo lo uso para reducir a una sección de código y luego deshacer el uso de memoria específico para piezas pequeñas manualmente.

zombat
fuente
0

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

Estoy en una Mac, así que si estás en Windows tendrás que probar esto, pero esto funciona para mí.

Modifiqué mi archivo tracefile-analyzer.php y agregué la ruta al binario de PHP en la parte superior para que pudiera llamarlo en la terminal como un script normal de Unix.

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

No olvide modificar este archivo a 755.

Puede crear fácilmente una secuencia de comandos de Ruby Watchr para llamar automáticamente a la secuencia de comandos cada vez que crea un archivo de perfil de memoria (* .xt). De esa manera, podría seguir probando y viendo sus mejoras sin tener que ejecutar el comando una y otra vez.

2upmedia
fuente