ISUCON13 に参加した
今年もお誘いがあったので ISUCON に参加しました。今年は、英語学習がうまくいかなかったり、育児がうまくいかなかったり、顔にニキビが3つもできてしまったり、いろいろ不調だったのですが、なんだかんだ去年の3倍近いスコアを出すことができました。
当日のことを少し振り返ってみます。まず朝は絶対に失敗できないと思っていたので、アラームが鳴る前に起床しました。着替えを済ませ、スープで体を温めます。すぐさま電車で移動しました。
無事メンバーと合流。出題動画で笑わせてもらったあと、問題文を読み、ひたすらパフォーマンスチューニングをしました。
インフラとデータベースは他のメンバーにまかせて、私は2つほどアプリケーションチューニングをしました。まずは、一番遅いエンドポイントに注目しました。単純にクエリの数が多かったのでGROUP BY や INNER JOINを使う実装に置き換えました。今回はirbで少しずつ動作確認したのでベンチマークテストも一発でパスできました。このあたりはスコアも順調に伸びていてかなりテンションが上がっていました。
続いてIN句を使うチューニングも試みました。しかしコードが入り組んでおり、互換性を壊してしまったためリバートしました。このタイムロスがかなり大きかったと思います。
もう一つ、キャッシュを利かせるチューニングもしたのですが、こちらもベンチマークテストに失敗しました。数時間後に、つまらないミスが原因だとわかりました。メンバーのおかげでスコアを取りこぼさずに済んだのですが、ここはもっと掘り下げてすぐ訂正するべきだったなと思いました。
残り2時間ほどになったところでデータベースサーバーとアプリケーションサーバーを分ける構成にトライしました。データベース接続は成功しました。しかし、うまくベンチマークテストを通すことができずにあっという間に時間がなくなりました。デバッグをしようにも、500エラーが表示されるばかりでログがとれないため手詰まりでした。
猶予20分になったところで、撤退を決断。安定動作していた1台構成のまま投了となりました。最終スコアは14049でした。去年は5000点を超えられなかったことを考えると、まずまずの成長のように思います。メンバーとカレー屋でささやかな打ち上げをしました。いくつかのチューニング案を話し合いましたが、現在のスキルでは実現性の低いものしか残っていませんでした。まとめると「頑張ったな」「疲れたね」くらいしか言えなかった気がします。
去年も同じようなことを思ったのですが、出題されている環境は、不親切なものとなっています。コードはフレームワークはもちろん、ファイルを分割して構造化するといった工夫もされていません。テストはなく、ローカル環境構築はできません。バージョン管理もされていません。監視ツールも、デプロイツールもありません。文明が失われてしまったかのような、ノスタルジックな趣さえあります。そんな前時代的なアプリケーションを8時間でチューニングするのがISUCONです。荒れ果てた荒野のようなアプリケーションに、文明の利器を次々に投入し、開発体制を整え、性能を倍増させていくのは非常に楽しいです。まだまだ上手くできなかったこともたくさんあります。次の機会があるなら、もっと上手くやりたいと思いました。