2009-03-06 12 views
9

私のアプリケーションは、Google App Engineの上で実行されていて、要求のほとんどは、常にCPUの使用率が高いためにイエローフラッグを取得します。プロファイラを使用して、私はjinja2.Environmentインスタンスを作成するためのルーチンまで問題を追跡しました。最適化Jinja2の環境の作成

私はモジュールレベルでインスタンスを作成しています:

from jinja2 import Environment, FileSystemLoader 
jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_DIRS)) 

によりGoogleのAppEngineの動作モード(CGI)に、このコードはそれぞれ、すべての要求に応じて実行することができます(そのモジュールのインポートキャッシュはキャッシュするように思えます数分ではなく数秒間)。

私はmemcacheの環境インスタンスを格納考えていたが、ピクルないようです。 FileSystemLoaderインスタンスがpickle化可能なように思われ、キャッシュすることができますが、私はこのアプローチで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ベースのアプリケーション間で一貫性のある)、全体のリクエスト処理サイクルの中で最も高価。

+0

環境のどの部分が痛みを引き起こしていますか?プロフィール情報を見ることはできますか? –

+0

プロファイル情報をありがとう、それは本当に(ピクルに4000コールから離れて)それについての光を出すことはありません!私はすべてを見なければならないと思う。 –

+0

おそらくfreenodeで#pocooに来て、私たちはそれについてチャットできますか? –

答えて

10

Arminは、Jinja2テンプレートをPythonコードにあらかじめコンパイルして、実稼働環境でコンパイルしたテンプレートを使用することを提案しました。コンパイラ/ローダを作成しました。複雑なテンプレートを13倍高速にレンダリングし、すべてを破棄します。の解析オーバーヘッド。リポジトリへのリンクを伴う関連する議論はhereです。

+0

ありがとう、ロドリゴ、それはまさに私が探していたものです。 :) – zgoda

+0

そこにあるほとんどのリンクはもはや有効ではありません。リポジトリを共有していただけますか? – Bugs

4

OK、人々は、これは私が#pocooに今日得たものである:

[午後08時59分] zgoda:こんにちは、私は私Jinja2の環境の作成プロセス、問題を最適化することができれば知りたいのですが - >Optimizing Jinja2 Environment creation

[21時00] zgoda:私は "冷たい" からプロファイラ出力を有するアプリ - >http://paste.pocoo.org/show/107009/

[21:01] zgoda:とは、 "ホット" - >

[21 :02] zgoda:もし私がやや低い"冷たい" 要求のための環境を作るのCPUコスト

[21時05]光彦:zgoda:あなたは

[21時05]光彦インポートモジュールへのenv作成を置く:よう

を[ 21:05]みつひこ:yourapplicationから。utilsの輸入envが

は[21時05分] zgodaは

:それはすでにあります

[21:06]光彦:うーん

[21:06]光彦:私はこの問題は、テンプレートが再していることだと思いますでコンパイルさ各アクセス

[午前21時06]光彦:残念ながら、GAEは、私が現在

を行うことができます多くが存在する場合、私は[21時07分] zgodaを知らない、限られた信じられないです:私は神社bytecacheてみましたしかしそれはprodで動作しません(そのon devサーバ上)

[21:08]光彦:私は知っている

[21:08]光彦:AppEngineのはありませんマーシャル

[午前21時12分] zgoda:光彦は:ありがとう

[21 :13] zgoda:私は何か間違っていると期待していた、これは最適化することができます...

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

ArminはAppEngineのバイトコードキャッシングに関する問題を認識しており、Jinja2を改善してGAEでのキャッシュを可能にする計画がいくつかあります。時間が経てば物事は良くなると思う。

+0

確かに、組み込みのdjangoテンプレートライブラリと同じくらい速く読み込めるようにする方法があるはずです... – gravitation

+0

後でIRC Arminには、 GAEで物事を改善するいくつかの希望があります。 :) – zgoda

+0

Peterhが役立つ投稿を作成しました。http://groups.google.com/group/google-appengine/msg/cf207d882941cf8d – gravitation

2

このように、google recipeによれば、memcacheを使用してバイトコードをキャッシュできます。また、テンプレートファイルのコンテンツ自体をキャッシュすることもできます。

+0

マーシャルはGoogleのアプリエンジンでは使用できないため、レシピの一部が機能しません。私は実際に私のアプリをjinjaに移行しています。どのように行ったのか報告します – bustrofedon

関連する問題