🎰
ISUCON12予選に参加しました → 最終スコア 20943 (mnsys)
概要
2022年7月23日に開催されたISUCON12にチームmnsysとして参加し、最終スコア20,943点で惜しくも本選出場を逃しました。
予選準備
予選当日までの土曜日はISUCON過去問を解くトレーニングを繰り返しました。
チームの役割
- @hiro_suzuki (私): アプリ担当、ISUCON7から6年連続出場
- 会社同僚: インフラ担当、2年前に本選出場したときのチームメイト
- 会社元同僚: アプリ担当、今年初めてチームを組む
予選当日
チームは各自宅からオンラインで参加をしました。
- コミュニケーション: discord のボイスチャンネル
- 情報集約: Googleスプレッドシート
- ソース管理: GitHub
- デプロイ方式: 開発サーバーから本番サーバーへファイルコピー
10:00
- 初期ベンチ → 2,910点
- アプリケーションを確認
- マニュアル確認
- 「429リクエスト」 と 「反映を3秒間遅延OK」の部分が気になる
- 本番環境を確認 → Dockerで動作しているアプリケーションをホストOS上で動作させることを決断
10:40ごろ
- Dockerはがし完了。開発サーバー上でアプリケーションビルド&デプロイできる環境の構築完了
- このころ ベンチは 2,517点と低調
11:10ごろ
- プロファイリング設定が完了
- nginxログ解析 (kataribe)
- MySQLログギング
- netdata
- Go言語 pprof
11:30ごろ
- Adminデータベース(Admin)を分離 (1号機アプリ → 3号機AdminDB)
- スコアは 3,707点に
12:00ごろ
- チームメイトがID発番ロジックをUUID化
- visit_historyにインデックスを追加
- スコアは 5,408点 と順調に増加
12:00~
- テナントデータベースのMySQL化に着手開始 (全テーブルにtenant_idが存在しており、アプリの修正コストが低そうだから)
- データ量が多く、データコンバートやロードに移行に時間がかかり苦戦。
- 14:00ごろにアプリ修正がほぼ不要でベンチマークが通ることを確認
- 通常の方法ではデータ初期化が /initialize リクエスト30秒制限に収まりそうにない → 初期化のタイミングで MySQL停止, MYISAM初期ファイルコピー、MySQL起動 をする方式を採用
- 15:00ごろにテナントデータベースのMySQL化がほぼ完了。しかしスコアは伸びない。
15:00~
-
テナントDB playerテーブル オンメモリキャッシュ化
-
テナントDB competitionテーブル オンメモリキャッシュ化
-
スコアは 7,599点まで上昇
-
DB構成変更 (1号機アプリ&AdminDB → 3号機テナントDB)
-
スコアは 9,264点まで上昇
16:00~
-
playerHandler の N+1クエリーを解消
-
スコアは 18,018点まで上昇
-
サーバー3台構成変更に着手
17:00~
- 最終構成構想 (1号機アプリ → 2号機AdminDB → 3号機テナントDB) にすると ベンチマークが初期FAIL
- 初期チェックでのFAILなので改修は簡単に可能と考えていたが、何故か解消できない
17:30~
- 3台構成をあきらめ、2台構成で終了フェイズに
- プロファイリング設定無効化
- ログ出力停止
- サービスに不要なデーモンなどを停止
- InterplateParams=True
- GOGC=500
- サーバー再起動テスト OK
- ベンチマークガチャ
- 17:54 最終スコア 20,943点
反省点
今回は惜しくも予選敗退となりました (参考スコア26位)。
反省点は以下のとおりです。
- play_score や visit_history は最新値のみの参照に気づけなかったことが最大の敗因
- 2台構成のままで終了。1台分のリソースを余らせてた
- もっと早い段階から3台構成を試せていれば
- 目の前の改善に集中して全体を見れていなかった
- テナントDBのMySQL化に多くの時間を割いてしまった
- マニュアルで匂わせいるチューニングポイント(429、3秒遅延)に着手できなかった
- お昼を食べずに作業していて、夕方まで集中力が持たなかった
- 3台構成FAILに対応できなかった原因?
Discussion