2024年12月8日に開催されたISUCON14に出場しました。
ISUCONへの参加は初です。
ISUCONとは?
端折って説明すると、決められた時間内でアプリケーションをどこまで高速化できるかを競う大会です。
スタートと同時にアプリケーションが動作する CloudFormation が渡されるのですが、このアプリが非常に重い。
アプリの動作を変えぬままあらゆる手段を用いて高速化していきます。
高速化の手法はルールの範囲内なら何をしても構いません。ソースコードをチューニングするなり、DBにインデックスを張るなり自由です。
また、出場者には複数台のサーバーが与えられます。これを全て使うも使わないも またどのように使うのかも自由になります。
詳しくは「ISUCON とは」でググって下さい。
練習
過去問があるのでとりあえず触って雰囲気を掴みます。
AMIが公開されているので、AWSアカウントがあれば簡単に環境構築ができるようになっています。
過去問を解いていて困ったことがあるならば、ベンチーマーカーの問題です。
AMI内にアプリケーション、DB、ベンチマーカーが全て内包されているので 高速化していくにつれベンチマーカーの処理がボトルネックになりスコアが伸びないといった状態に陥りました。
複数台起動してベンチマーカーを分離するよう試みたものの、外部サーバーに向けてベンチマーカーをうまく実行することができずに四苦八苦。
ISUCON13のDNS水責め等、特殊なリクエストをしていそうな年度のものは 避けた方がいいかもしれません。
年度によっては簡単に外部からベンチを実行できる場合もあるようです。
また、ISUCON本とprivate-isuで素振りをしました。
ボトルネック検出のためのアクセスログ解析、スロークエリログの出力など役立つ情報が掲載されています。
とりあえず何やればわからんという方は、本を買って読んでいくのがいいのではないでしょうか。
準備
本番までに準備できるものはしておきます。
- 計測ツールなどのインストール方法
- GitHubのリポジトリ事前作成
- ソースをgitに追加するまでの手順書
- ISUCON本などで得た、各種高速化テクニック手法
- MySQLをGUIで表示するまでの手順
この辺りをメモしておきます。
本番前に一度、リハーサルを行なって上記メモがきちんと正しく書かれているか確認しました。
当日
CloudFormationを使って環境を作成しました。
レギュレーションやアプリケーション仕様が公開されているので、読み込んでいきます。
あとは事前作成したメモに従って、ssh接続から各種計測ツールのインストール、GitHubにソースをプッシュするまで進めていきます。
一通りできたらベンチ実行、初期スコアが低すぎて真顔になりましたが 自分たちだけではないと思うので気にしないことにします。
ここからチューニングスタートです。
私はインフラに偏って担当をしていたので、まずはベンチマーカーを実行させつつサーバー内のCPU使用率の遷移を見ていました。
MySQLのCPUがとんでもなかったのでスロークエリログを確認。重いクエリにインデックスを貼っていきます。
また、検出されたクエリの書き方自体に問題があることも気づいたので、アプリケーションを見てくれているメンバーにお願いして直してもらうことにしました。
MySQLの負荷が下がってきたら私もアプリ側を確認。重そうなクエリ書き換えようかと試みたものの、そこまでスコア変わらず。
しばらく時間を溶かしてしまいました。
中盤でアプリケーションサーバーとDBサーバーを分離しました。
スコアは想像していたよりも上がりませんでしたが、特に事故なく対応できたので満足です。
後半はwebサーバーを触っていることが多く、アプリケーションサーバーを2台構成にしようと試みましたがうまくできず断念。
ラウンドロビン的に振り分ける設定をしようとしたものの、ベンチが失敗の連続になってしまいました。
最後にサーバーを全て再起動してベンチマーカーを再実行。
エラーになって焦るものの、直前のアプリケーションの修正をrevertしたり、設定ファイルの内容を変更することにより回避。
最終スコアは7500点でした。
順位に関してはまだ公表されていないので伏せておきます。公開されたら追記します。
反省
途中無駄にクエリをいじろうとして時間を溶かしたのと、webサーバーを2台構成にできなかったのは反省ポイントです。
webサーバーに関してはコアとなる原因が分かっておらず、自分の考えの甘さが露呈してしまいました。
再起動してベンチ実行ももう少し余裕をみて行なっておけばよかったかなと思いました。
やらずに結果発表時に0点にならなかっただけマシでしたが。
ISUCON出場を通して、多くの知識を取り入れることができたと思います。
最終スコアはさておき、スキルアップのためにも興味があればぜひ参加することをお勧めします。
また、この感想文では具体的な技術エッセンスは残していません。(何のツールを使ったのか、適切なインデックスの貼り方等)
ぜひ本を買いましょう。