php - una - porque se ralentiza mi pc
Descubre dónde se ralentiza tu código PHP(Problema de rendimiento) (12)
Esta es mi primera pregunta en SO.
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 son muy lentas .
¿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.
Yo mismo puedo hacer el trabajo de verificación / estrategia, pero necesito más herramientas de PHP para descubrir dónde está fraguando mi aplicación.
¿Pensamientos?
Hay muchas variables que pueden afectar el rendimiento de su aplicación. Recomiendo que no asuma instantáneamente que PHP es el problema.
Primero, ¿cómo estás sirviendo 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 acelerador de código PHP ? 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ó minimizar el número de consultas SQL, pero ¿qué hay de optimizar las consultas existentes? Si está utilizando MySQL, ¿está aprovechando las diversas fortalezas de cada sistema de almacenamiento? ¿Has ejecutado EXPLAIN en tus consultas más importantes para asegurarte 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 como este 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, querrá agregar configuraciones personalizadas (en su archivo my.cnf) para cosas como el búfer de claves, el tamaño de tabla temporal, la concurrencia de hilos, el tamaño del grupo de búferes innodb, etc.
Si ha verificado dos veces todo lo anterior y todavía no puede encontrar el cuello de botella, un analizador de código como Xdebug definitivamente 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é 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 DB son las culpables.
Como mencionó Juan, xDebug es excelente. Si está en Windows, WinCacheGrind le permitirá revisar los informes.
Mira 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.
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
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.
Process Explorer: 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.
Uso una combinación de PEAR Benchmark y log4php .
En la parte superior de las secuencias de comandos que quiero crear perfil, creo un objeto que se ajusta a un objeto Benchmark_Timer . A lo largo del código, agrego $object->setMarker("name");
llamadas, 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.
phpED ( http://www.nusphere.com/products/phped.htm ) también ofrece gran depuración y creación de perfiles, y la capacidad de agregar relojes, puntos de interrupción, etc. en 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 depure contra un servidor web. phpED también ofrece (no probado por mí) una opción de depuración local también.
si es una gran base de código, prueba apc si aún no lo has hecho.
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
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, es probable que siga siendo la base de datos. Verifique los índices relevantes, y que tenga suficiente memoria para almacenar tantos datos de trabajo como sea posible.
Recientemente utilicé el perfil de XDebug 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 darte una lista, acabo de utilizar la que viene con slackware).
También podría usar APD (Advanced PHP Debugger).
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 hacer perfiles con él: http://martinsikora.com/compiling-apd-for-php-54
También puede ver el HA Proxy o cualquier otra solución de balanceo de carga si el rendimiento degradado de su servidor es la causa del lento procesamiento de la aplicación. servidor.