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

ログ眺めながら方針を立て、以下のタスクに取り組んだ。

  • MySQL のスロークエリのトップがプリペアドステートメントだったのでおもむろに止める
  • SQL 眺めながら index を貼っていく
  • アイコンの切り出し

着実にボトルネックは移り、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 図生成などに役立った
    ChatGPT が生成した reference を sqldiagram に投げた図
  • 物理で集まったのでコミュニケーションコストが低かった
    直接画面見ながらペアプロできるのは良い
  • 練習でやったことが活かせていた
    画像の切り出し周りは練習でやってなかったらあの短時間でできなかったと思う
  • 細かいけど git commit --allow-empty -m "Score: xxxx" ってしておくのは良かった
    壊したときに戻す場所が見えやすいし、振り返りに便利
    空コミットでスコアを記録すると便利
  • git sync が便利 notfounds.hatenablog.com

P

  • bot を雑に作りすぎてコードを全部投げられなかったので改善の余地がありそう
    そもそもコードの修正などは外部のツールやエディタ上で完結させたほうが良いかも
  • index を慎重に貼りすぎた
    SQLbot になげて index 貼ってもらうくらいやっても良かったかも
  • デプロイ周りがあまり自動化できていなかった&属人化していた
  • インフラ周りに弱すぎる
    練習で複数台構成の練習をサボっていたので本番でやる勇気がなかった
    今回スコアを稼ぐ上で重要な DNS 周り何も分からなくて手を付けられなかった
    MySQL が再起動しなくなったときなどに復旧できなかった。複数台構成にするなら致命的な気がする
  • 瞬発力がない
    言語への理解&慣れ。ISUCON 頻出問題への対応速度
  • キャッシュを効率的に使えなかった
    どこをキャッシュして良いのか?そこをキャッシュすると効くのかが見極められていなかった

T

  • 最初の環境構築はなるべく自動化したいので Ansible などを勉強する
    ログの投稿も手動だったので webhook とか使うようにしたい
  • 各メンバーがデプロイできるようにする
  • 練習で複数台構成を試す
  • 数をこなしてたくさんの施策に取り組めるようにする
  • レギュレーションやアプリケーションの書き込み箇所をちゃんと把握する