Saltar al contenido

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

Solución:

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, ya que 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.out archivo con KCachegrind

Usando Google gperftools (¡recomendado!)

Primero que nada instale el 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 😉

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

Pero algo que ayudó fue generar la traza xdebug en formato legible por humanos con mem deltas habilitadas (una configuración INI, xdebug.show_mem_deltas o algo, creo?). Luego ejecute sort (si está en * nix) en la salida:

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

Eso se ordena en la tercera columna, las mem deltas. También puede ordenar en la segunda columna, en cuyo caso puede encontrar la línea en la que su aplicación usa la mayor cantidad de memoria en total.

Por supuesto, esto no puede detectar cuándo el uso de memoria de un objeto solo aumenta en pequeños incrementos pero termina usando mucha memoria en general. Tengo un método bastante tonto que intenta hacer esto usando una combinación de iteración y serialización de objetos. Probablemente no equivale exactamente al uso de la memoria, pero con suerte da una idea de dónde empezar a buscar. Tenga en cuenta que consumirá memoria en sí mismo y tampoco se ha probado exhaustivamente, por lo que el comprador debe tener cuidado:

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 con bastante facilidad los puntos en los que el uso general de la memoria aumenta y puede reducir las cosas aumentando la sangría:

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

En http://www.xdebug.org/updates.php para Xdebug 2.0.4 escriben en la sección “funciones eliminadas”: “… Se eliminó la compatibilidad con la creación de perfiles de memoria porque no funcionaba correctamente …”. Por lo tanto, xdebug no será una opción.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *