App Engine WSGI中间件分析器

时间:2012-08-17 13:02:20

标签: django google-app-engine python-2.7 wsgi cprofile

我有一个Django应用程序,我决定移植到Google App Engine 我决定使用NDB作为我的数据库并移植所有模型(包括django用户)。阅读文档一周后(App Engine文档很糟糕,给出的示例经常过时而且不再起作用)并移植应用程序,当我运行它时它非常慢:1s-2s延迟时间为空数据库。
ndb查询不需要花费太多时间(少于50毫秒),Appstats应用程序不会显示任何其他内容。
我决定使用cProfile并创建了一个wsgi中间件,但我无法弄清楚如何打印输出。方法pstats让我打印输出或将其保存到文件中,我不能在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导入模块的方式?

3 个答案:

答案 0 :(得分:3)

已经有一个非常棒的WSGI应用程序可以轻松集成到您的项目中,名为 google-app-engine-mini-profiler

  

gae_mini_profiler是一个快速插入式WSGI应用程序,提供无处不在的应用程序   分析您现有的GAE项目。它暴露了两个RPC   您选择的用户的统计信息和标准分析输出   你的生产现场。只有来自您选择的用户的请求   将被描述,其他人将不会遭受任何表现   降解。

请由作者Ben Kamens查看blog post或直接访问repo

答案 1 :(得分:1)

首先,我认为cProfile不会起作用,因为它是一个C库。

当你解决这个问题时,我能想到的最简单的事情就是将你的探查器数据输出到日志中。

import logging
logging.info("timing info")
对于启动请求,1-2秒并不是不寻常的 - 即,如果App Engine必须启动一个新实例来处理您的请求。日志将指示哪些请求是启动请求。

如果您正在运行许多请求,并且它们仍然需要很长时间,那么代码中的某个地方就会出现问题。

答案 2 :(得分:0)

你应该使用appstats。这个工具完全是为了这个。 https://developers.google.com/appengine/docs/python/tools/appstats