今年も参加しました
結果
チーム「情報処理部」で参加して、競技中のスコアの最終値は3270、結果は322位相当でした。 メンバーは id:mizdra との2人で参加しました。
やったこと
- Datadog の導入
- alp/pt-query-digest は使わずに APM をベースに改善の勘所を見つける方針
- [tracer.trace を使ってボトルネックになりそうな関数のスパンを追加した] (https://github.com/odanado/isucon12-qualifier/blob/cd479a577fb5e418651665a46e26560c7a86c771/node/src/main.ts#L281-L285)
- これを使って
flockByTenantID
がボトルネックなことを判断できた
- これを使って
- 使い勝手良かったので来年も継続して利用したい
- MySQL に乗っているテーブルに index を追加
- Datadog で APM からスロークエリを列挙して上の方にあるクエリに有効なインデックスを追加
- ID の採番を ulid にする
- Datadog を見ると
REPLACE INTO
という見慣れないクエリが見えて「なんだこれ」ってなったけどよく見たら ID を採番しているだけだった - uuid でもいいかなと思ったけど ulid にした
- Datadog を見ると
- リーダーボードを Redis に乗せる
- リーダーボードといえば Redis かなと思ってやってみたけど間に合わなかった...
- 解説や他の人の参加記を見ても採用しているケースは少なかったし方針が悪かったっぽい
- 初期データで player_score に入っているデータを Redis に乗せる必要があり、その処理を
POST /init
で呼ぶと30秒を超えてつらかった- ほとんどこの対応に時間を費やして時間内に終わらなかった
- row_num が一番大きいやつを選べばいいことはわかっていたけど、圧縮するという発想がなかった...
できなかったこと
- テナントのロックがきつい
- billing が重たいまま
- 方針を考える時間がなかった
- N+1 も残ったまま
- サマリー作れば軽くなりそうだなという気はしていた
感想
- 自分は Redis 化、mizdra さんは SQLite => MySQL 化をやっていて、どちらも一発逆転ホームラン的な作業をしていたのが良くなかったかも
- どちらも完了すればスコアが大きく伸びることが期待できるけど、作業が完了しなければスコアの増分は0
- 小さく積み重ねる系のタスクも別ラインで進めたほうが良かった
- ほぼ触ったことのない Redis をぶっつけ本番で選んでしまった
- ↑と似てる
- SQLite のまま進められる改善をやればよかった
- RW Lock の実装など
- Datadog の無料枠が終わった
- 来年は課金して挑みます
- SQLite という新しいミドルウェアが出てきて新鮮だった
- MySQL v8 なのも初?
- 今回はいつもに増して無力感が強い予選だった
- 個人的に ISUCON の予選突破がソフトウェアエンジニアとしての1つの目標で毎年参加している
- しかし予選突破に近づいたことがなく、あと何を学べば目標に近づけるかがわからない...