セッション管理モジュールやルーティングライブラリが速くなる事で何もしなくても isucon3 予選のperlのアプリケーションが高速化していく
— masahiro nagano (@kazeburo) October 10, 2013
ということで、やってみた。
初期
「オンライン予選で使用した問題が手元で再現できるAMIを公開しました」に書かれているAMIを使って起動し、まず、初期状態でのベンチマークを取ってみる。
2013/10/28 14:21:18 done benchmark Result: SUCCESS RawScore: 865.9 Fails: 0 Score: 865.9
disble?
たぶんミスだと思うのですが、Starmanの起動オプションがdisbleになっていたので修正
- command=/home/isucon/env.sh carton exec -- plackup -s Starman --workers 10 --port 5000 -E production --disble-keepalive app.psgi + command=/home/isucon/env.sh carton exec -- plackup -s Starman --workers 10 --port 5000 -E production --disable-keepalive app.psgi
supervisorctl reloadしてベンチマークを動かすとかなり結果がよくなった
2013/10/28 14:24:15 done benchmark Result: SUCCESS RawScore: 1857.9 Fails: 0 Score: 1857.9
Monoceros & OpenFileCache
次にこのエントリで紹介した、Monoceros と Plack::Middleware::Static::OpenFileCacheをいれる。
diff --git a/app.psgi b/app.psgi index 2fb2ba5..220fd06 100644 --- a/app.psgi +++ b/app.psgi @@ -13,7 +13,7 @@ my $root_dir = File::Basename::dirname(__FILE__); my $app = Isucon3::Web->psgi($root_dir); builder { enable 'ReverseProxy'; - enable 'Static', + enable 'Static::OpenFileCache', path => qr!^/(?:(?:css|js|img)/|favicon\.ico$)!, root => $root_dir . '/public'; enable 'Session', diff --git a/cpanfile b/cpanfile index 25ca66c..21fe478 100644 --- a/cpanfile +++ b/cpanfile @@ -9,3 +9,11 @@ requires "DBD::mysql"; requires "Starman"; requires "Plack::Session"; requires "Cache::Memcached::Fast"; + +requires "Monoceros", 0.26; +requires "EV"; +requires "Guard"; +requires "Sys::Sendfile"; +requires "Linux::Socket::Accept4"; +requires "Plack::Middleware::Static::OpenFileCache";
HelloWorldなベンチマークではStarmanよりMonocerosの方が速いっていうのと、sendfileによって静的画像のレスポンスがよくなるのを狙った。
supervisord.condを書き換えて
- command=/home/isucon/env.sh carton exec -- plackup -s Starman --workers 10 --port 5000 -E production --disable-keepalive app.psgi + command=/home/isucon/env.sh carton exec -- plackup -s Monoceros --workers 10 --port 5000 -E production --disable-keepalive app.psgi
2013/10/28 14:35:00 done benchmark Result: SUCCESS RawScore: 1925.2 Fails: 0 Score: 1925.2
ちょっとスコアあがった。
Starletでも同程度になったので、sendfileは影響ない感じでした。
Kossy 0.23
Kossy 0.23でuri_forとResponse->finalizeの最適化が入っているのでアップデート
diff --git a/cpanfile b/cpanfile index 21fe478..78d7bf9 100644 --- a/cpanfile +++ b/cpanfile @@ -1,4 +1,4 @@ -requires "Kossy", 0.19; +requires "Kossy", 0.23; requires "DBIx::Sunny"; requires "JSON::XS"; requires "Digest::SHA";
また少しスコアあがる
2013/10/28 14:38:03 done benchmark Result: SUCCESS RawScore: 2012.7 Fails: 0 Score: 2012.7
Plack::Middleware::Session::Simple
ここで紹介した、セッション周りの改善。keep_emptyを無効にして空のセッションを保存しない、Set-Cookieを行わないようにした
diff --git a/app.psgi b/app.psgi index 220fd06..2c98b6a 100644 --- a/app.psgi +++ b/app.psgi @@ -16,16 +16,12 @@ builder { enable 'Static::OpenFileCache', path => qr!^/(?:(?:css|js|img)/|favicon\.ico$)!, root => $root_dir . '/public'; - enable 'Session', - store => Plack::Session::Store::Cache->new( - cache => Cache::Memcached::Fast->new({ - servers => [ "localhost:11211" ], - }), - ), - state => Plack::Session::State::Cookie->new( - httponly => 1, - session_key => "isucon_session", - ), + enable 'Session::Simple', + store => Cache::Memcached::Fast->new({ + servers => [ "localhost:11211" ], + }), + httponly => 1, + cookie_name => "isucon_session", + keep_empty => 0, ; $app; }; diff --git a/cpanfile b/cpanfile index 78d7bf9..78d3475 100644 --- a/cpanfile +++ b/cpanfile @@ -15,5 +15,5 @@ requires "EV"; requires "Guard"; requires "Sys::Sendfile"; requires "Plack::Middleware::Static::OpenFileCache"; +requires "Plack::Middleware::Session::Simple";
もうちょいスコア増えた。
2013/10/28 14:46:10 done benchmark Result: SUCCESS RawScore: 2131.1 Fails: 0 Score: 2131.1