ISUCON5 総合4位で予選突破!

いい感じにスピードアップコンテスト(ISUCON)の第5回予選にチーム「chatzmers」で参加し、無事に予選突破しました!

isucon.net

with @Maco_Tasu and @m0t0k1ch1

というわけで当日周辺の出来事、やったことなどを振り返りつつ戦いの記録を残します。

チーム結成〜前日まで

命名

実はあまりよく覚えていないが、いつの間にかメンバーになっていたらしい。
予選当日から一月程前に肉を食いながらチーム名を決めました。チーム名の由来などは@m0t0k1ch1の
ISUCON5 と chatzmers - 予選4位通過編 · m0t0k1ch1st0ry
を参照ください。'z'を付けたのは私です。
肉はうまかった。

この辺りで同時に当日までの各自の分担なども決め、参加申し込み&運営さんとのやり取り、slackのチームを作成、githubのprivate repo作成を行いました。

練習

ぶっつけ本番はまずかろうということで事前に練習を行いました。集まれたのは2回ほど。
練習方法としては、ISUCON4の問題がCloud Storageオブジェクトとして提供されていたためそちらを実際に解いていく形でやりました。ありがたや。
ふんわりと決めた私の分担範囲としてはアプリケーションに対する変更をdeployしたり、同時にbenchmarkを走らせたりという環境整備でした。
アプリケーションと同じホストでbenchmark toolを実行し、scoreを測定する仕組みが提供されていましたので、

  • 手元でブランチを切ってコード変更
  • githubにpush
  • web hookを使って本番でcheckout & pull
  • アプリ再起動
  • benchmark実行
  • 結果をslackに通知

といったあたりをpush以降自動で行えるように整備しました。
あまり触ったことがなかったsupervisorや概念自体は知っていたけど使ったことがなかったgithub web hookを実際に動かせたので良い練習になりました。
(slackのpost.Files APIのchannelsパラメータがchannel nameではなくchannel idを渡すものだというあたりに小一時間ハマったりしていた。)

前日

ほとんど寝ていた。

予選当日

準備

使い慣れた会社の会議スペースを借り、準備しました。
当日朝の #isucon をご覧いただくとわかるように、起床がISUCON参加者たちの最初にして最大の難関であります。幸いchatzmersは開始1時間前には全員が揃っており、無事に競技開始を迎えられました。

やったこと

まずは練習と同じくdeploy環境、benchmark環境を用意するということをやりました。repoは練習と同じものをディレクトリを切って使ったのでツール類はほとんどpathの書き換えくらいでしたが、systemd慣れしていなかったことと、benchmarkが専用のポータルサイトからリクエストする形式でしたので、pushしたらcheckoutするよ、というくらいのところまでになってしまいました。
systemdの設定ファイル見つけるのに手こずった…

この頃他の2人は

  • @m0t0k1ch1 : alp, pt-query-digest等のツールの準備
  • @Maco_Tasu : アプリを読みまくる

というような分担で進めていました。

この辺り、誰かが待ちになってしまうようなことなく、作業に入れたのは非常に良かったと思います。

一通り計測ツール、deploy環境が整ったあたりで@Maco_Tasuがめぼしいボトルネックを挙げ、それを分担して改善していきました。
問題のアプリは少し懐かしい香りのするSNSサイトでISUCON4に比べるとかなり重厚。ユーザー、フレンド、記事、コメント、足あとなどを主な機能とするものでした。

私は主に足あと周りとコメント周りを担当しました。
足あとはとりあえずuser_idにインデックスを張り、group byの無駄な指定を省きました。timestampをscoreにしてsorted setだなーというアイディアはありましたが、一旦保留に。
コメントは、redisを使って参照の高速化を図りましたが、mysqlから初期データを読み出すところでinitializeの時間制限に関するレギュレーションに違反してしまい、うまく行きませんでした。これと同時に足あとのsorted set案も諦めてしまいました。
答え合わせidobataでfujiwara組(予選総合1位)からaofで〜というのが出ててなるほど流石という感じ。AWSのElasticacheを業務で触ったときに一通り調べて知っていたはずなんですが、なかなかとっさには出てきませんでした…

さて、その他の具体的な実施内容は2人の記事が詳しいのでそちらに譲るとして…
ISUCON5 予選4位通過でした - 眠すぎて明日が見えない
ISUCON5 と chatzmers - 予選4位通過編 · m0t0k1ch1st0ry

方針、暗黙のチームルールっぽいもの

実はこの3人、新卒時に社内で行われたミニISUCONに(それぞれ別のチームで)参加したことがあります。その時は新卒勢は全員fail(記録なし)という散々な結果でした。
というのに加え、自社サービスの保守、運用を主な業務としているメンバーでしたので、不可逆な変更、大きな変更に対しては注意深くすすめる事ができました。

  • 変更は基本的に各自のbranchで
  • 多種の変更を同時に(同じbranchで)行わない
  • push前にbenchが実行中かどうかを確認
  • benchにfailしたもの、スコアが上がらなかったものはmasterに取り込まない

というようなことを違和感なく、スピードを落とすことなく実行できたのはプラスになったと思います。

一方で初期データの破損を恐れて、schemaの変更を避けたり、redisへの置き換えを早々に諦めたりしていたので、snapshotからの復元や別インスタンスを立ててバックアップとするなど、クラウドプラットフォームらしい可逆性の担保も視野に入っていればもう少し大胆な改修もできたかなぁというところです。

まとめ

ISUCON楽しい!
楽しかったです!8時間まるまる集中してて最後は本当にヘトヘトでしたが、ものすごく充実感がありました。
メンバーの2人も同じ会社とは言え一緒のプロダクトで関わったことがなかったので新鮮でした。ありがとう!

最後になりますが、このような素晴らしい場を作り上げて下さった運営の皆さん、本当にありがとうございました!

本選も頑張ります!