App Engine WSGI 中间件分析器

Posted

技术标签:

【中文标题】App Engine WSGI 中间件分析器【英文标题】:App Engine WSGI middleware profiler 【发布时间】:2012-08-13 22:27:39 【问题描述】:

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

【问题讨论】:

我已经清理了我的 django url 和视图,只留下了一个带有 Hello World 消息的视图,它有 500-1 秒的延迟,对于 hello world 消息来说仍然很长。 【参考方案1】:

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

gae_mini_profiler 是一个快速的 WSGI 应用程序,它提供无处不在的 分析您现有的 GAE 项目。它暴露了 RPC 为您选择的用户提供统计信息和标准分析输出 您的生产现场。仅来自您选择的用户的请求 将被分析,其他人不会受到任何性能影响 退化。

请看作者 Ben Kamens 的 blog post 或直接访问 repo。

【讨论】:

谢谢!这比我想要的要好。希望我能找到拖累我的应用程序的原因。 django 模板系统似乎使用了 965ms 中的 579ms。method 'read' of 'file' objects 303.44ms 和 open 275.57ms。我不知道如何优化它。【参考方案2】:

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

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

import logging
logging.info("timing info")

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

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

【讨论】:

启动请求需要更长的时间(10s)。无论我发送多少请求,它都保持恒定的 1-2 秒。【参考方案3】:

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

【讨论】:

正如我所说,我使用了 appstats,但它只显示数据存储查询。

以上是关于App Engine WSGI 中间件分析器的主要内容,如果未能解决你的问题,请参考以下文章

Flask 中间件

Flask快速入门(10) — 中间件

Django中间件详解

flask中间件和LOCAL对象

[oldboy-django][2 深入django] django一个请求的生命周期 + WSGI + 中间件

Flask - 中间件