2012-08-17 59 views
1

我有一個Django應用程序,我決定將它移植到Google App Engine。
我決定使用NDB作爲我的數據庫,並移植了所有模型(包括django用戶)。在閱讀文檔(App Engine文檔非常糟糕,給出的示例經常過時並且不再工作)和移植應用程序一週之後(當我運行它時,它非常慢):1s-2s延遲數據庫。
ndb查詢不需要太多時間(少於50毫秒),Appstats應用程序不會顯示任何其他內容。
我決定使用cProfile並創建了一個wsgi中間件,但我無法弄清楚如何打印輸出。方法pstats使我可以打印輸出或將其保存到文件中,並且我不能在wsgi處理程序中執行任何操作。
我的代碼如下:App Engine WSGI中間件剖析器

import os 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings") 
from django.core.handlers import wsgi 

from webob import Request 
class AppProfiler(object): 
    def __init__(self, app): 
     self.app = app 
    def __call__(self, environ, start_response): 
     from django.core.files.base import ContentFile 

     self.req = Request(environ) 
     import cProfile, pstats 
     prof = cProfile.Profile() 
     prof = prof.runctx("self.get_resp()", globals(), locals()) 

     print "<pre>" 
     stats = pstats.Stats(prof) 
     #stats.dump_stats(output) 
     stats.print_stats(80) 
     print "</pre>" 

     body = self.resp.body # here i should append the stats data 
     self.resp.body = body 

     return self.resp(environ, start_response) 

    def get_resp(self): 
     self.resp = self.req.get_response(self.app) 

app = wsgi.WSGIHandler() 
profiler = AppProfiler(app) 

我如何可以附加探查統計的身體?
還有更好的方法來找出什麼是減慢我的應用程序?
我在我的django視圖中使用了很多模塊導入,有沒有App Engine的導入模塊的方式?

+0

我已經清理了我的django網址和視圖,只留下了一個帶有Hello World消息的視圖,它有500-1s的延遲,對於hello world消息還是很多。 – andrei 2012-08-17 13:21:14

回答

2

有已經可以在你的項目中輕鬆地集成一個真棒WSGI應用程序調用谷歌應用程序內,發動機小型探查

gae_mini_profiler是一個快速下降,在WSGI應用程序,提供無處不在的 分析現有的GAE項目。它爲您選擇的用戶提供RPC 統計數據和標準分析輸出,並在您的生產站點上提供 。只有來自您選擇的用戶 的請求將被分析,而其他人將不會遭受任何性能下降。

請,必須由作者本Kamens看看這個blog post或直奔repo

+1

謝謝!那比我想要的要好。希望我會找到拖拽我的應用程序的東西。 – andrei 2012-08-17 16:14:04

+2

Django模板系統似乎使用965ms中的579ms。{方法'讀取''文件'對象} 303.44ms和{開啓} 275.57ms。我不知道如何優化這個。 – andrei 2012-08-17 16:35:11

1

首先,我不認爲cProfile會工作,因爲它是一個C庫。

當你解決這個問題時,我能想到的最簡單的事情就是將你的分析器數據輸出到日誌中。

import logging 
logging.info("timing info") 

1-2秒是不是與衆不同的啓動請求的 - 也就是說,如果應用程序引擎已經啓動了一個新的實例來處理您的請求。日誌將指出哪些請求是啓動請求。

如果您正在運行很多請求,並且它們仍然需要那麼長時間,那麼您的代碼在某處存在問題。

+0

啓動請求需要更長的時間(10秒)。無論發送多少個請求,它都會保持1-2秒不變。 – andrei 2012-08-17 16:15:49