2008-09-11 13 views
28

Aquí está mi primera pregunta en SO.Averigüe dónde se ralentiza su código PHP (problema de rendimiento)

Tengo una aplicación interna para mi empresa que me pidieron mantener recientemente. Las aplicaciones están compiladas en PHP y están bastante bien codificadas (OO, DB Abstraction, Smarty) nada WTF-ish.

El problema es que las aplicaciones es muy lento .

¿Cómo puedo averiguar qué está ralentizando la aplicación? Optimicé el código para hacer muy pocas consultas DB, así que sé que es el código PHP el que tarda en ejecutarse. Necesito algunas herramientas que puedan ayudarme con esto y necesite diseñar una estrategia para verificar mi código.

Puedo hacer el trabajo de verificación/estrategia yo mismo, pero necesito más herramientas de PHP para descubrir dónde está fraguando mi aplicación.

¿Pensamientos?

Respuesta

39

Recientemente utilicé XDebug profiling en una situación similar. Emite un informe de perfil completo que se puede leer con muchas aplicaciones de creación de perfiles comunes (aunque no puedo darle una lista, acabo de utilizar el que viene con slackware).

+0

Excelente. Esta publicación realmente ayudó. Gracias. – verisimilitude

0

Usamos Zend Development Environment (windows). Ayer resolvimos un pico de uso de la memoria pasando por el depurador mientras ejecutamos Process Explorer para ver la actividad de la memoria/cpu/disco a medida que se ejecutaba cada línea.

Explorador de procesos: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx.

ZDE incluye un perfilador de rendimiento básico que puede mostrar el tiempo empleado en cada llamada de función durante las solicitudes de página.

0

Yo uso una combinación de PEAR Benchmark y log4php.

En la parte superior de las secuencias de comandos que quiero crear un perfil, creo un objeto que se envuelve alrededor de un objeto Benchmark_Timer. A lo largo del código, agrego llamadas $object->setMarker("name");, especialmente alrededor del código sospechoso.

La clase contenedora tiene un método de destrucción que toma la información de registro y la escribe en log4php. Normalmente envío esto a syslog (muchos servidores, agregados a un archivo de registro en un servidor).

En la depuración, puedo ver los archivos de registro y ver dónde necesito mejorar las cosas. Más adelante en la producción, puedo analizar los archivos de registro y hacer análisis de rendimiento.

No es xdebug, pero está siempre activado y me permite comparar dos ejecuciones del código.

+0

Aunque voy con XDebug, revisaré Pear Benchmark. Puedo usarlo en otros proyectos – Rushi

9

Como mencionó Juan, xDebug es excelente. Si está en Windows, WinCacheGrind le permitirá revisar los informes.

+0

Tengo una máquina de Windows por ahí que puedo poner en buen uso – Rushi

+2

KCacheGrind (KDE/Linux) es mucho mejor. – blueyed

6

Mire esta presentación de Rasmus Lerdorf (creador de PHP). Él va en algunos buenos ejemplos de prueba de velocidad de PHP y qué buscar, así como algunos elementos internos que pueden ralentizar las cosas. XDebug es una herramienta que él usa. También hace una observación muy sólida acerca de saber qué costo de rendimiento se está obteniendo con los marcos.

vídeo: http://www.archive.org/details/simple_is_hard

diapositivas (ya que es difícil de ver en el video): http://talks.php.net/show/drupal08/1

1

IFS es una gran base de código apc intento si no está ya.

http://pecl.php.net/package/APC

+0

Hola. Si revisara su pregunta, ¿la dejaría tal como está? Sin embargo, probablemente sepas qué hacer, así que te dejaré hacerlo. Por favor, incluye las partes relevantes de tu enlace :) –

2

PHPEd (http://www.nusphere.com/products/phped.htm) también ofrece una gran depuración y perfilado, y la posibilidad de agregar puntos de interrupción, relojes, etc en el código PHP. El perfilador integrado ofrece directamente un desglose de tiempo de cada llamada de función y método de clase desde el IDE. Los complementos del navegador también permiten la integración rápida con Firefox o IE (es decir, visita la URL lenta con el navegador, luego haz clic en el botón para crear un perfil o depurar).

Ha sido muy útil para señalar dónde está la aplicación lenta para concentrar la mayor parte del esfuerzo de codificación; y evita perder tiempo optimizando el código ya rápido. Después de haber probado Zend y Eclipse, me han vendido por la facilidad de uso de phpED.

Tenga en cuenta que tanto Xdebug como phpED (con DBG) requerirán un módulo adicional de PHP instalado cuando se depuren contra un servidor web. phpED también ofrece (no probado por mí) una opción de depuración local también.

1

También puede intentar usar la función register_tick_function en php. que le dice a php que llame periódicamente a cierta función a través de su código. A continuación, puede realizar un seguimiento de qué función se está ejecutando actualmente y la cantidad de tiempo entre las llamadas. entonces puedes ver lo que más tiempo lleva. http://www.php.net/register_tick_function

2

El perfil de Xdebug es definitivamente el camino a seguir. Otro consejo: WincacheGrind es bueno, pero no se ha actualizado recientemente. http://code.google.com/p/webgrind/ - en un navegador puede ser una alternativa fácil y rápida.

Sin embargo, las posibilidades siguen siendo la base de datos. Verifique los índices relevantes, y que tenga suficiente memoria para almacenar tantos datos de trabajo como sea posible.

3

Existen muchas variables que pueden afectar el rendimiento de su aplicación. Recomiendo que no asuma instantáneamente que PHP es el problema.

En primer lugar, ¿cómo se sirve a PHP? ¿Has probado la optimización básica de Apache o IIS? ¿El servidor está ocupado procesando otros tipos de solicitudes? ¿Has aprovechado un PHP code accelerator? Una forma de probar si el servidor es su cuello de botella es intentar ejecutar la aplicación en otro servidor.

En segundo lugar, ¿el rendimiento de toda la aplicación es lento o solo parece afectar ciertas páginas? Esto podría darle una indicación de dónde comenzar a analizar el rendimiento. Si toda la aplicación es lenta, el problema es más probable en el servidor/plataforma subyacente o con una consulta SQL global que es parte de cada solicitud (autenticación de usuario, por ejemplo).

En tercer lugar, mencionó la minimización del número de consultas SQL, pero ¿qué hay de la optimización de las consultas existentes? Si está utilizando MySQL, ¿está aprovechando las diversas fortalezas de cada sistema de almacenamiento? ¿Ha ejecutado EXPLAIN en sus consultas más importantes para asegurarse de que estén correctamente indexadas? Esto es crítico en consultas que acceden a tablas grandes; cuanto mayor sea el conjunto de datos, más notarás los efectos de una mala indexación. Afortunadamente, hay muchos artículos such as this one que explican cómo usar EXPLAIN.

En cuarto lugar, un error común es suponer que su servidor de base de datos utilizará automáticamente todos los recursos disponibles para el sistema. Debe verificar que haya asignado recursos suficientes explícitamente a su aplicación de base de datos. En MySQL, por ejemplo, tendrá que añadir los ajustes personalizados (en el archivo my.cnf) para cosas como key buffer, el tamaño de tabla temporal, concurrencia hilo, tampón innodb tamaño de la piscina, etc.

Si usted tiene verificó dos veces todo lo anterior y todavía no puede encontrar el cuello de botella, definitivamente un analizador de código como Xdebug puede ayudar. Personalmente, prefiero el generador de perfiles de Zend Studio, pero puede que no sea la mejor opción a menos que ya estés aprovechando el resto de la pila de Zend Platform. Sin embargo, en mi experiencia, es muy raro que PHP sea la causa principal del bajo rendimiento. A menudo, un generador de perfiles de código puede ayudarlo a determinar con mayor precisión qué tipo de consultas de DB son las culpables.

+0

Tienes razón también. De hecho, miré el final de la base de datos y parecían estar bien. Apache era un problema, pero lo arreglaron. Instalaré un programa de caché de código de operación también. Pero seguir perfilando tu aplicación ayuda a mejorar la programación general de todos modos. – Rushi

2

También podría usar APD (Depurador avanzado de PHP).

Es bastante fácil hacerlo funcionar.

$ php apd-test.php 

$ pprofp -l pprof.SOME_PID 

Trace for /Users/martin/develop/php/apd-test/apd-test.php 
Total Elapsed Time = 0.12 
Total System Time = 0.01 
Total User Time = 0.07 


     Real   User  System    secs/ cumm 
%Time (excl/cumm) (excl/cumm) (excl/cumm) Calls call s/call Memory Usage Name 
-------------------------------------------------------------------------------------- 
71.3 0.06 0.06 0.05 0.05 0.01 0.01 10000 0.0000 0.0000   0 in_array 
27.3 0.02 0.09 0.02 0.07 0.00 0.01 10000 0.0000 0.0000   0 my_test_function 
1.5 0.03 0.03 0.00 0.00 0.00 0.00  1 0.0000 0.0000   0 apd_set_pprof_trace 
0.0 0.00 0.12 0.00 0.07 0.00 0.01  1 0.0000 0.0000   0 main 

Hay un buen tutorial cómo compilar APD y crea perfiles con él: http://martinsikora.com/compiling-apd-for-php-54

+0

Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. –

+0

La respuesta es "Usar APD". Enlace adicional para aquellos que tienen problemas con la instalación. –

0

También puede mirar en el de cualquier otra solución HA Proxy o balanceo de carga si el servidor degrada el rendimiento es la causa de la aplicación de procesamiento lento. servidor.

Cuestiones relacionadas