ISUCONに初めて参加してきました!
先日(2023年11月25日)開催されたISUCON13に初めて参加してきました!
ご存知の方も多いかと思いますが、ISUCONとはIikanjini Speed Up Contestの略で文字通りあるwebサービスをいい感じに高速化する競技です。
今年のテーマは「ISUPIPE」と呼ばれるYOUTUBEのような投げ銭システムがある動画配信サービスの高速化でした。
事前準備でしたこと
まずはISUCON本と呼ばれる「達人が教えるWebパフォーマンスチューニング 〜ISUCONから学ぶ高速化の実践」を購入し本番までに一通り手を動かしつつ読んでみました。
ISUCONで求められるスキルとしては「推測するな、計測せよ」という有名なフレーズがあるように(Rob PikeのNotes on Programming in Cからの引用)、ボトルネックがたくさんあるwebサービスを様々な角度から計測し速度改善を行うサイクルを如何にたくさん回せるかが求められます。
この本ではDBやAPIサーバーの計測方法から実践練習まで紹介しており基礎を学習する上でとても勉強になりました。
ISUCON初めて参加する方にとっては必読本と言えるかと思います!(アフェリエイトリンクではないですヨ)
そして次に行ったのが過去のISUCONの講評と座学などを一通り見ることです。
ISUCON公式サイトにわかりやすくまとまっているのでとても便利でした。
ほんとは何回か過去問も解きたかったのですがISUCON開催二日前に大きめのリリースを控えておりバタバタしてあまり準備が進みませんでした...まぁ初参加なので当たって砕けろの精神で挑むことにしました。
当日の流れ
8:30 起床
10時から開始ということで8:30に起きました。
起床の時点で勝負は始まっているので前日にはしっかり寝てちゃんと朝起きれることが求められます(ここ大事)。
今回は社内の同じバックエンドエンジニアの同僚と二人で参加しオフィスから参戦することにしました。
オンサイトでコミュニケーションすることで些細なことでもカジュアルに話しかけやすくなるので同じ空間で臨んだのはとても良かったように思います。
9:30 会場中継開始
9:30ごろからISUCON公式Youtubeチャンネルで会場の実況中継及びスポンサーの紹介、コンテスト内容の紹介が始まりました。
抽選ですが公式会場となっているLINE社のオフィスを借りて当日競技に参加することもできるみたいなので来年は抽選参加してみようかと思います!(Discord普段あまり使わず完全見逃していました...ISUCONの連絡は基本Discordなので通知ONにすることを忘れずに)
今回テーマとなるISUPIPEの紹介動画はとてもクオリティが高くて運営の方の準備の大変さが想像できました。
賞品も発表されとてもワクワクした状態で始まったのを覚えています。
10:00 ISUCONスタート!
まずはISUCON portalにログインしマニュアルと環境構築方法を見ました。
環境構築は基本的にcloud formationのyamlファイルをアップロードするだけで構築でき少しデプロイに時間がかかるのでまずcloud formationをアップロードした後デプロイ待ちの時間でマニュアルを読み込むのがいいのかな、と思いました。
業務でpythonを普段使っているので参考実装をpythonに切り替えとりあえずbenchマーカーを回すことを目標に進めていきました。
開始15分ほどで初回のbenchを回せたのはまずまずの滑り出しだったように思います。
初回のスコアは3,542点でした。
benchマーカーのセットアップと同時に以下のようなデプロイ手順を作成しました。
- gitにサーバー内のソースコードをアップロード
- nginxの再起動手順
- mysqlの再起動手順
一通りデプロイ手順の作成が終わると次は計測するための準備を進めていきました。
あっという間に時間が過ぎこの頃はもう11時を過ぎていた記憶です。
nginxのaccess_log、mysqlのslow-queryを出力するためのconfファイルの修正及びログファイルローテーション手順を作成しました。
またnginxのaccess_logを分析するためのalpの導入、mysqlのslow-queryを分析するためのpt-query-digestのインストール及びコマンドの作成を進めました。
12:00 もぐもぐタイム(お昼ご飯)
事前に買っていたコンビニ飯をレンジでチンし昼ごはんを食べながら雑談しつつ手を動かしていました。
この頃benchマーカーに不具合がありスコアの計測ができず何かやらかしたのかと焦っていた記憶です(Discordですぐannounceされていたので競技中もDiscord check必須です)。
13:00 計測→改善→計測
まずはslow-queryのログベースでindexを貼ることから始めました。
slow-queryを吐いているソースコードを検索していい感じにindexを貼ると4,706まで得点が伸びました。
この時一旦他のindexの追加は後回しにしN+1の改善に手を出してしまったのですがindexの追加だけで1万点くらいまで上がったというコメントを見かけたので特に何も考えずアプリケーションで呼んでいるクエリを全て確認しindexをとりあえず全部追加するのでも良かったのかもしれません。(indexはコスパがいいので)
N+1もすごい量がありやっとの思いで一つ直したもののあまりスコアは伸びず、計算結果をDBに保存してしまうなど柔軟な発想ができれば良かったな、と感じております。
今回の大会の目玉であるPowerDNSやEtag周りの改善は業務でほとんど使った経験が無かったのもありあまり改善できませんでした。
DNS水責め攻撃の解消が一つのテーマになっていたかと思いますが正直初めて耳にした言葉でした。
大会終了後、出題者のさくらインターネットさんが記事で詳しく取り上げていたので拝読させていただきました。
17:00 お片付け
終了一時間前くらいからログ出力の停止や再起動して問題なく動くかなどのお掃除を始めました。
ログ出力停止しても特にスコアは伸びなく、余った時間でインフラ構成を変更するか?などの話も上がったのですがこれでbenchマークが回らなくなり失格になったら嫌だなと思ったのでそっとしておくことにしました。
上位スコアのチームはappとDBとPowerDNSでサーバーを分けていたそうなのでインフラ構成の最適化も15時くらいに考え始めれば良かったかな、と思います。
18:00 ISUCON終了
8時間に及ぶISUCONが終了しました!
最終スコアは5,100点でした、一番高いスコアが出たのは15:34:48時点での5,695点だったので後半あまりスコアを伸ばせず悔しかったです。
以下benchマーク実行結果一覧です。
大会を終えて
ISUCON初参戦でしたが運営の方、参加者の熱意が伝わってきてとても楽しかったので今後も参加したいと思いました。
悔しい部分もあったもののパフォーマンス改善の基礎となる、計測して改善するというサイクルが回せたので合格点かなと思います!
次参加するときは自作profilerや設定ファイルのテンプレを用意し高得点狙っていきたいです。