ISUCON 12 予選 参加記

2022年 7月23日 (土) に開催された ISUCON 12 の予選にチームO (dice801, daiju, omu) で Rust で参加しました
自分達の最終結果は 25598 点で、20位で予選突破しました。
(最終結果一覧)

事前準備

  • ISUCON 10 や ISUCON 11 で使ったツール類を準備
    • cargo-make
      • 各操作を定義してデプロイや kataribe, pt-query-digest の実行など、コマンド一発で諸々できるようにしていた
      • ↓の感じで各操作の通知が discord に来る感じにもしていた
    • isuconf
      • 設定ファイルの管理を行うために自前で用意した CLI ツール
      • 各インスタンスの設定ファイルの収集・配布を簡単に出来るやつ
      • 去年の予選時にこしらえたもので、今年も幾つか機能追加をした (push, pull 操作の並列化や ssh-config 生成のサポートなど)
      • 我ながらそこそこ便利で、去年のチームメンバが別のチームでも布教してくれていて嬉しかったです
  • sqlx での典型的な DB 操作の素振り
    • 普段使わないので本番でハマりがちという反省から
    • in 句による select や bulk insert などの典型と思われるものを練習した
  • hinohi/rust-opentelemetry-auto-span
    • チームメンバの daiju さんが作った opentelemetry 対応の為のライブラリ
    • 関数にアノテーションをつけるだけでボトルネックが見えるようになり最高でした

当日チームでやったこと

  • sqlite から mysql への移行
  • アプリケーションサーバと DB サーバの分離
  • テーブルの圧縮
    • visit_history
    • player_score
  • N+1 クエリの解消

当日自分がやったこと

  • N+1 クエリの解消
    • コミットログ見ると4つぐらい直したみたいです
      • competition_ranking_handler の N+1 を修正
      • player_handler の N+1 を解消
      • player_score を bulk insert
      • competition_score_handler の N+1 を修正
  • player_score 圧縮のアプリ側の対応
    • row_num が一番大きいものだけを残せばいいのでそうする
    • 初期データの修正は daiju さんが sqlite -> mysql への切替時に合わせてやってくれていました
  • sqlite -> mysql への切り替えのアプリ側の対応
    • コード中の sqlite への接続箇所を mysql に切り替える対応
    • データ構造の設計や切り替えは daiju さんが全てやってくれていました
  • dispense_id の生成処理修正
    • アプリ側で UUID を生成する形に変更
  • pem ファイルをプログラム起動時に読み込む
    • リクエスト毎にファイル読み込みをしていたので修正
    • コードリーディング時にパッと目についたので直したけど余り意味なかったかも

良かったこと

  • Rust での参加
    • 今回 sqlx 周りぐらいでしかバグは出ず、改めて良い言語だなという感想
  • ツール類による効率化
    • ツールによる自動化で主要な操作はコマンド一発で対応できていて体験が良かった
    • 本質的な改善活動に集中できた

反省点

  • アプリサーバの分離が間に合わなかった
    • 最終的な構成はアプリサーバ1台 DBサーバ1台で、1台サーバを余らせている状態だった
    • アプリの CPU がきつそうだったので、アプリサーバを2台にしたかったが、flock の引き剥がしが間に合わず対応できなかった
    • 複数のアプリの状態管理に対する素振りが足りていなかったかなという反省
  • 方針決めにあまり貢献できなかったこと
    • 大きな変更 (sqlite の mysql への切り替え) の方針については主に daiju さん, dice801 さんが会話して方針を決めていた
    • 自分は決まった方針に対して必要な一部タスクを実施する人になっており、方針決めに頭を使えなかったのは反省

感想

今年で ISUCON に参加するのは 5年目ですが、ようやく初めて予選突破できました。
優秀なチームメンバと良いチームワークで問題に取り組めたのが良かったのかなと思います。
本戦でもチームに貢献して良い成績を取れるよう頑張りたいです。