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 中间件分析器的主要内容,如果未能解决你的问题,请参考以下文章