ISUCON4で本戦通過できました(Printemps参戦記)
ISUCON4の予選結果が確定しまして、KLabからは3チームが本戦通過するという結果になりました。1チームについては「ISUCON4 予選で workload=5 で 88000点出す方法 (lily white 参戦記)」で既にお伝えしていますが、別チームの雰囲気もまとめてみます。
我々はPrintempsというチーム名で予選1日目に参加しました。最終スコアは40418点で、全体16位での通過となりました。参加メンバーは@hnw、@shohei909、@dimoltoの3人、利用言語は全員が確実に読み書きできるPHPでいくことにしました。
ちなみに、我々は1インスタンスで3人が同時に作業する方針でした。@shohei909がアプリの改修、@dimoltoがミドルウェアの設定など、@hnwがstrace職人やその他モニタリング、という役割分担で考えていました。
9時30分
会社に集合。ディスプレイを会議室に持ち込むなどしました。KLabからは複数チームが参加したので、それぞれ別の会議室に閉じこもるような運用でした。
10時
PHP実装は最初からphp-fpm(PHP5.6.0)+nginxという最新環境だったのでそのまま使うことにして、APCuエクステンションだけは自前ビルドしました。
@dimoltoがお決まりの内容をあれこれ設定。
@shohei909が一番重いSQLを書き直し、indexを2本作りました。
12時
dstatを見ていると明らかにidleが多いので、workloadを増やしてみました。スコア22000(workload=4)。
@dimoltoがベンチマーク用のシェルスクリプトをまとめてくれて、URLごとの平均レスポンスタイムが気軽に見えるようになりました。便利!
@shohei909がlogin_logテーブルから1カラム減らすような大改造に着手しました。
14時
@hnwがトップページをnginxで静的化できると判断して設定を試みるも苦戦。
@shohei909はAPCuをデータキャッシュとして使ってSELECT文の発行を抑えたりしていました。
16時
nginxの設定が完成しました。nginxだけでcookieの読み書きができれば一定速くなる、というのは出題側が意図していた内容だろうと思います。この時点での設定は次のようなものでした。
location ~ ^/$ { root /home/isucon/webapp/static/; index index_$cookie_notice.html; } location ~ ^/index_.html$ { types { } default_type text/html; alias /home/isucon/webapp/static/index_default.html; add_header Set-Cookie notice=default; expires off; } location ~ ^/index_(default|locked|banned|wrong_id|noauth)\.html$ { types { } default_type text/html; root /home/isucon/webapp/static/; add_header Set-Cookie notice=default; expires off; }
ここでスコア30000(workload=6)。
16:50頃に、リスク回避のため以降のアプリ改修を行わないという判断をしました。
17時
未着手だったmy.cnfの修正にとりかかりました。これを後回しにしていたのは明らかに作戦ミスです。
それまで各テーブルがMyISAMになっていたことに全く気付いていませんでしたが、下記設定を含んでいたおかげでInnoDBになって超速くなりました。ラッキーにも程がありますね。
default-storage-engine=InnoDB
何度か試して、良い方にブレたときのスコア42000(workload=8)で提出しました。
18時過ぎ
AMIを作って再起動するとベンチマーカーがfailすることに気付きましたが、あきらめて飲みに行きました。
23時過ぎ
ベンチマーカーが動かない件はsysctl -wで設定した値を/etc/sysctl.confに書き写すのを忘れていたというだけでした。init.shなどを整理して無事提出しました。
後日談
改めて見直したところ、xdebugエクステンションを外していなかったことに気付きました。外して試すとスコア47000程度。
また、nginxの設定を見直せば内部リダイレクトを1回減らせることにも気付きました(上記設定の2ブロック目)。スコアは48000程度。
さらにAPCuを利用してSQLの発行を減らすなど地道な作業を重ねた結果、スコアは50000になりました。全然ドヤれる数字ではありませんが、nginx設定さえできれば全チームこの程度のスコアは出せたのではないでしょうか。ご参考まで。
おわりに
多くのラッキーと@methaneにもらった秘伝のタレに救われての予選通過となりました。xdebugを外し忘れていたのも通過したからこその笑い話と言えますね。本戦は不安しかありませんが、頑張ります。