Pregunta

Aquí está mi primera pregunta en SO.

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

El problema es que las aplicaciones son muy lento.

¿Cómo hago para descubrir qué es lo que ralentiza la aplicación?He optimizado el código para realizar muy pocas consultas a la base de datos, por lo que sé que es el código PHP el que tarda un poco en ejecutarse.Necesito obtener algunas herramientas que puedan ayudarme con esto y necesito diseñar una estrategia para verificar mi código.

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

¿Pensamientos?

¿Fue útil?

Solución

he usado Perfil XDebug Recientemente en una situación similar.Genera un informe de perfil completo que se puede leer con muchas aplicaciones de creación de perfiles comunes (aunque no puedo darte una lista, solo usé la que viene con slackware).

Otros consejos

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

Mire esta presentación de Rasmus Lerdorf (creador de PHP).Presenta algunos buenos ejemplos de cómo probar la velocidad de PHP y qué buscar, así como algunos aspectos internos que pueden ralentizar las cosas.XDebug es una herramienta que utiliza.También hace un comentario muy sólido acerca de saber en qué costo de rendimiento se está metiendo con los marcos.

Video: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

Hay muchas variables que pueden afectar el rendimiento de su aplicación.Le recomiendo que no asuma inmediatamente que PHP es el problema.

Primero, ¿cómo estás sirviendo PHP?¿Has probado la optimización básica de Apache o del propio IIS?¿Está el servidor ocupado procesando otros tipos de solicitudes?¿Has aprovechado una acelerador de código PHP?Una forma de comprobar 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 parece que sólo afecta a determinadas páginas?Esto podría darle una indicación de por dónde empezar a analizar el rendimiento.Si toda la aplicación es lenta, es más probable que el problema esté en el servidor/plataforma subyacente o en una consulta SQL global que forma parte de cada solicitud (autenticación de usuario, por ejemplo).

En tercer lugar, mencionó minimizar la cantidad de consultas SQL, pero ¿qué pasa con la optimización de las consultas existentes?Si utiliza MySQL, ¿está aprovechando las diversas ventajas de cada sistema de almacenamiento?¿Has corrido? EXPLICAR en sus consultas más importantes para asegurarse de que estén indexadas correctamente?Esto es fundamental en consultas que acceden a tablas grandes;cuanto mayor sea el conjunto de datos, más notará los efectos de una indexación deficiente.Por suerte, hay muchos artículos. como este que explican cómo utilizar EXPLAIN.

Cuarto, 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 para asegurarse de haber asignado explícitamente recursos suficientes a su aplicación de base de datos.En MySQL, por ejemplo, querrás agregar configuraciones personalizadas (en tu archivo my.cnf) para cosas como el búfer de claves, el tamaño de la tabla temporal, la concurrencia de subprocesos, el tamaño del grupo de búfer de innodb, etc.

Si ha verificado todo lo anterior y aún no puede encontrar el cuello de botella, un generador de perfiles de código como Xdebug definitivamente puede ayudar.Personalmente, prefiero el generador de perfiles 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, según mi experiencia, es muy raro que PHP sea la causa principal del rendimiento lento.A menudo, un generador de perfiles de código puede ayudarle a determinar con mayor precisión qué consultas de base de datos son las culpables.

phpED(http://www.nusphere.com/products/phped.htm) también ofrece excelente depuración y creación de perfiles, y la capacidad de agregar relojes, puntos de interrupción, etc. en código PHP.El generador de perfiles integrado ofrece directamente un desglose del tiempo de cada llamada a función y método de clase desde el IDE.Los complementos del navegador también permiten una integración rápida con Firefox o IE (es decir,visite la URL lenta con el navegador, luego haga clic en el botón para perfilar o depurar).

Ha sido muy útil para señalar dónde la aplicación es lenta para poder concentrar la mayor parte del esfuerzo de codificación;y evita perder tiempo optimizando código que ya es rápido.Después de haber probado Zend y Eclipse, ahora estoy convencido de la facilidad de uso de phpED.

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

El perfil 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, lo más probable es que siga siendo la base de datos de todos modos.Verifique los índices relevantes y que tenga suficiente memoria para almacenar en caché la mayor cantidad posible de datos de trabajo.

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

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 sobre cómo compilar APD y crear perfiles con él: http://martinsikora.com/compiling-apd-for-php-54

Si es una base de código grande, pruebe apc si aún no lo ha hecho.

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

También puedes intentar usar la función Register_tick_function en php.lo que le dice a PHP que llame a una determinada función periódicamente a través de su código.Luego podrá realizar un seguimiento de qué función se está ejecutando actualmente y la cantidad de tiempo entre llamadas.entonces podrás ver qué está tomando más tiempo.http://www.php.net/register_tick_function

Usamos el entorno de desarrollo Zend (Windows).Ayer resolvimos un pico en el uso de memoria revisando el depurador mientras ejecutamos Process Explorer para observar 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 generador de perfiles de rendimiento básico que puede mostrar el tiempo dedicado a cada llamada de función durante las solicitudes de página.

Yo uso una combinación de Punto de referencia PERA y log4php.

En la parte superior de los scripts que quiero perfilar, creo un objeto que envuelve un Benchmark_Timer objeto.A lo largo del código, agrego $object->setMarker("name");llamadas, especialmente en torno a códigos sospechosos.

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 observar los archivos de registro y ver dónde necesito mejorar las cosas.Más adelante en producción, puedo analizar los archivos de registro y realizar análisis de rendimiento.

No es xdebug, pero siempre está activado y me da la posibilidad de comparar dos ejecuciones del código.

También puedes mirar el Proxy de alta disponibilidad o cualquier otra solución de equilibrio de carga si el rendimiento degradado de su servidor es la causa del procesamiento lento de la aplicación.servidor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top