php memory-management profiling

Herramientas para analizar visualmente el uso de la memoria de una aplicación de PHP



memory-management profiling (6)

¿Hay algo gratuito o comercial que pueda facilitar el análisis del uso de la memoria mediante una aplicación PHP? Sé que xdebug puede producir archivos de rastreo que muestran el uso de la memoria por llamada a funciones, pero sin una herramienta gráfica los datos son difíciles de interpretar.

Idealmente, me gustaría poder ver no solo el uso total de memoria sino también qué objetos están en el montón y quién los hace referencia a ellos de forma similar a Jprofiler .


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

Funciones eliminadas

Se eliminó la compatibilidad con el perfil de memoria, ya que no funcionaba correctamente.

Así que probé con 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 archivo callgrind.out con KCachegrind

Usando Google gperftools (¡recomendado!)

Antes que nada, instale los gperftools de Google descargándolos 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 e inicia:

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:

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

Con Xhprof y Xhgui también puede hacer un perfil del uso de la CPU o simplemente del uso de la memoria, si ese es su problema en este momento. Es una solución muy completa, te da un control total y los registros se pueden escribir tanto en mongo como en el sistema de archivos.

Para más detalles, ver mi respuesta aquí .

Fuego negro

Blackfire es un perfilador 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 ;-)


En http://www.xdebug.org/updates.php para Xdebug 2.0.4 escriben en la sección "funciones eliminadas": "... Se eliminó la compatibilidad con el perfil de memoria, ya que no funcionaba correctamente ...". Por lo tanto xdebug no será una opción


Me encontré con el mismo problema recientemente, no pude encontrar ninguna herramienta específica desafortunadamente.

Pero algo que ayudó fue generar el rastreo xdebug en formato legible para humanos con mem deltas habilitados (una configuración INI, xdebug.show_mem_deltas o algo así, ¿no?). Luego ejecuta sort (si estás en * nix) en el resultado:

sort -bgrk 3 -o sorted.txt mytracefile.xt

Eso ordena en el tercer col, los deltas de mem. También puede ordenar en la segunda columna, en cuyo caso puede encontrar la línea en la que su aplicación utiliza la mayor cantidad de memoria en total.

Por supuesto, esto no puede detectar cuando el uso de la memoria de un objeto solo se incrementa en pequeños incrementos, pero termina usando una gran cantidad de memoria en general. Tengo un método bastante tonto que intenta hacer esto usando una combinación de iteración de objetos y serialización. Probablemente no se corresponda exactamente con el uso de la memoria, pero con suerte da una idea de dónde empezar a buscar. Tenga en cuenta que agotará la memoria y que tampoco se ha probado exhaustivamente, así que tenga cuidado con el comprador:

function analyzeMem($obj, $deep=false) { if (!is_scalar($obj)) { $usage = array(''Total''=>strlen(serialize($obj))); while (list($prop, $propVal) = each($obj)) { if ($deep && (is_object($propVal) || is_array($propVal))) { $usage[''Children''][$prop] = analyzeMem($propVal); } else { $usage[''Children''][$prop] = strlen(serialize($propVal)); } } return $usage; } else { return strlen(serialize($obj)); } } print_r(analyzeMem(get_defined_vars()));

Además, un colega acaba de sugerir este método (aplaude a Dennis ;-) Esto oculta los pasos que están por debajo de 2 niveles de sangría, puede ver fácilmente los puntos donde el uso general de la memoria salta y puede reducir las cosas al aumentar la sangría:

egrep ''[0-9]+ ( ){1,2}-> '' mytracefile.xt


Prueba webgrind . Le brinda el perfil de CacheGrinder en un formato fácil de leer y basado en navegador. Estoy en una Mac y ha hecho que crear perfiles sea muy sencillo.



phpDesigner 2008 puede depurar y comparar sitios web utilizando xdebug y KCacheGrind. También tiene un monitor incorporado.