【发布时间】:2010-10-11 18:07:06
【问题描述】:
我的应用程序在 Google App Engine 上运行,并且由于 CPU 使用率高,大多数请求不断收到黄旗。使用分析器,我将问题追溯到创建 jinja2.Environment 实例的例程。
我正在模块级别创建实例:
from jinja2 import Environment, FileSystemLoader
jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_DIRS))
由于 Google AppEngine 操作模式 (CGI),此代码可以在每个请求上运行(它们的模块导入缓存似乎将模块缓存几秒钟而不是几分钟)。
我正在考虑将环境实例存储在 memcache 中,但它似乎不可提取。 FileSystemLoader 实例似乎是可腌制的并且可以被缓存,但我没有观察到这种方法对 CPU 使用率的任何实质性改进。
任何人都可以建议一种方法来减少创建jinja2.Environment 实例的开销?
编辑:下面是分析器输出的(相关)部分。
222172 function calls (215262 primitive calls) in 8.695 CPU seconds
ncalls tottime percall cumtime percall filename:lineno(function)
33 1.073 0.033 1.083 0.033 {google3.apphosting.runtime._apphosting_runtime___python__apiproxy.Wait}
438/111 0.944 0.002 2.009 0.018 /base/python_dist/lib/python2.5/sre_parse.py:385(_parse)
4218 0.655 0.000 1.002 0.000 /base/python_dist/lib/python2.5/pickle.py:1166(load_long_binput)
1 0.611 0.611 0.679 0.679 /base/data/home/apps/with-the-flow/1.331879498764931274/jinja2/environment.py:10()
一个调用,但据我所知(这在我所有基于 GAE 的应用程序中都是一致的),是整个请求处理周期中最昂贵的。
【问题讨论】:
-
环境调用的哪一部分导致了痛苦?我们可以查看个人资料信息吗?
-
感谢您的个人资料信息,它并没有真正阐明它(除了 4000 次调用 pickle!)。我想我需要看到整个事情。
-
或许来freenode的#pocoo,我们可以聊聊?
-
我对在 App Engine 上使用 jinja2 非常感兴趣,因此很高兴听到您在这方面取得的任何进展。
-
好的,我会尝试在各个州收集尽可能多的分析数据。
标签: python google-app-engine jinja2