ISUCON13 参加記 Create Speedy Logic(28位 56,881)
ISUCON13に「Create Speedy Logic」というチームで参加し、最終スコアは56,881点で28位でした。去年に続き2回目の参加になりますが前回参加はブログを書いてなかったので終えられていなかったようです(ブログを書くまでがISUCONらしい)。今回こそは終えられるように書いてみました。
もっとこうしていればとかはもちろんあるのですが、今回(ライブでの結果発表時点では30位だったので)丁度企業賞をもらえたりTOP30チーム入りという結果も残せたので嬉しく思います。
28位 56,881 Create Speedy Logic
問題
https://github.com/isucon/isucon13
ISUCON13 出題動画を公開しました🚀 こんいす〜!#isuconhttps://t.co/w6ImVK2gqq pic.twitter.com/HY3dx3SZYM
— ISUCON公式 (@isucon_official) November 25, 2023
スコアが投げ銭の合計なのが面白いですね。
単なるパフォーマンスチューニング以外にもDNS水責め攻撃の対応も必要そうとのこと。
事前の戦略
参加にあたって事前に決めた大まかな戦略は以下でした。
- 初回ベンチマークくらいまでのやることの分担は決めて後は流れで
- 前半~中盤はやることが大きく被らない程度に一人1台使って動作確認・改善していく
- 16:00を過ぎたあたり各自の進捗をみつつサーバーの分割 ※こちらは最終的に間に合わず・・・
やったこと
自分は主にインデックス作成などのDB周りやコード上でN+1解消やDBテーブルキャッシュ作成したりをしていたと思います。 以下タイムラインです。
時間 | スコア | やったことなど |
---|---|---|
9:00 | — | 起床 |
10:00 | — | マニュアル読む、コードやDB見る |
10:20 | 3,769 | alp設定して初回ベンチをする |
11:35 | 12,264 | インデックスを張る |
13:30 | 12,264 | ICONのキャッシュ |
13:30 | — | お昼ご飯を食べる |
15:00 | 22,349 | usersテーブル全体をキャッシュ |
16:55 | 43,184 | livestreams,livestream_tagテーブル全体キャッシュ、fillReactionResponse N+1解消 |
17:20 | 48,172 | キャッシュしたテーブルを他の処理にも適用 |
17:?? | 56,881 | 上記の変更を別のサーバーで再度実行してもらうとスコアが上がる(最終スコア) |
※自分が関わった部分のみ抜き出したものでスコアの差分がやったことによるものない場合があります。
初動でマニュアルに目を通した後、DBを見てすぐ明らかにインデックスが全然ないことに気付きました。そこで初回ベンチ後はコードを読んでチームメンバーに洗い出してもらった着手できそうな改善アイディアもみつつ必要そうなインデックスを一気に作成しました(+8500くらい)。
インデックスの作成後はこの段階で最も影響がありそうなGET /api/user/:username/icon
のボトルネック解消のため、第一段階としてICONのキャッシュに取り掛かりました。しかしながらバグらせてしまいベンチマークの整合性チェックで失敗してしばらく唸ることに・・・。13時を超えたあたりでチームメンバーに相談して1行おかしい処理にしてしまっていたためと判明して無事解決しました(1敗)。また苦労した割にこの段階でそれほどスコアは伸びず・・・(+800くらい)。ちなみにこちらは最終的にnginxから返すように変更してもらっています。バグや方針ミスで個人的一番のやらかしたポイント。
以降は他メンバーと被らないようにN+1など影響が大きそうな部分が改善できないか見ていきました。users,livestreams, livestream_tagsテーブルがいろんなところで使われているのもあり、キャッシュしつつN+1になっているところとその他利用されているところを修正していきました。ここでもバグを埋め込んで整合性チェックに失敗するようになりそれなりに時間を消化・・・(2敗)。ただ、自明なN+1解消やキャッシュによってシンプルなクエリの発行回数を減らせたのもあってかこちらの改善は合わせて万単位で大きくスコアを伸ばすことができました(もちろん他のメンバーのN+1解消などの改善も効いてきた上での+だと思います)。
環境・ツール
Windows(WSL)環境で参加しました。以下今回主に使ったツール。
- VSCode
- alp(ログ解析用)
- HeidiSQL(DB眺める用)
- Notion(チーム内での情報共有・タスク管理など)
また今回GitHub Copilotを導入して使ってみました。最近ようやく使い始めたのもあってまだうまく使えているかはわかりませんがコードを書いててそれなりに楽になる場面もあったかなと思います。
感想
まず問題設定が面白く実際に改善していく過程についても非常に楽しんで参加させていただきました。 反省点としては既存の処理を残しつつ改善していく際にバグを埋め込みがちだった点があります。他にも個人としてDNS周りが手つかずだったのと中盤に時間を無駄にしてしまう場面もありましたが、序盤即インデックス作成したことや終盤にかけてN+1解消やクエリ発行回数削減で手堅くスコアに貢献できたかなと思います。サーバーの分割が間に合わず結局1台構成となってしまったのは残念でした。
終わった後色々見ると全体的にまだまだ知識や改善の引き出しを増やさないとと感じますが前回参加したときより改善に貢献できたと言えることが増えたのがよかったです。ぜひまた参加したいです。
2023/12/05追記: そもそも自分のブログの存在を忘れていましたがみなさんがISUCONのブログを書いている流れをみて思い出すことができました。ISUCONは自分のブログの存在を思い出すのにも役立ちますね。
ISUCONのおかげて自分のブログがあったことを思い出して2年以上振りに更新した、ありがとうISUCON #isucon
— naipia (@naipia_) December 5, 2023
ISUCON13 参加記 Create Speedy Logic(28位 56,881) https://t.co/bYMWx87JNG