🎰

ISUCON12予選に参加しました → 最終スコア 20943 (mnsys)

2022/07/26に公開

概要

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