2013-05-19 1 views
2

Я пытался начать профилирование своего веб-сервера CherryPy, но в документации недостаточно подробно описано, как это должно быть настроено. Я понимаю, что я должен использовать cherrypy.lib.profiler в качестве промежуточного программного обеспечения для монтирования моего начального сервера. Прямо сейчас, у меня есть код вроде следующего:Profiling CherryPy

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

Я хочу установить профилирование промежуточное программное обеспечение, и, кажется, что-то вроде требуется следующее:

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() 

По какой-то причине не cherrypy.tree.mount работа, но если я использую cherrypy.tree.graft все, кажется, работает нормально (я могу делать запросы к серверу, как обычно)

Однако приведенный выше код генерирует cp_0001.prof файл под /home/ken/tmp/cprofile, и я не знаю, как я попробуйте. Я пробовал использовать pyprof2calltree для чтения данных в KCacheGrind, но я получаю ошибку синтаксического анализа. Делает то, что я делаю, кажется правильным, и если да, то как интерпретировать выходной файл?

ответ

4

Оказалось, что файлы профиля, созданные CherryPy, могут быть интерпретированы с использованием сценария profiler.py, отправленного как часть CherryPy. Просто запустите profiler.py в каталоге <site-packages>/cherrypy/lib следующим образом:

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

Затем перейдите к localhost:8080 в вашем браузере и профилирование результатов для всех .prof файлов в целевом каталоге будет отображаться в простом текстовом интерфейсе.

Я бы по-прежнему предпочитал экспортировать результаты в calltree для профиля с помощью KCacheGrind, но это, по-видимому, для базового профилирования.

Это отражено в change log for v2.1 of CherryPy, когда профайлер была введена (хотя другие подробности на этой странице, описывающие, как настроить профилировщика с тех пор стал устаревшим)

1

Я также пытаюсь получить профилирование и работает для вишневый экземпляр. Я использовал тот же код, который у вас есть в вашем первоначальном вопросе, который, похоже, работает в том, что он создает файл cp_0001.prof в папке.

Чтобы ответить на ваш вопрос, я могу открыть этот файл в runnakerun, чтобы просмотреть выходные данные профилирования в древовидном представлении.

У меня есть проблема в том, что каждый запрос я к серверу в настоящее время не удается, со следующим выходом в журнале:

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

Я использую Python 2.6.6 и 3.2.2 CherryPy

Любые предложения?

+0

Получение этого также. –