できるだけ速く表示されるサイトを作ることは、ユーザビリティの面でかなり重要です。そのためには、実際に今のサイトのどこが重いのかを知る必要があります。そのために使うのがプロファイラです。

例えば、
・WindowsアプリではIntelのvTunes
・AndroidアプリではTraceView
・iPhoneアプリではInstruments
がデファクトですが、GoogleAppEngineではAppStatsというものが用意されています。公式ドキュメントは”Appstats for Python”で、その日本語訳が”appengine/pythonのappstatsのページを訳してみるよ”で公開されています。

AppStatsを使うのは簡単で、appengine_config.pyを作ります。

def webapp_add_wsgi_middleware(app):
 from google.appengine.ext.appstats import recording
 app = recording.appstats_wsgi_middleware(app)
 return app

次に、setting.pyを作ります。

MIDDLEWARE_CLASSES = (
 'google.appengine.ext.appstats.recording.AppStatsDjangoMiddleware',
)

最後に、app.yamlに次の行を追加します。

- url: /stats.*
 script: $PYTHON_LIB/google/appengine/ext/appstats/ui.py

後は、http://www.illustbook.net/statsのようにstatsディレクトリにアクセスすればOKです。(管理者権限が必要です)

すると、次のような画面になります。

top


AppStatsでは、データストアアクセスなどのRPCの数と処理時間がカウントされています。重い順にランキングで表示されます。右端の数字をクリックすると、特定のHTTPアクセスのプロファイル結果を取得することができます。


profile



こんな感じで、どの処理に時間がかかるかグラフィカルに分かります。想像以上にdb.getが多いですね。


code



グラフのバーをクリックすると、RPCの詳細が見えます。


count



ソースコードの名前をクリックすると、ソースコードのどの位置で呼ばれたかまで分かります。思ってもみなかった所で無駄な処理をしていたりするので、一度、AppStatsで自分のサイトを見てみるのは有意義だと思います。前述したようにイラストブックでも使わないカウンター値をdb.getしまくっていて悲惨な感じだったので直しておきました。

result


memcached軽すぎる!