ISUCON13 参加記

ISUCON13 に参加してきました。

チーム名は「ぽよ〜」でメンバーは自分ひとりでした。毎年チームを組んで参加しているので試しにソロで参加したくなったのが背景です。

あと今年は個人スポンサー枠で参加しました。

結果

スコアは6,381で、順位は上から370番目?付近でした

isucon.net

やったこと

  • kataribe, pt-query-digest, OpenTelemetry + Cloud Trace を導入
  • kataribe の集計結果から重たいエンドポイントのボトルネックを順番につぶしていく
  • GET /api/user/:userId/statistics の一部改善
    • 処理が複雑だったので一旦目についた簡単そうな N+1 を解決した
  • GET /api/user/:userId/icon の304実装
    • アプリ側にハッシュ値を比較する実装を入れた
    • あとで Nginx から返そうと config を触ったけど、ベンチマークがパスしなくて Nginx は諦めた...
  • GET /api/livestream/search の改善
    • utils 以下にある関数に N+1 がたくさんあったのでいくつか解決した
  • POST /api/livestream/*/moderate の改善
    • for 文の中で DELETE 文を実行している and 不要な NG ワードに対しても DELETE 文を実行していたのでどっちも直した
  • アイコンを Nginx で返す
    • ベンチマークを回すと整合性チェックで アイコン未設定の場合は、NoImage.jpgを返さなければなりません と怒られて、これを解消できずに諦めた
  • 複数台構成化に挑戦
    • とりあえず app と mysql を別のサーバにしようとしたけど時間がなくて諦めた
      • Host 'ip-192-168-0-11.ap-northeast-1.compute.internal' is not allowed to connect to this MySQL server というエラーが出て直す時間がないな〜となってた

反省

  • 終了直後の配信でインデックス張るだけで1万点超えるって言われてメンタルにきた
    • kataribe を使ったトップダウンな改善の前に自明なインデックスに手を付けるべきだった
    • N+1 の解決に伴って不要になる index もあるからって理由でトップダウンな改善を進めたけど、index 作るぐらいなら簡単だしやっちゃえばよかった
  • Nginx の config を書くのに時間かかりすぎたし結局できないので、もっと理解を深めておく必要があった
  • そもそもだけどやっぱりチームを組んで参加しないと手が回らない...
    • 複数台構成にする時間がなかった
    • N+1 の解決にだいぶ時間を取られた

感想

  • こんいす〜良すぎ、問題設定が神
  • 今年は予選決勝形式じゃなくて一発勝負になった影響か例年の予選よりボリュームが多い気がした
  • スコアがさばいたリクエストの数じゃなくてスパチャの合計額なのはより実サービスに近い設定で良かった
  • DNS がテーマに含まれているのはさくらインターネットぽくてよかった
  • TS 実装は hono が使われていてお〜となった
    • 同時に @opentelemetry/instrumentation-express が使えないなとなった
      • @opentelemetry/instrumentation-http は動いていたっぽいので、エンドポイントなどの情報は追えた
  • TS の実行には tsx が使われていた
    • esbuild 化しようとしたけど、bcrypt がバンドルできなくて諦めた
    • bcryptjs に置き換えれば build 通る可能性はあったけど、レギュレーションの bcrypt のアルゴリズムを変更しない、というルールに違反しないか自信がなかった
      • 極論 bcrypt って名前を含む何もしないパッケージをその場で公開すれば色々処理性能は上がるので...
      • あと bcrypt のアルゴリズムを変更しない、ってルールは数年前の ISUCON のアンサーソングぽいなと思った

今年の ISUCON も楽しむことができました。 特に今年は一人参加だったのでいつもより集中して挑めたと思います。

関係者の方々ありがとうございました。 来年も参加します。