我有一个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导入模块的方式?
答案 0 :(得分:3)
已经有一个非常棒的WSGI应用程序可以轻松集成到您的项目中,名为 google-app-engine-mini-profiler 。
gae_mini_profiler是一个快速插入式WSGI应用程序,提供无处不在的应用程序 分析您现有的GAE项目。它暴露了两个RPC 您选择的用户的统计信息和标准分析输出 你的生产现场。只有来自您选择的用户的请求 将被描述,其他人将不会遭受任何表现 降解。
答案 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