SensioLabsProfiler, analizando y mejorando el rendimiento de las aplicaciones PHP

NOTA: SensioLabsProfiler es un servicio desarrollado por SensioLabs, empresa para la que trabajo desde diciembre de 2013. No obstante, este artículo sólo recoge mis opiniones personales y ninguna persona de SensioLabs ha revisado o condicionado su contenido.

Mejorar el rendimiento de las aplicaciones es una obsesión compartida por casi todos los programadores del mundo. En el caso de las aplicaciones web, nos obsesiona ahorrar unos milisegundos en cada petición y reducir el consumo global de memoria para optimizar al máximo la infraestructura disponible.

No obstante, como dice uno de los aforismos más conocidos del ámbito tecnológico, "lo que no se puede medir, no se puede mejorar". Así que antes de tratar de mejorar el rendimiento de tu aplicación, debes analizar qué está pasando durante su ejecución.

Para realizar estos análisis, en el mundo PHP disponemos de varias herramientas, especialmente Xdebug y XHProf. El problema es que instalar estas herramientas no es nada sencillo en algunos entornos y su uso no suele ser muy amigable para el desarrollador. Además, si has probado a analizar con XHProf aplicaciones complejas como Drupal, sabes que la forma en la que se muestra la información hace prácticamente imposible su análisis (en ocasiones el navegador incluso se cuelga cuando trata de mostrar un grafo con cientos de nodos).

Para intentar solucionar estos problemas, la empresa SensioLabs ha creado el servicio SensioLabsProfiler, que combina la potencia de Xdebug y XHProf con un uso muy sencillo y amigable. Se trata de un profiler o perfilador en la nube basado en el proyecto uprofiler y que permite analizar el rendimiento de las aplicaciones PHP hasta el último detalle.

Instalación y configuración

Aunque se trata de un servicio desarrollado por los creadores de Symfony, puedes utilizarlo con cualquier aplicación PHP (Drupal, WordPress, Joomla!, etc.) y con cualquier framework PHP (Laravel, Slim, Zend, CakePHP, etc.)

Para poder utilizar el profiler, primero debes instalar en tu servidor un "agente" y una extensión PHP. En la práctica esto será tan sencillo como hacer un apt-get de un determinado paquete. Por eso al principio el profiler solamente estará disponible en servidores Linux y más adelante se añadirá soporte para Mac OS y, quizás, para Windows.

El agente está diseñado para que no afecte al rendimiento de tu aplicación cuando no lo utilices y la extensión PHP añade una sobrecarga despreciable. Así que la idea es que puedas instalar estas herramientas en tu servidor de producción para que estén disponibles siempre que las necesites.

Funcionamiento básico

Para simplificar al máximo el proceso de análisis de aplicaciones, los creadores de SensioLabsProfiler proponen una forma de trabajar bastante curiosa. Imagina que quieres hacer hacer el profiling de una aplicación Drupal 8 que tienes instalada en algún servidor.

Para realizar una medición, simplemente tienes que instalar una extensión en tu navegador (por el momento solo está disponible en Google Chrome) y acceder a la página que quieres analizar, como por ejemplo la portada del sitio. Una vez que accedas a la página, pincha en la extensión del navegador y ésta se comunicará con el agente y con la extensión de PHP para realizar una nueva petición a esa página y así poder medir la ejecución de esa petición. En resumen, analizar el rendimiento de tus aplicaciones será tan sencillo como acceder a cualquier página y pulsar un botón.

En realidad, como las condiciones del servidor pueden variar de una medición a otra, el profiler no ejecuta la aplicación una sola vez, sino que realiza varias mediciones consecutivas para minimizar estas diferencias y el resultado que muestra siempre son los valores medios.

Analizando el rendimiento

Siguiendo el ejemplo anterior, vamos a mostrar el resultado de analizar una determinada página servida por Drupal 8. Lo primero que te encuentras al abrir un análisis es el grafo completo de funciones y métodos que se han utilizado durante la ejecución de la aplicación:

sensiolabs_profiler_grafo_completo

Como este grafo suele ser muy complejo, las "partes calientes" de la aplicación se muestran en rojo. Así siempre sabes por dónde debes empezar a atacar. En este caso, abajo del todo existe un nodo en color rojo muy intenso que se corresponde con el método get() de la clase Container. Si haces doble click sobre ese nodo, el grafo se simplifica para mostrar solamente los nodos relevantes para este caso:

sensiolabs_profiler_grafo_detallado

Según los datos del profiler, el método get() se está llamando 965 veces desde otro método get() de otra clase de Drupal. A su vez, ese otro método get() es llamado casi 300 veces por el método service() y casi 100 veces por el método lazyLoad().

Gracias a esta información, y gracias al conocimiento que tenemos sobre la aplicación que estamos analizando, sabremos si esas 965 llamadas al método get() son necesarias y por tanto todo va bien; o si por el contrario, esta cifra es muy superior a la que esperábamos y por tanto, tenemos que introducir alguna caché o refactorizar esa parte de la aplicación.

Además, al pinchar sobre cualquier nodo, puedes ver con todo detalle el tiempo y memoria que consume, qué metodos lo llaman y a qué métodos está llamando este nodo:

sensiolabs_profiler_informacion_detallada

Comparando mediciones

En mi opinión, la mejor característica de SensioLabsProfiler es la posibilidad de comparar dos mediciones entre sí. Imagina que quieres mejorar el rendimiento de Drupal 8. Para ello, realizas una primera medición que se considerará la referencia inicial (la llamaremos Drupal). Después, realizas los cambios en el código que piensas que van a mejorar el rendimiento y a continuación, realizas una segunda medición (la llamaremos Drupal Patched).

Ahora que ya dispones de dos mediciones diferentes sobre la misma aplicación, puedes compararlas para ver dónde has ganado o perdido rendimiento, tanto en tiempo de ejecución como en consumo de memoria:

sensiolabs_profiler_comparando_medidas

El grafo muestra en rojo las partes en las que has perdido rendimiento y en azul las partes en las que lo has ganado. Como puedes ver, los cambios introducidos en el código de Drupal han mejorado un 11% el rendimiento del método get():

sensiolabs_profiler_mejoras_en_rendimiento

De la misma manera que los tests te dan confianza para refactorizar tus aplicaciones y añadir nuevo código sabiendo que todo va a seguir funcionado bien, este profiler te da la seguridad de que los cambios que introduces en la aplicación no la están degradando.

En resumen

Cosas que me han gustado:

  • Funciona con cualquier aplicación o framework de PHP.
  • La información proporcionada es precisa y suficiente para analizar y mejorar el rendimiento de las aplicaciones.
  • Aunque los diagramas son muy complejos, la navegación por los nodos es bastante ágil y dinámica.
  • La comparación de mediciones es genial para estar seguro de que los cambios que haces en tu aplicación no degradan el rendimiento.

Cosas que deberían mejorar:

  • La usabilidad de la interfaz debería mejorarse.
  • En ocasiones no es fácil interpretar bien la información que se muestra.
  • Además de la información sobre tu aplicación, el profiler también muestra información interna sobre PHP. Obviamente el engine de PHP influye en el rendimiento de la aplicación, pero como es algo que no puedes ni cambiar ni controlar, creo que esta información se debería ocultar o mostrar aparte.

Cuándo estará disponible

Por el momento este servicio se encuentra en fase de beta privada, así que todavía no puedes probarlo en tus aplicaciones. No obstante, ya puedes solicitar tu invitación para ser uno de los primeros en poder usarlo cuando se abra al público. Para ello, pincha el botón Join the private beta en profiler.sensiolabs.com.

Comentarios

Este artículo ya no permite añadir más comentarios.
¿Por qué? Los artículos cierran sus comentarios automáticamente unos meses después de su publicación para asegurar que estos sigan siendo relevantes.

Publicada el

17 de julio de 2014

Proyectos Symfony destacados

La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.