ほんじゃらねっと

ダイエット中プログラマのブログ

Google App Engine + app-engine-patchでCPU時間を短縮する

本サーバのログを見ていたらCPU警告だらけになっていたので、チューニングして効果のあったものを記録していく。

参考にしたページ

Google App Engineを高速化する3つのtips
http://mattn.kaoriya.net/software/lang/python/20080526182049.htm


ディスク<帯域<CPUの順に制限がキツくなるGoogle App EngineのQuota構成から見るコストパフォーマンスの高いシステム構成
http://coreblog.org/ats/now-we-are-free-from-qota-hell


Google App Engineのmemcacheを試してみた
http://taichino.com/programming/487


Google App Engineのmemcache APIがやばすぎる
http://mattn.kaoriya.net/software/lang/python/20080529202100.htm


Google App Engine 上でスケールするWebアプリを書く(PDF)
http://www.java-users.jp/contents/events/ccc2009spring/materials/A-3-1.pdf

app-engine-patchでプロファイリング

app-engine-patchにはプロファイルモードでテストサーバを起動する機能があり、便利。
http://code.google.com/p/app-engine-patch/wiki/Profiling


下記のようなパターンでテストしている。


settings.py

...
ENABLE_PROFILER = True
SORT_PROFILE_RESULTS_BY = 'cumulative' # default is 'time'
PROFILE_PATTERN = '(?:ragendja.dbutils|google|django|アプリパッケージ名).*'
...

試した対策と効果

count()は使わない

代わりに上記のjava-usersのPDFで説明されているようなインデックス管理クラスを作る。

繰り返し生成するページやデータはmemcacheに格納する
データ取得にはできるだけキーを使ってget()で取得するようにする
クライアント側でできる処理はjavascriptに任せる

ソート処理等をjQueryで行なうようにして、結果をサーバに送るようにする。
ページの変更もjTemplate等を利用して小さく変更する。

app-engine-patchのprefetch_referencesを使う

いまいち効果が分からなかった。
http://code.google.com/p/app-engine-patch/wiki/RagendjaDB


まだ色々できそう。
ちゃんとベンチマークをとってテストしたわけではないので、あとでやる。