2年越しのISUCON2026。
この世はAI時代で競技としてもう成立しないのではないかと思ってたのですが、結果として素晴らしい大会だった。
多分今まで4回くらいゆるーく参加してて、今回は初のAIを使っていいと言うことで事前準備0でチームメンバーとやった。
スコアとしては8.5万くらい。10万超えたかった...。
チーム全体でやったこと
1. 単純な N+1 / 全件取得の解消 (序盤の稼ぎ)
searchUsers: 全ユーザー取得 → Go で絞り込み → SQLILIKEに移行 (後にpg_trgmGIN index)getFeed: 全投稿取得 → Go フィルタ → SQL 側でフィルタ + LIMITgetNotifications: 500ms SSE ポーリング → PostgreSQLLISTEN/NOTIFYへ置換。さらに pg_notify ペイロードから直接通知を組み立て、配信時の DB 参照をゼロに- フレンド存在チェックの線形検索を
EXISTSクエリに - 読み取り系エンドポイントの直列 DB 往復を並列化 (memories の realmoji/comment 等)
2. 画像配信・保存の最適化 (中盤~終盤の最大の山)
初期実装は画像 bytea を DB に突っ込む典型的構成で、ここが一番のボトルネックだった。
DBから外したり、DB分離や署名計算など課題が多かった。 HMACに気付いてから剥がすのに時間かかったし、みんなでやってるので、剥がれたのに気づかなかったり😅
3. インフラ / リージョン配分
- nginx の asia 配分調整 (1:1 → 70:30 → asia2 を upstream から外す)
- asia2 を DB 専用に特化して Go アプリを停止 (OOM-kill 対策)
最初の方はasia2に流してみたりもしたけど、結局DBでOOMが発生したので、最終的に最初の構成に戻した。
4. ベンチ環境
- Docker ベースの ローカルベンチ を bench/ 配下に整備
- 署名 worker の america 役を追加して本番構成を再現
- 並列実行対応 (compose プロジェクト分離 + 固定サブネット撤去)
- Portal 用の benchmark runner も用意
ベンチ環境ができたのはだいぶ後半だったから、結局使わなかった。
5. その他細かいもの
createPostのFOR SHARE除去- login を 1 往復に
- JSON レスポンスの gzip
- users 行ロック保持時間短縮
- 不要な
notifications制約インデックス削除
私がやったこと
38 本 PR をマージ。 役割はざっくり「序盤の N+1 撲滅」「インデックス周り」「画像のバグ修正」「終盤の細かい削り」。
もっとかっこいいことたくさんやりたかったのに結局できてる部分としては昔と変わらないかも。 この今の時代のAIって結局本人の力量が必要な気もする。(将来はわからないが)
振り返り
- 序盤の N+1 殲滅と
LISTEN/NOTIFY系はテンプレだが効いた - 中盤以降は 画像をどこに置くか / 署名計算をどこでやるか の設計判断が全て
- 3 リージョン構成は夢があるが「asia1 だけで頑張る」が意外とスコア出る瞬間もあり、revert と再導入の往復が多かった
みんなでやるとPRの確認とか往復とかあって結構大変だったので、 AI時代はAIがチームメンバーとして、1人1チームとかで出る方が楽しいのかなと思うような大会だった。















