Rendimiento en aplicaciones PHP

En esta última semana he comenzado a participar en un nuevo proyecto. Consiste en hacer una auditoría del rendimiento y la calidad del software de una aplicación implementada con tecnología PHP. El problema está en que la aplicación va degradando el servidor de aplicaciones web Apache hasta que este provoca una denegación de servicio y es preciso reiniciarlo.

Para esta auditoría se van a utilizar diversas herramientas:

1. Análisis del rendimiento de la aplicación web. En esta parte se localizarán los cuellos de botella en tiempo de ejecución y en definitiva los motivos por los cuales la aplicación consigue degradar el servidor hasta el punto de hacer que provoque la denegación de servicio antes comentada. Para ello se van a utilizar dos herramientas, The Grinder y XCacheGrind.

  • The Grinder. Me la recomendó mi compañero Antonio, y es simplemente espectacular. Es una herramienta basada software libre y su funcionamiento e instalación es muy simple, está basado en una consola central y en uno o varios agentes, cada uno de estos agentes (que son distribuidos entre distintas máquinas físicas) despliega una serie de workers y cada uno de estos workers despliega los hilos que los agentes tengan configurados. Además proporciona un proxy que nos permite realizar las pruebas UI fácilmente con cualquier navegador.
Esquema de funcionamiento de The Grinder

Esquema de funcionamiento de The Grinder

  • XCacheGrind. Esta herramienta tiene dos variantes WinCacheGrind y KCacheGrind y permiten visualizar gráficamente el consumo de tiempo que cada una de las funciones o scripts PHP ha tardado en ejecutarse y otra información que puede ser de interés para realizar las tareas de profile. Para ello hace uso de los logs que proporciona XDebug, que se tendrán que configurar con los siguientes parámetros:

xdebug.remote_autostart = On
xdebug.remote_enable=On
xdebug.profiler_output_dir = “/home/aclr/kcachegrind/”
xdebug.trace_output_dir = “/home/aclr/kcachegrind/”
xdebug.profiler_append = On
xdebug.profiler_enable = On
xdebug.auto_trace = On

Veamos un ejemplo de la información que obtenemos haciendo uso de estas herramientas:

<?php
function escribe($cad){
echo $cad.'<br/>’;
}

for($i = 0 ; $i < 100 ; $i++){
for($j = 0; $j < 100 ; $j++){
escribe(“hola”);
}
}
?>

Distribución de la ejecución

Como se puede apreciar en esta imagen solo el 9.6% del tiempo consumido en la ejecución es utilizado por la función escribe, el resto, el 99.4% del tiempo de ejecución se ejecuta en el main, es decir, en el bucle, en un caso real una situación análoga a esta nos diría que tenemos que tratar de centrar nuestros esfuerzos de optimización en el main, no en la función escribe.

En próximas entradas intentaré hablar un poco más en profundidad de The Grinder y sobre las herramientas que se utilizarán para el análisis de la calidad del código.

Aunque me gusta terminar mis posts con la cita de alguna frase célebre que trate o evoque sobre el tema del que versa el post, esta vez voy no podrá ser, son las 2:04 y me voy a la cama 😉

Anuncios

3 respuestas a Rendimiento en aplicaciones PHP

  1. azael dice:

    excelentes herramientas….estoy haciendo una analisis para ver que lenguaje entre python, php y rubi debere utilizar para hacer una aplicacion que será sumamente grande y cual me permite mejorar el rendimiento de mi servidor web. Podrias darme algun comentario sobre estos lenguajes…mas que nada sobre su rendimento donde el rendimiento es realmente critico. gracias

    • Ángel Cristóbal Lázaro Ríos dice:

      Hola azael,

      La verdad que nunca he tenido contacto ni con python, ni con rubi y no sé qué comportamiento tienen en aplicaciones web, lo que sí te recomiendo, si me lo permites, es:

      1. Selecciona el lenguaje de programación con que el que te encuentres más agusto trabajando y que disponga de mayor comunidad.

      Si vas a usar PHP:

      1. Utiliza un framework de desarrollo que se adecue a las necesidades de tu proyecto, symfony o zend framework me gustaron cuando los estuve probando (aunque nunca llegué a trabajar con ellos).
      2. Realiza pruebas unitarias, funcionales, de integración y de carga (esto último no debe convertirse en una obsesión ya que a la postre repercutirá negativamente en el proyecto)

      Un saludo

  2. Entorno de pruebas de rendimiento de la nueva fachada…

    Como prueba adicional a las pruebas de funcionalidad que actualmente se están practicando a las aplicaciones publicadas a través de la nueva fachada, se tiene previsto realizar una serie de pruebas de rendimiento a la infraestructura completa de la fac…

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: