2013-05-19 63 views
2

我一直在嘗試開始分析我的CherryPy網絡服務器,但文檔缺少詳細的應該如何設置。我知道我應該能夠使用cherrypy.lib.profiler作爲中間件來安裝我的初始服務器。現在,我有這樣的代碼如下:分析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一切似乎運作正常(我可以向服務器請求正常)

然而,上面的代碼生成/home/ken/tmp/cprofile下一個cp_0001.prof文件,我不知道如何我解釋它。我曾嘗試使用pyprof2calltree將數據讀入KCacheGrind,但是我收到解析錯誤。我所做的事似乎是正確的,如果是的話,我該如何解釋輸出文件?

回答

4

事實證明CherryPy生成的配置文件可以使用作爲CherryPy的一部分發貨的profiler.py腳本來解釋。只需在<site-packages>/cherrypy/lib目錄下運行profiler.py如下:

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

然後導航到你的瀏覽器localhost:8080,並在目標目錄中的所有文件.prof的分析結果將顯示在一個簡單的文本界面。

我仍然希望能夠將結果導出到calltree中以使用KCacheGrind進行配置文件,但這似乎適用於基本配置文件。

這在change log for v2.1 of CherryPy被記錄在引入探查時(儘管該網頁上的其他細節描述如何設置分析器已經成爲過時)

1

我也試圖讓剖析啓動並運行了一個櫻桃的例子。我在你最初的問題中使用了相同的代碼,這似乎起作用,它在文件夾中生成一個cp_0001.prof文件。

要回答你的問題,我可以在runsnakerun中打開這個文件,在樹形視圖中查看分析輸出。

我的問題是,每次我做的到服務器的請求,現在失敗,並在日誌中下面的輸出:

[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

獲得這個。 –