ISUCON13 振り返り
2023-11-25 に開催された ISUCON13 に参加した記録です。
次回以降に向けてやったことなど振り返っていきます。
メンバー
4月頃大学の編入同期に声かけたら快諾してくれた。
- メンバー1 ISUCON 初参加。普段は Ruby on Rails を使ってバックエンド開発をしている。
- メンバー2 ISUCON 初参加。普段はセキュリティエンジニア。Web 開発はほとんど未経験。
- 僕 ISUCON は2年ぶり2回目。普段は Web エンジニア。
今回はメンバー1・2にアプリケーションをメインで見てもらい、自分はインフラいじりつつ重そうなところを見ていく方針。
普通だったらメンバーが使える言語の最大公約数を取るけどノリと勢いで Go になった。
練習
10月中盤と本番直前の祝日にそれぞれ1日ずつ使って行った。
環境はそれぞれ AWS に用意した。
1回目
ISUCON12 予選を利用。
目的としては本番の流れをざっくりと理解するためで、あとは index 貼る練習とかをちょこちょこやった。
あとはデプロイ周りの script とかを整理していた(が、本番のときとの環境祭に耐えられなかったので実際は使わなかった。カナシイ)
2回目
private-isu を利用。
6時間くらい何も見ずに触った後に ISUCON 本 を読んで振り返り。
画像の切り出しなどはここで触れてよかった。あと、1ヶ月ぶりの練習で割と色々忘れてたので直前にやって良かったねってなった。
当日
メンバー1の家に集合。寒かったのでコタツでぬくぬく。
開始までの間に空の repository 作ったり、コマンドメモを見返したりしていた。
10:00
最初の役割分担
- メンバー1 マニュアル確認。アプリケーションの動作確認。スロークエリの設定
- メンバー2 マニュアル確認。アプリケーションの動作確認。アイコン切り出し
- 僕 実装の確認。git の設定。alp 導入。デプロイスクリプト設定
設定後に走らせた初回ベンチは 3,653 で10分くらいで初期設定できた。
11:00
ログ眺めながら方針を立て、以下のタスクに取り組んだ。
着実にボトルネックは移り、DB の負荷も減ってきたが対してスコアは伸びない 4,398。
12:00
アイコンの切り出しには成功していたのでアイコンハッシュ周りに取り組み始める。
index がうまく貼れていなかった場所を修正したりして 6,211。 さらに index が貼れないか試行錯誤する。
その後少し伸びて 7,639。
このとき、ちゃんと計測せずに write の負荷が高くなるのを懸念して慎重にやりすぎて時間を使いすぎた気がするので反省。
13:00 ~ 17:00
なぜか家の Network が落ちたのでお昼休憩を取ることにする。一旦休み。
買い出しから帰ってきたら復旧していたので再開するもベンチが止まる。一旦休み。
2台目のサーバーで開発できるように設定。
明らかに悪そうな INNER JOIN
を取ったりするけどそんな伸びない。
statistics 周りの N+1 の解消に取り組み始める。他にも NG ワード判定をアプリ側で行うように修正し、やっと 10,261。
17:00 ~ 18:00
ここに来て MySQL の restart に失敗するようになる。
怖くなったので手を付けていなかった3台目のサーバーのセットアップを行い、AWS から VM の再起動を行う。
ログを止めたりしつつ、ベストスコア 11,892 で終了。
個人の振り返り
K
- チームの Discord 鯖 に GPT-4 の bot を用意しておいたが良かった
雑に設定方法を聞いたり、SQL からの ER 図生成などに役立った
- 物理で集まったのでコミュニケーションコストが低かった
直接画面見ながらペアプロできるのは良い - 練習でやったことが活かせていた
画像の切り出し周りは練習でやってなかったらあの短時間でできなかったと思う - 細かいけど
git commit --allow-empty -m "Score: xxxx"
ってしておくのは良かった
壊したときに戻す場所が見えやすいし、振り返りに便利
git sync
が便利 notfounds.hatenablog.com
P
- bot を雑に作りすぎてコードを全部投げられなかったので改善の余地がありそう
そもそもコードの修正などは外部のツールやエディタ上で完結させたほうが良いかも - index を慎重に貼りすぎた
SQL を bot になげて index 貼ってもらうくらいやっても良かったかも - デプロイ周りがあまり自動化できていなかった&属人化していた
- インフラ周りに弱すぎる
練習で複数台構成の練習をサボっていたので本番でやる勇気がなかった
今回スコアを稼ぐ上で重要な DNS 周り何も分からなくて手を付けられなかった
MySQL が再起動しなくなったときなどに復旧できなかった。複数台構成にするなら致命的な気がする - 瞬発力がない
言語への理解&慣れ。ISUCON 頻出問題への対応速度 - キャッシュを効率的に使えなかった
どこをキャッシュして良いのか?そこをキャッシュすると効くのかが見極められていなかった
T
- 最初の環境構築はなるべく自動化したいので Ansible などを勉強する
ログの投稿も手動だったので webhook とか使うようにしたい - 各メンバーがデプロイできるようにする
- 練習で複数台構成を試す
- 数をこなしてたくさんの施策に取り組めるようにする
- レギュレーションやアプリケーションの書き込み箇所をちゃんと把握する