本サーバのログを見ていたら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
まだ色々できそう。
ちゃんとベンチマークをとってテストしたわけではないので、あとでやる。