feature image

2024年12月9日 | ブログ記事

ISUCON14「リアクティブ二子玉川~♪」32位(学生5位) 参加記

チェアー!

ISUCON14 に @ikura-hamu @pikachu @H1rono_K の 3 人で「リアクティブ二子玉川~♪」として参加し、最終スコア 23936 点で32位でした。

リポジトリ: https://github.com/reactive-futakotamagawa/isucon14

GitHub - reactive-futakotamagawa/isucon14
Contribute to reactive-futakotamagawa/isucon14 development by creating an account on GitHub.

得点遷移

改善記録

↓の時間の所のリンクから該当コミットを見ることができます。

10:24 pproteinの導入

pprotein を導入しました。サーバーにプログラムにimportしたのは本家のものですが、見る用にデプロイしてたのは フォークしたもの( reactive-futakotamagawa/pprotein )です。
ちなみに、ベンチマーカーのバグが起きていて競技開始直後は点数が出ませんでした。

10:27 (673) ログの設定

MySQL と Nginx のログなどの設定を入れました。

10:45 (893) INDEX追加

chairsテーブルにaccess_tokenでインデックスを貼りました。

11:12 (2919) 全INDEX貼り

スロークエリ上位が全然インデックス貼られてなくて、上位から順にインデックスを貼りました。

ALTER TABLE `ride_statuses` ADD INDEX `idx_ride_statuses_ride_id_created_at` (`ride_id`, `created_at` DESC);
ALTER TABLE `chair_locations` ADD INDEX `idx_chair_locations_chair_id_created_at` (`chair_id`, `created_at`);
ALTER TABLE `chairs` ADD INDEX `idx_chairs_owner_id` (`owner_id`);
ALTER TABLE `rides` ADD INDEX `idx_rides_chair_id_updated_at` (`chair_id`, `updated_at` DESC);
ALTER TABLE `rides` ADD INDEX `idx_rides_user_id_created_at` (`user_id`, `created_at` DESC);

11:44 (3483) getChairStatsN+1を解消

アクセスログ上位かつpprofでも上位だったため改善しました。

13:46 (6870) DBを分離し2台構成

マッチャーが止まってない事に気づかなくて2時間苦戦しました。なぜかベンチマークが落ちる事態が多発したので、いろんなパラメーターを変えたり試行錯誤したりしましたが、dbInitializeを受け取って5秒後にアプリを終了することで解決しました。(pproteinでログが取れなくなったので、後で環境変数を用いた方式に直しました。)

14:26 (7309) パラメーター調整

環境変数のISUCON_MATCHING_INTERVAL1.0に変更しました。 (ベンチマークが良く落ちていたので、いろいろ試行錯誤して2.5に上げていましたが、1.0に下げました。数字が高いほどベンチマーカーが落ちる可能性が低かったです。)

16:14 (7132) 総移動距離取得の長いクエリを複数クエリに分割

椅子の総移動距離を取得する長いクエリを複数のクエリに分割しました。
当初は新しいテーブルに総移動距離を入れる実装で進めましたが、整合性チェックが通らず、テーブルはそのままで実装することになりました。

16:21 (7568) interpolateParams=true

MySQLの接続オプションで interpolateParams=true にしました。

16:50 (7938) chairsaccess_tokenでキャッシュ

chairへのリクエストで使われるmiddlewareを軽くするため、chairsaccess_token に対するキャッシュを入れました。

16:26 (8040) DBをテーブルで分割し2台に、3台構成に

DBのCPU使用率が高かったため、DBをテーブルで分割して2台にしました。
まずは簡単にできそうなuserscouponsで試験的に実装し、成功しました。

17:03 (8633) 余裕があるDBにテーブルを追加

s3が相変わらず燃えていたので、s2とs3のCPU使用率が均等になるように、スロークエリの上位と実装しやすさを見てchairsownersテーブルをs2に分離しました。

17:18 (16855) ISUCON_MATCHING_INTERVAL0.02に変更

CPUが余り始めたので何かパラメーター調整することでリクエストを増やせないかと考え、サーバー2台構成にしてfailしまくり試行錯誤の時に1回だけ9000点failが出ていた事を思い出して、ISUCON_MATCHING_INTERVALを調整してみると一気にスコアが上がりました。

17:35 (17342) 通知のポーリング間隔を100msに伸ばした

RetryAfterMs100msにして、通知のポーリング間隔を伸ばしました。

17:44 (19840) 余裕があるDBにさらにテーブルを追加

s2にまだCPUの余裕があったので、スロークエリ2位のchair_locationsテーブルをs2に移行した。

これで、s1s2s3それぞれCPU90%以上を使う構成になりリソースを最大限活かせていました。

17:48 (23500) ログを切る

MySQL のスローログや Nginx のアクセスログ、アプリのログなどを切り、計測機器を止めました。

もう一回ベンチマークを回してフィニッシュ!

最終盤に H1rono_K が長い間取り組んでいた ride_status のキャッシュが通り、 main ブランチに入れようとしましたがコンフリクトが多く発生し、最終的に断念しました。悲しい。


最終スコアは 23936 でした。

isu-isu-h について

https://github.com/reactive-futakotamagawa/isu-isu-h-14
(Private リポジトリのコピー)

GitHub - reactive-futakotamagawa/isu-isu-h-14: ISUCON用 改善スピードを上げるためのツール群 2024
ISUCON用 改善スピードを上げるためのツール群 2024. Contribute to reactive-futakotamagawa/isu-isu-h-14 development by creating an account on GitHub.

isu-isu-h(いすいすえいち)は、去年の ISUCON13 に向けて ikura-hamu が開発したツール群です。詳しくはこちらの記事をご覧ください。

https://trap.jp/post/2047/

【 #ISUCON 】 最近の若者は ssh しないらしいですよ
こんいす~。 @ikura-hamuです。チーム「リアクティブ二子玉川~♪」でISUCON13に出ました。チームブログはこちら(https://trap.jp/post/2075/) ISUCON13「リアクティブ二子玉川~♪」34位(学生6位) 参加記ISUCON13に@pikachu、@ikura-hamu、@h1rono_kで「リアクティブ二子玉川~♪」として出場し、全体34位、学生チーム内では6位(多分)になりました。 GitHub - reactive-futakotamagawa/isucon13Contribute to reactive-futakotamagawa/isucon13 development by creating an account on GitHub.GitHubreactive-futakotamagawa チームメンバー(役割分担) 全員学士2年の3人チームで出場しました。みんなウェブ系に関わり始めたのが大学入ってからにしては、結構頑張ったのではないかなと思います。 例年であれば学生枠で本選出場できる順位ですが、今年は30位までしか賞品が無い

今年度はこれを改良して使っています。主な変更点は以下の通りです。


VSCode で動く n1-h の様子

今後も開発を続けてより便利にしていきたいです。

感想

ikura-hamu

ものすごく悔しいです。去年は「初出場の割には良かったかな」という気分でしたが、今年は自分の実力不足と成長不足を突き付けられました。とにかく手が遅いし正しいコードを書けない。
来年はもっと力を付けて帰ってきたいです。

pikachu

自分ができることはかなりできたかなと思います。スコアにめっちゃ貢献出来て良かった!
「全サーバーのリソースを使い切る」が個人的な目標だったので、最終的に全部CPU90%以上使う良い構成にできて大満足です!
同サークルの他のチームはDBサーバーの分割でかなり悪戦苦闘していたようで、僕も2時間格闘することになりましたが、原因が分かった上でDBのテーブルごとの分割までちゃんと実現できて本当に良かった......!
結構ベンチマークの謎のエラー落ちに悩まされていた時間が長くて、焦りと共にスコアが確実に上がる改善に集中しました。もっと時間的余裕があれば、もっとN+1を直しまくったりキャッシュしまくったりできたかなと思います。
次回は、もっとすべてを解決する圧倒的マッスルパワーをつけて、圧倒的優勝をもぎ取ってやろうと思います!

H1rono_K

paymentGatewayURLをメモリに載せました。貢献と言っていい貢献はこれぐらいですね。ride_statusesのキャッシュに取り組んでたんですが、最後まで上手くいかなかった... Go言語には罠が多いですね。Rust感覚でクロージャの置き換えを書いたら無限再帰しました。

callback := func(ctx context.Context) error { ... }
callback2 := func(ctx context.Context) error { ... }
callback = func(ctx context.Context) error {
    if err := callback(ctx); err != nil {
        //    ^^^^^^^^
        return err
    }
    return callback2(ctx)
}

とにかく筋肉が足りなかったなと思います。ガシガシと手続きを書く筋肉、将来のことなど考えずにif文を追加する筋肉、などなど。Rust書かせてくれ!!!!!!

ikura-hamu icon
この記事を書いた人
ikura-hamu

SysAd班、ゲーム班 いろいろやりたい

pikachu icon
この記事を書いた人
pikachu

VRChatに住んでいる、重度のケモナーです。よろしくね!

H1rono_K icon
この記事を書いた人
H1rono_K

趣味プログラマー(大学生)

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2024年12月18日
ISUCON14にツールの力で勝ちたかった
mazrean icon mazrean
2023年11月26日
ISUCON13にツールの力で勝ちたかった(mazrean)
mazrean icon mazrean
2021年9月21日
ISUCON11 traP CM制作についての小話
dan_dan icon dan_dan
2024年12月18日
ISUCON14感想戦で40万点超えました
mazrean icon mazrean
2023年11月26日
【 #ISUCON 】 最近の若者は ssh しないらしいですよ
ikura-hamu icon ikura-hamu
2022年7月24日
ISUCON12に向けてダッシュボードを自作してログを可視化しました
Ras icon Ras
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記