【问题标题】:Optimizing Jinja2 Environment creation优化 Jinja2 环境创建
【发布时间】: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


【解决方案1】:

Armin 建议将 Jinja2 模板预编译为 python 代码,并在生产中使用编译好的模板。所以我为此制作了一个编译器/加载器,它现在将一些复杂的模板渲染速度提高了 13 倍,从而消除了所有的解析开销。与存储库链接的相关讨论是here

【讨论】:

  • 谢谢,罗德里戈,这正是我一直在寻找的。 :)
  • 那里的大部分链接都失效了。可以分享一下仓库吗?
【解决方案2】:

好的,伙计们,这就是我今天在#pocoo 上得到的:

[20:59] zgoda:你好,我想知道我是否可以优化我的jinja2环境创建过程,问题-> Optimizing Jinja2 Environment creation

[21:00] zgoda:我有来自“冷”应用程序的分析器输出 -> http://paste.pocoo.org/show/107009/

[21:01] zgoda: 和“热” -> http://paste.pocoo.org/show/107014/

[21:02] zgoda:我想知道我是否可以降低为“冷”请求创建环境的 CPU 成本

[21:05]mitsuhiko:zgoda:将环境创建放入您导入的模块中

[21:05] 光彦:喜欢

[21:05]mitsuhiko:从 yourapplication.utils 导入环境

[21:05] zgoda:它已经在那里了

[21:06] 光彦:嗯

[21:06]mitsuhiko:我认为问题在于每次访问都会重新编译模板

[21:06]mitsuhiko:不幸的是,gae非常有限,我不知道我目前能做多少

[21:07] zgoda:我尝试使用 jinja bytecache,但它在 prod 上不起作用(它在开发服务器上)

[21:08] 光彦:我知道

[21:08]mitsuhiko:appengine 没有元帅

[21:12] zgoda:mitsuhiko:谢谢

[21:13] zgoda:我希望我做错了什么,这可以优化......

[21:13] mitsuhiko:zgoda:下一个版本将提供改进的 appengine 支持,但我还不确定如何为 ae 实现改进的缓存

看来 Armin 已经意识到 AppEngine 上的字节码缓存存在问题,并计划改进 Jinja2 以允许在 GAE 上进行缓存。我希望随着时间的推移事情会变得更好。

【讨论】:

  • 肯定有办法让它的加载速度至少和内置的 django 模板库一样快,除非他们给它某种特殊的预加载权限......
  • 后来 IRC Armin 说他对如何改进 GAE 有一些想法。有一点希望。 :)
  • Peterh 发表了一篇可能对您有帮助的帖子:groups.google.com/group/google-appengine/msg/cf207d882941cf8d
  • 我看到了,缓存模板加载器是我下一步可能优化的事情,但这并不能解决环境创建开销(以及在每个请求上重新编译模板)。
【解决方案3】:

根据这个google recipe你可以使用memcache来缓存字节码。您还可以缓存模板文件内容本身。都在同一个食谱中

【讨论】:

  • marshal 在 google 应用引擎上不可用,因此部分配方不起作用。我实际上正在将我的应用程序迁移到 jinja。将报告进展情况
  • 无效的链接伴侣
猜你喜欢
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 2017-04-02
  • 2021-07-30
  • 1970-01-01
相关资源
最近更新 更多