Xdebug Profiler: Medición de tiempos de ejecución

por David Abad
Xdebug Profiler

Xdebug es una herramienta muy utilizada para debuggear código PHP con el fin de detectar posibles errores. Pero además de esta funcionalidad, Xdebug también tiene la capacidad de realizar un “profiling” capaz de medir los tiempos de ejecución de nuestro código y detectar que clases o funciones son las que más penalizan en tiempo.

Instalar y configurar Xdebug

Una de las formas más estables para instalar Xdebug en nuestro sistema es utilizar el repositorio comunitario de extensiones PECL, lanzando los siguientes comandos (para sistemas basados en Debian):

sudo apt-get install php-pear
pecl install xdebug

Una vez instalada la extensión Xdebug, el siguiente paso es crear un fichero “ini” de configuración en el directorio reservado por PHP para estos ficheros. Para conocer cual es el directorio donde debemos crear este fichero, podemos lanzar el siguiente comando:

php -i | grep "additional .ini files"

En dicho directorio podemos crear un fichero “99-xdebug.ini” con el siguiente contenido:

XDEBUG v2

zend_extension=xdebug.so
xdebug.profiler_enable=1
xdebug.profiler_output_dir=/var/www

XDEBUG v3

zend_extension=xdebug.so
xdebug.mode=profile
xdebug.output_dir=/var/www

Una vez configurado Xdebug (y reiniciado PHP), podemos acceder a la página que ejecuta el código PHP que deseamos analizar. Como resultado, este modo “profiler” genera ficheros pesados en el directorio indicado en la configuración, por lo que únicamente conviene habilitar este modo en el momento puntual en que queramos realizar una medición de tiempos.

Revisar resultados con Kcachegrind

Como resultado del análisis, Xdebug genera ficheros “cachegrind.out.X” que contienen los tiempos analizados. Para poder abrir estos ficheros y revisar los datos, debemos utilizar el software Kcachegrind:

sudo apt-get install kcachegrind

Este software proporciona una interfaz visual desde la que abrir los ficheros “cachegrind.out.X” generados y analizarlos en profundidad:

KCachegrind

KCachegrind

En el menú superior de la aplicación podemos ver un desplegable que nos permitirá seleccionar si queremos ver los datos relacionados con tiempos de ejecución o con memoria utilizada.

El panel izquierda muestra el listado de las diferentes clases y funciones ejecutadas en nuestro código, permitiendo obtener aquellas que mayor tiempo/memoria han consumido mediante la columna “Auto” (Self). Por otro lado, el panel derecho nos mostrará detalles adicionales sobre dicha llamada, cómo la traza de ejecución o el origen de las llamadas a la misma.

De este modo, podemos ver que partes de nuestro código tienen un peor rendimiento en tiempos/memoria, para poder centrar nuestro esfuerzo de optimización sobre ellas.

Midiendo tiempos de Magento

Magento es un framework PHP de comercio electrónico muy utilizado. En muchas ocasiones, este framework ofrece unos tiempos bastante lentos durante tareas de desarrollo. 

A la hora de realizar mediciones de tiempos en este framework, es conveniente tener varios factores en cuenta:

  • Clases “generated”: Durante desarrollo, Magento trabaja con una serie de clases PHP generadas bajo demanda. Estas clases se generan la primera vez que son requeridas y se mantienen generadas para futuras cargas.
  • Ficheros estáticos: Durante desarrollo, Magento trabaja con una serie de ficheros estáticos que son generados bajo demanda (imágenes, hojas de estilo, etc.). Estos ficheros se generan la primera vez que son requeridos y se mantienen generados para futuras cargas.
  • Datos cacheados: Magento incluye diferentes tipos de caché de datos con el objetivo de almacenar datos pre-procesados para ahorrar tiempos en futuras cargas, por lo que el estado de esta caché es muy relevante en cuanto a rendimiento.

Tiempos con datos cacheados:

Rendimiento Magento - Cache

Tiempos con datos no cacheados:

Rendimiento Magento - No cache

Analizando los tiempos de ejecución de una página estática de Magento, podemos llegar a dos conclusiones básicas:

  1. El factor de mayor relevancia para el TTFB (Time To First Byte) es el proceso de cacheado de datos.
  2. El factor de mayor relevancia para el “Load time” total es el proceso de generación de los ficheros estáticos.

Centrándonos en el rendimiento del proceso de generación de los ficheros estáticos, si utilizamos el software Xdebug Profiler podemos observar que la clase que mayor tiempo consume es “Less_Parser”:

Magento - Xdebug Profiling

Magento – Xdebug Profiling

Con este pequeño análisis, podemos ver que el punto crítico en cuanto a tiempos de ejecución de Magento es la clase “Less_Parser”, que pertenece a la librería Wikimedia LESS.PHP, encargada del parseo y compilación de las hojas de estilo LESS para obtener las hojas CSS resultantes.

Déjanos tu email para recibir contenido interesante en tu bandeja de entrada, cada mes.

¡No hacemos spam!

Otros artículos