2008-09-25 21 views
15

Estoy trabajando en una aplicación web que utiliza Perl y tengo que buscar la aceleración de partes de la aplicación.¿Cómo perfilo una aplicación web de Perl?

Pensé en comenzar a perfilar las llamadas en particular para la porción que deseo investigar. He hecho algunas búsquedas para perfilar el código Perl, pero desafortunadamente la mayoría de lo que encuentro me dice que debería ejecutar mi código perl con -d:DProf myapp desde la línea de comandos. Eso no funciona para mí, ya que mi código está dentro de una aplicación web. Encontré una forma de hacer que los perfiles funcionaran con Apache, pero desafortunadamente, los módulos "más usados" que regresaron del generador de perfiles eran todos los módulos de CPAN: Clase :: xyz, etc. etc. No fue terriblemente útil.

¿Alguien sabe de una buena manera, además de mí, de inyectar código "temporizador" en los métodos que deseo perfilar solo para estos métodos? He pensado en escribir un script de prueba y perfilarlo, pero debido a la naturaleza del código en el que estoy trabajando eso requeriría un poco más de trabajo de lo que espero tener que hacer.

Respuesta

18

¿Has probado Devel::NYTProf (mucho mejor que Devel :: DProf), que puede funcionar bajo Apache? ¿Qué servidor web estás usando? ¿Es esto un script CGI vainilla, una cosa mod_perl, o algo más?

Si está haciendo cosas en la base de datos, el DBI::Profile puede comparar sus consultas, que es trabajo que ocurre en otro programa.

El verdadero truco, sin embargo, es organizar el código para que pueda hacer todo el espectro de pruebas y perfiles sin tener que juntarlo todo al final para descubrir que algo es lento. Eso no te ayudará mucho en el corto plazo para combatir los incendios, pero evita que las cosas se conviertan en incendios a largo plazo. También hay varias formas de simular el entorno del servidor web, etc., pero esa es una pregunta diferente. :)

+0

Sí, esa fue la que probé, y todo lo que apareció fueron todos los módulos de cpan.Quiero enfocar realmente estos métodos específicos y ver dónde pasan ellos mismos la mayor parte del tiempo. – Leanan

+1

¿Qué módulos de CPAN enumeraron? Si está haciendo muchas llamadas a la base de datos, es muy posible que los módulos DBI y DBD estén en la parte superior de su lista. Esto no se debe a que Perl está haciendo demasiado trabajo, sino porque sus consultas DB son lentas. Comience a perfilarlos en su lugar. – mpeters

+1

No veo el sentido de aconsejar a alguien que 'organice el código' si no les explica cómo hacerlo, o simplemente cómo averiguar cómo hacerlo. – jwg

1

Puede usar el módulo de núcleo Benchmark con la opción : hireswallclock si realmente desea sincronizar las cosas internamente. Pero realmente, deberías poder hacer un perfil desde la línea de comando. Puede que tenga que escribir scripts de prueba para emular ciertas partes de una solicitud de CGI, pero DProf puede ser extremadamente útil al buscar cuellos de botella de rendimiento.

En particular, busque donde su código llama al código del módulo CPAN. Puede estar haciendo esto en bucles mucho más de lo necesario, por lo tanto, mientras el tiempo se gasta en el módulo CPAN, la refacturación de su código puede solucionar el problema.

10

Si está utilizando CGI.pm, puede pasar argumentos a su script de Perl en la línea de comandos y CGI.pm los interpretará como si se pasaran como parámetros a través de HTTP. Entonces, si estás depurando, p.

http://example.com/scripts/example.pl?action=browse&search=grommet&restrict=blah

entonces se podría simplemente llamar desde la línea de comandos, por ejemplo,

perl -d:NYTProf documentroot/scripts/example.pl 'action=browse&search=grommet&restrict=blah'

1

Soy consciente de que es un poco tarde para que en este punto, pero esta es una de las razones por las que es bueno utilizar CGI::Application u otra arquitectura en la que la aplicación web es sólo una muy breve poco de Web -directorio que hace uso de un grupo de módulos que has escrito para implementar la funcionalidad real. El uso de dicho diseño hace que sea muy sencillo perfilar (o simplemente probar) cualquier módulo de la línea de comando, ya sea individual o colectivamente, sin tener que preocuparse por el aspecto de la web.

Cuestiones relacionadas