🏃

ISUCON13に初参加した感想

2023/12/03に公開

はじめに

ISUCON13に初参加してきました!
思った以上にいい経験だったので、ブログに書こうと思います。
先に結果だけ書くと、最終スコアが10,539点で、順位は238位/661チームでした!

参加のきっかけ

元々、ISUCON自体は昔から知っていて、いつか参加したいなあと思っていました。
どうせやるならチームでやりたいなあと思っていたので、会社の同期に声をかけてみました。
すると、同期2人が「やろう!」と言ってくれたので、参加することにしました。

本番までの練習

さて、参加が決まったので、10月から毎週の土日に3人で集まって練習しました。(海の見える宿で合宿などもしました)

集まったものの、全員が初参加だったので、とりあえず過去問を環境構築しました。
ここで、ISUCONの問題のクオリティに衝撃を受けました。(笑)
こんなにもきちんとしたWebアプリのチューニングなのかと。フロントエンドも作り込まれていて、運営さんすごいなぁと思いました。

さて、いざ環境構築したものの、なにをすればよいかわからなかったので、ブログをたくさん読みました。
すると、「推測するな、計測せよ」という言葉が多く出てきたので、まず計測の基盤を整えることを行いました。

事前に、alpやslowqueryの計測結果をログに残していく仕組みを作りました。
本番では、こちらの計測基盤を使用していくことにしました。
ちなみに、NewRelicなどのリッチな計測ツールを導入することも考えたのですが、導入で沼りそうという判断で、今回はなしにしました。

計測基盤が導入できたので、INDEXを貼ったりN+1を解消したりしました。
インフラ構成を変更する練習は時間的にできませんでしたので、今回はINDEXとN+1を着実にやっていくという戦略になりました。

本番の時系列

9:00 ~

9時に借りていた会議室に集合し、準備をしました。
Githubリポジトリを用意していないなど直前に色々焦ってしまいました。

9:30 ~

問題解説がスタートしました。
Youtubeライブの不調により、数分遅れており、「今回の問題はライブ配信のチューニングか!?」というコメントがあり、笑っていましたが、まさか本当だったので衝撃を受けました。
運営さんの素晴らしい伏線回収に感動しました。

10:00 ~

いよいよ、大会スタートです。
まずは、以下の役割に分けて作業を行いました。

  • SSH鍵の登録やコードのgit管理
  • 計測基盤の導入
  • アプリの理解

これらは練習通りに行くことができましたが、1時間半ほどかかってしまいました。
アプリの理解は私が担当しました。今回DNSがキーとなっているようでしたが、結局なにも手は打てませんでした。。
ただ、DNSのAレコードをDBで管理する設計があるんだな〜ということを知れました。

12:00 ~

計測の基盤が整ったので、ベンチを回します。初期ベンチが成功したときは、非常にうれしかったですね。
初期スコアは3,761点でした。

午前はここまでにして、お昼にしました。

13:00 ~

さて、午後からはチューニングをしていきました。
まずは、slowquery logを見て、INDEXを一つずつ貼っていきました。
今回は、①EXPLAINでINDEXが効いているかを確認 → ②PRを作成 → ③マージして検証 というステップで行いました。
実務ではそうするべきだと思いますが、ISUCONでは時間との戦いでもあるので、「次回からはINDEXはサクッと貼ってしまう戦略でもいいかもね」という話をしました。

INDEXをいくつか貼り、 3,761点7,394点までスコアが伸びました。

15:00 ~

残り時間で一気にスコアを伸ばすために、DB構成を分けようという判断をしました。
しかし、ここは練習で一回もやったことがなかったので賭けの状態でした。
メンバーにインフラエンジニアはいませんでしたが、私はAWSをよく触っていたこともあり、私がリードしてインフラ構成の変更にチャレンジしました。

AWSのセキュリティグループの変更、mysql設定ファイルの変更、DBサーバーの向き先などの設定を変更し、無事DBサーバーの分離に成功しました。

そして、ベンチを回すと、7,394点10,415点になりました。
このとき、嬉しすぎて全員で抱き合いました。青春ですね。

17:00 ~

DB分離が終わった時点で、残り1時間だったので、下手に変更してFAILすることが怖かったので、安全にできるプチ改善を行うようにしました。
具体的には、ログを止めて、スコアアップを図りましたが、あまり変わりませんでした。

17:30 ~

この時点での最終スコアは9,000点代だったので、ベンチガチャを回して10,000点行きたくね? となったので、ベンチガチャを回しました。
2回ほど回し、過去最高点がでたので、ストップしました。
最終スコアは10,539点でした。

ベンチ記録

以下が記録です。

感想

ただただ楽しかったです。
運営さんとメンバーには本当に感謝です。
メンバーとは毎年出よう!という話になったので、来年が楽しみです。
また、練習した成果はしっかりと出せて、それ以上の成果も出せたので非常に満足のいく結果でした。

次回に向けて

次回は100位以内を目指したいです。
個人的には以下のアクションを取っていきたいです。

  • 計測指標を増やす(top, alp, slowquerylogに加えてより高度な情報が得られるツール)
  • 計測の基盤を30分以内に整えられるようになる
  • INDEXをなるべく早く貼り、それ以外の改善に時間を使う
  • サーバーの分離方法を手順化しておく

Discussion