ISUCON12予選に参戦しました。

はじめに

昨年の参加メンバーから1人が参加できずの2人チームでISUCON12予選に参加しました。East Labというチーム名でした。

最終的な結果は9,760点の98位でした。

ので、上位の方のブログ記事より参考になることはなく、自己満足のための記録用記事という位置づけで、競技中にやったことと感想を書きます。 (ブログを書くまでがISUCON とのこと)

タイムライン

  • 10:00~ システム概要確認。git設定、デプロイスクリプト作成、分析・監視系ツールを導入する。
  • 11:00~ マニュアルを読み、アプリ画面を触りながらビジネスロジックの概要を確認。
  • 11:30~ ベンチマーク後のAccess Log、MySQL Slow クエリ、topコマンドの分析をして何から取り掛かるかを決めようとする(が混乱する)。
  • 12:00~ 頭を整理するため議論しながらコンビニへお昼ご飯を買いに行く。
  • 13:30 GET /api/admin/tenants/billing のvisit_historyテーブルへのN+1クエリを修正 commit → 3,000点くらいになる。
  • 14:45 MySQL側で実施されていて負荷になったいたランダム文字列生成をアプリ側にする改修 commit → 4,500点くらいになる。
  • 15:30 POST /api/organizer/competition/:competition_id/score のINSERTをバルクインサートにする commit → 7,400点くらいになる。
  • 15:45 GET /api/organizer/players/add のINSERTもバルクインサートにしてみるcommit → 変わらず。
  • 16:20 GET /api/player/player/:player_id のcompetitionテーブルのN+1クエリを修正 commit → 8,000点くらいになる。
  • 16:45 MySQLを別サーバに移して2台構成にする commit → 10,103点になる。
  • 17:00 SQLiteテーブル操作時のファイルロック期間を短くする対応をしてみる commit → 点数変化なし。
  • 17:20 GET /api/organizer/billing のvisit_historyテーブルへのN+1クエリを修正 commit → 点数変化なし。
  • 17:40 GET /api/admin/tenants/billing のtenantテーブル取得にてLIMIT 10で絞るようにする commit → 点数変化なし。
  • 18:00 競技終了

使った分析・監視系ツール

  • top
  • dstat
  • kataribe(Nginxログ解析)
  • pt-query-digest

問題の感想

多くの方がそうだったかもしれませんが、SQLiteMySQLがミックスされた今回の問題に普通に面食らいました。SQLiteは業務経験が無くスロークエリの分析方法やEXPLAIN時の見方がわかりませんでした。

SQLiteMySQLに移行することはすぐ考えつきました。しかし、その判断が本当に正しいのか、正しく移行できるか、に自信が無く結局実行することができませんでした。知見・経験における技術力不足に依るところで、どうやらここが上位者になるかの今回の問題の一番のポイントだったようです。

関連しているところで、SQLite操作をするにあたりテナントごとにファイルでロックをしていることは認知はできてかつベンチマーク結果と分析の状況的にボトルネックになっていると把握はしながら、具体的な対応が打てなかったのも技術力不足を痛感した部分でした。

アプリ仕様とコードからvisit_historyテーブルとplayer_scoreテーブルが共に最新のデータしか参照されていないことに気づくことはできました。テーブルスキーマを変更する必要があることも把握しましたが、どう変更するか、initializeでどうデータを入れるかの実装のイメージがすぐにわかず最後まで後回しにしてしまいました。このあたりは焦らず着実に実行する練習が必要です。

また、分析に関して昨年よりも成長はしたがまだまだ十分にできていないと感じました。NginxアクセスログのTotal時間順にエンドポイント改修する方針を取っていたのですが、システム分析でボトルネックになっている箇所を正しく特定し順に解消していくことがスコアアップに繋がると反省しました。予選を突破するチームは何が高得点の鍵になったかしっかり把握している(参考 ISUCON 事前講習2022 座学) のでシステムの知見と分析力を上げる必要があります。

これから解説記事や他の方の技術ブログを拝見しながら復習します。

おわりに

しんどかったですがなんやかんや楽しかったです。

運営の皆様、ありがとうございました!お疲れ様でした!