ISUCON本戦に参加して、特別賞を受賞しました!

こんにちは、メディア事業部でエンジニアをしてるたばたです。
10/5に行われたISUCON 9本選に同期のエンジニアの長谷川、平田とチーム「ARINE」として出場して、特別賞を受賞しました。

ISUCONとは参加者にお題となるWebアプリケーションが与えられ、それを高速化して、決められたルールのもとでスコアをいかにあげるかを競う競技です。今回の本選の問題は新幹線の予約アプリでした。

結果からいうと、当日は順調にスコアが伸びていたのですが、競技終了後のブラウザチェックで引っかかり最終的な順位がつきませんでした。。。とても、すごく、悔しいのですが、一定のスコアに最初に到達できたチームが貰える特別賞を受賞できたのでよかったです。

これはその本選の参加記録です。僕らはRubyを使って参加しました。

当日やったこと

  • 10時
    • ISUCON開始。オープニングムービーが流れる。ISUCON5から予選に出続けたんですが、今まで一度も本選にこれたことがなかったので、これを観て本選にきた感が高まり少し感動。
  • 10時〜11時
    • 予選でサーバーのナンバリングがメンバー間でズレて会話が成り立たなかった反省を生かして事前に用意した鍵を置いたり、.ssh/configを共有してsshする環境を整える。
    • 本選の環境をgitにpushしようとしたら、間違って予選用のリポジトリをcloneしてきて1台環境をぶっ壊す。
    • サーバーに入ってプロセスを確認するとdockerでmysqlも動いているようだったので、mysqlはdockerから外すことにして、DBサーバーの構築も始める。
    • 並行してみんなでローカルで開発できる環境を整える。paymentが起動しないのでとりあえずpaymentの依存を外したり、frontend一式はサーバー上にあったのを持ってきたりする。これでようやくローカルで開発できるようになる。
    • nginxのログをalpで集計できる形式に直してベンチを走らせる。0点
      • とりあえずsearchのAPIが重くて点数がでなさそうなことがわかる。
  • 11時〜12時
    • 遅すぎてスコアでないのでまずインデックスをはって改善を試みる。
    • DBサーバーを構築中に設定したrootパスワードをすぐに忘れて復旧に無駄に時間を使う。
      • その後もdefault_authentication_plugin=mysql_native_passwordを設定してなかったのでユーザー作り直したりして無駄に時間を使った。
    • mysqlサーバーの構築が終わり、Indexをはってベンチを流す。5,089点
  • 12時〜15時
    • alpとpt-query-digestの結果を元に遅いAPIとクエリを中心にN+1の削除とマスターデータのインライン化を行う。
    • seatの重いクエリをなくしたところスコアがグッと上がる。12,867点
    • その後予約可能な日数を20日に増やすことで、15,066点
      • 最速でスコアが15,000を超えたチームに送られる特別賞を獲得!
  • 15時〜16時
    • 引き続きN+1の削除とマスターデータのインライン化を行う。
    • seat masterをインラインにすることで、スコアがまた一気に上がり25,841点
  • 16時〜
    • reserveのAPIの4xx数が多くて原因を探す
      • 予約済みの席に予約とかしてそうなので、その前に呼ばれそうなAPIの高速化をメインに行う。
    • 曖昧予約で席がかぶるんじゃないかってことで、席をランダムにしてみる。
      • スコアは上がらず。
    • だいたい28,000点前後で停滞。
  • 17時半頃
    • アプリの起動設定とかを確認してサーバーをリブートしてベンチが通るか確認する。
      • 無事ベンチは通る。
      • 終了後にブラウザでの挙動チェックで落ちたので、ここで安心しないでちゃんとブラウザから挙動のチェックをしていればよかった。
        • 後半は基本的にデプロイして、webはトップが出るか出ないかくらいしか見ず、ベンチ流してをスコアを見るみたいなことをしてたのがよくなかった、、、定期的にちゃんと目で確認して挙動も見てればなーと後悔が強い
  • 18時
    • 終了!お疲れ様でした。

感想

結果は冒頭にも書きましたが、最後にブラウザチェックで落ちたので最終的には順位がつきませんでした。
スコア的には2番目くらいだったっぽいので、ちゃんと確認しとけばなーと思わずには入られません。すごく悔しいですが、今までの参加した中では(ずっと予選落ちだったので)一番成績が良かったです。なのでそれなりの達成感もありなんとも言えない感じです。

競技中は序盤は色々ミスったりしましたが、中盤くらいから順調にスコアが上がりテンションもうなぎのぼりでした。
予選のときは、デプロイ周りで時間取られたり、ログの集計結果をチームでシェアするのが大変だったりしたので、そこら辺はしっかりスクリプトを準備したのが結構効いてきたと思ってます。

後半は色々改善はしてたのですがなかなかスコアが伸びず、ボトルネックを正しく突き止められなかったのも残念でした。

スコアの遷移

スコアの遷移

予選、本選共に問題がすごい作り込まれていて、取り組みがいありすごい楽しい大会でした。
来年こそは良い順位をとりたいです!

素晴らしい大会を運営の皆様ありがとうございました!