Perfil CherryPy

He estado intentando comenzar a crear un perfil de mi servidor web CherryPy, pero la documentación carece de detalles sobre cómo se debe configurar esto. Entiendo que debería poder usar cherrypy.lib.profiler como middleware para montar mi servidor inicial. En este momento, tengo un código como el siguiente:

 server_app = ServerClass() cherrypy.tree.mount(server_app, '/', '/path/to/config/file.cfg') cherrypy.engine.start() cherrypy.engine.block() 

Quiero montar el middleware de creación de perfiles, y parece que se requiere algo como lo siguiente:

 from cherrypy.lib import profiler server_app = ServerClass() server_cpapp = cherrypy.Application(server_app, '/', '/path/to/config/file.cfg') server_profile_cpapp = profiler.make_app(server_cpapp, '/home/ken/tmp/cprofile', True) #cherrypy.tree.mount(server_profile_cpapp) cherrypy.tree.graft(server_profile_cpapp) cherrypy.engine.start() cherrypy.engine.block() 

Por alguna razón, cherrypy.tree.mount no funciona, pero si uso cherrypy.tree.graft todo parece funcionar bien (puedo hacer solicitudes al servidor de manera normal)

Sin embargo, el código anterior genera un archivo cp_0001.prof en /home/ken/tmp/cprofile y no estoy seguro de cómo interpretarlo. He intentado usar pyprof2calltree para leer los datos en KCacheGrind, pero me aparece un error de análisis. ¿Parece correcto lo que estoy haciendo? Y si es así, ¿cómo interpreto el archivo de salida?

    Resulta que los archivos de perfil generados por CherryPy pueden interpretarse utilizando el script profiler.py envía como parte de CherryPy. Simplemente ejecute profiler.py en el directorio /cherrypy/lib siguiente manera:

     python profiler.py /directory/containing/prof/files 8080 

    Luego navegue a localhost:8080 en su navegador y los resultados del perfil para todos los archivos .prof en el directorio de destino se mostrarán en una interfaz de texto simple.

    Todavía preferiría poder exportar los resultados a un calltree para crear un perfil utilizando KCacheGrind, pero parece que esto se hace para el perfilado básico.

    Esto se documenta en el registro de cambios para v2.1 de CherryPy cuando se introdujo el generador de perfiles (aunque los otros detalles en esa página que describen cómo configurar el generador de perfiles desde entonces han quedado obsoletos)

    También estoy tratando de poner en marcha el perfilado para una instancia cherrypy. Usé el mismo código que tiene en su pregunta inicial, que parece funcionar porque genera un archivo cp_0001.prof en la carpeta.

    Para responder a su pregunta, puedo abrir este archivo en runsnakerun para ver el resultado del perfil en una vista de árbol.

    El problema que tengo es que todas las solicitudes que hago al servidor ahora fallan, con la siguiente salida en el registro:

     [29/May/2013:16:39:32] ENGINE AssertionError('Bad call', ('', 0, 'sleep'), , , , ) Traceback (most recent call last): File "\packages\cherrypy\wsgiserver\wsgiserver2.py", line 1302, in communicate req.respond() File "\packages\cherrypy\wsgiserver\wsgiserver2.py", line 831, in respond self.server.gateway(self).respond() File "\packages\cherrypy\wsgiserver\wsgiserver2.py", line 2115, in respond response = self.req.server.wsgi_app(self.env, self.start_response) File "\packages\cherrypy\_cptree.py", line 290, in __call__ return app(environ, start_response) File "\packages\cherrypy\lib\profiler.py", line 188, in __call__ return self.profiler.run(gather) File "\packages\cherrypy\lib\profiler.py", line 147, in run result = self.profiler.runcall(func, *args) File "\python\lib\profile.py", line 472, in runcall return func(*args, **kw) File "\packages\cherrypy\lib\profiler.py", line 183, in gather def gather(): File "\python\lib\profile.py", line 246, in trace_dispatch_i if self.dispatch[event](self, frame, t): File "\python\lib\profile.py", line 301, in trace_dispatch_call frame, frame.f_back) AssertionError: ('Bad call', ('', 0, 'sleep'), , , , ) 

    Estoy usando python 2.6.6 y cherrypy 3.2.2

    ¿Alguna sugerencia?