2

我有一个 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 方法来导入模块?

4

3 回答 3

3

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

gae_mini_profiler 是一个快速的 WSGI 应用程序,它提供对现有 GAE 项目的无处不在的分析。它为您在生产站点上选择的用户公开 RPC 统计信息和标准分析输出。只有来自您选择的用户的请求才会被分析,其他人不会遭受任何性能下降。

请看一下作者 Ben Kamens 的这篇博文,或者直接访问repo

于 2012-08-17T13:22:30.650 回答
1

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

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

import logging
logging.info("timing info")

1-2 秒对于启动请求来说并不少见 - 即,如果 App Engine 必须启动一个新实例来处理您的请求。日志将指示哪些请求是启动请求。

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

于 2012-08-17T15:57:58.980 回答
0

你应该使用appstats。这个工具正是为此而制作的。 https://developers.google.com/appengine/docs/python/tools/appstats

于 2012-08-17T13:11:29.673 回答