9

私のアプリケーションはGoogleAppEngineで実行されており、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()

1回の呼び出しですが、私が見る限り(これは、すべてのGAEベースのアプリで一貫しています)、リクエスト処理サイクル全体で最もコストがかかります。

4

3 に答える 3

10

Arminは、Jinja2テンプレートをPythonコードにプリコンパイルし、コンパイルされたテンプレートを本番環境で使用することを提案しました。そこで、そのためのコンパイラ/ローダーを作成しました。これにより、いくつかの複雑なテンプレートが13倍高速にレンダリングされ、解析のオーバーヘッドがすべてなくなります。リポジトリへのリンクに関する関連する議論はここにあります。

于 2009-06-19T21:02:24.583 に答える
4

OK、皆さん、これは今日 #pocoo で得たものです。

[20:59] zgoda: こんにちは、jinja2 環境作成プロセスを最適化できるかどうか知りたいのですが、問題 -> Jinja2 環境作成の最適化

[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: env の作成をインポートするモジュールに入れます

[21:05] 光彦: いいね

[21:05] mitsuhiko: from yourapplication.utils import env

[21:05] zgoda: すでにある

[21:06] 光彦: うーん

[21:06] mitsuhiko: 問題は、テンプレートがアクセスごとに再コンパイルされることだと思います

[21:06] mitsuhiko: 残念ながら、gae は信じられないほど制限されています。現在、できることがたくさんあるかどうかはわかりません。

[21:07] zgoda: jinja バイトキャッシュを試してみましたが、prod (開発サーバー上) では動作しません

[21:08] 光彦: わかってる

[21:08] mitsuhiko: appengine にはマーシャルがありません

[21:12] zgoda: 光彦: ありがとう

[21:13] zgoda: 何か間違ったことをしていて、これを最適化できることを望んでいました...

[21:13] mitsuhiko: zgoda: 次のリリースでは appengine のサポートが改善されますが、ae の改善されたキャッシングを実装する方法はまだわかりません

Armin は AppEngine でのバイトコード キャッシュの問題を認識しており、GAE でのキャッシュを可能にするために Jinja2 を改善するいくつかの計画を立てているようです。時間が経つにつれて状況が良くなることを願っています。

于 2009-03-08T20:20:49.863 に答える
1

このGoogleレシピによると、 memcacheを使用してバイトコードをキャッシュできます。テンプレート ファイルの内容自体をキャッシュすることもできます。すべて同じレシピで

于 2009-04-30T13:29:51.063 に答える