ISUCON14に参加した(11,941点 107位)

これはKMC Advent Calender 2024の16日目の記事です。

ISUCON14の予選に参加しました。

ISUCONとは

いい感じにスピードアップコンテスト。 webサービスが与えられるので頑張って高速化します。

isucon.net

チーム

ISUCON8から同じチーム。 なぜかISUCON12からチーム名が変わった。

役割分担は、@_primenumberがDBを、私がモニタリングやconfigファイルを主に担当し、アプリは二人で見る形でした。

成績

11,941点で107位でした。

レポジトリ

github.com

今回もGoで。
最近はWSL2やGitHub CLIといったツールが使えるので、Windows環境でも躓かずにできるようになってきた気がします。

やったこと

モニタリングツールの導入

alp, percona-toolkit, netdata あたりをMakefileに仕込んでおいたコマンド経由で導入します。
pprofも入れたけど結局使いませんでした…

MySQLの設定

slow-query log を出力しました。

nginxの設定

アクセスログの出力形式を変更しました。
gzipを有効化しました。
静的ファイルをnginxから配信するようにしました。

gzipを有効化したら、なぜかfailするようになったのでやむなくrevertしました…

アプリ側の改善

効果があったもの

chairPostCoordinate で作成時刻をアプリ側で生成するようにしました。
DB側で作成して、それをクエリで取得していたのをやめました。
1000ptくらい効果があった(はず)。

chairGetNotificationのRetryを1000msにしました。
これも1000ptくらい効果があった(はず)。

効果があまりなかったもの

select * をやめて必要なフィールドだけ取得するようにしました。
ISUCONの定石だと思っていましたが、ほぼ効果を感じられませんでした。

ULIDを使いまわしするようにしました。
chair_locations とride_statuses のID用にそれぞれULIDを作成していましたが、同じULIDを使いまわすようにしました。 この程度ではスコア改善には寄与しないようです。

appGetNotificationのRetryも1000msにしました。
chairGetNotificationと同じくらいの効果を期待していましたが、誤差程度しか変わりませんでした。

感想

よかったこと

事前の素振りでMakefileを改良しておいたこと。

今年転職してWeb開発をするようになったので、やっている処理のイメージがつきやすくなったこと。

反省点

Makefileの改良が不完全だったので、競技開始後に修正する羽目になりました。
より本番に近いユースケースを想定して素振りしておくべきでした。

シナリオを気にした改善ができていなかった。 最近のISUCONはシナリオ観点での改善が大きく寄与する傾向がある印象があります。

// MEMO: 一旦最も待たせているリクエストに適当な空いている椅子マッチさせる実装とする。おそらくもっといい方法があるはず… という誘導があることには気づけていました。
それだけに、ここに手を付けなかったことが悔やまれます。

複数台構成にできませんでした。
事前に素振りしておくべきでした。

おわりに

コンテスト中、何もすることがない状態にならず、常に何かしら手を動かせるようになりました。
この1年の大きな成長です。

来年も出場枠獲得競争を勝ち抜いて頑張りたいです。