ISUCON14に参加しました
tkuchiki、Konboiとチーム「流れ弾」としてISUCON14に参加しました。
最終スコアは23,584で、順位は33位でした。
前回は惨敗でしたが、今年は一定の成果を残せてよかったです。
今年の個人コンセプト
今年の個人コンセプトは「AIに頼りまくる」でした。基本方針は以下です。
- ChatGPT-4oにpprofのキャプチャ画像を貼り付けて、チューニング候補をピックアップ
- ChatGPT-o1にコードをチューニングしてもらう
- チューニング後のコードでベンチを回す
結果としてこの取り組みは成功したものの、実際のスコアに貢献したのはAIなので、自分の存在意義とは…という気持ちもあります。
来年の今頃にはAgentが上記の全てを行ってくれるようになり、私の役割は不要になっているかもしれません。
事前にやったこと
- 『達人が教えるWebパフォーマンスチューニング』を読み返す
- ISUCON13過去問を解く
これまではローカルのDocker環境で過去問の練習をして満足していましたが、前回のTryとして「実際の想定環境で練習をする」を掲げていたので、今年はAWS上で複数台サーバを立ち上げて練習をしました。
pproteinを導入して使い方を学びつつ、ChatGPTにpprofの結果を共有してチューニングをしてもらう作戦を試しながら過去問に取り組みました。
また、チューニングには直接関係しない部分ですが、AWS Organizationを使ってISUCON専用の環境を用意しつつIAM Identity Centerを使ってSSOできるようにしたり、普段触れる機会の少なかったAWS機能を試せたのも良い学びでした。
当日やったこと
役割分担は例年通りKonboi、hilotterがアプリケーションチューニング、tkuchikiがインフラチューニングという分担で進めました。私の対応は主に以下の通りです。
- Goアプリケーションにpprotein用のdebugエンドポイント(pprof)を導入
- slpでRows Sent/Rows Examinedの比を見て効率の悪いクエリにindexを追加
- 総距離をカラムで管理するように改修
- chairsテーブルに total_distance と total_distance_updated_at を追加
- 新しい位置情報が chair_locations テーブルに挿入されるたびに、対応する椅子の総移動距離を更新するトリガーを追加
- ownerGetChairs呼び出し時の LEFT JOIN をなくす
- chairPostCoordinateの改修:
- N+1をなくす対応をしたがスコアが下がってしまったのでrevert(2時間ほどを無駄に)
- created_at取得のためにSELECTするのをやめる対応のみ追加
- addPostUsersの調整
- chairGetNotificationの調整:
- RetryAfterMsを2秒から1秒に変更
- InterpolateParams = trueに設定
- pproteinとLoggerを外す
最初にKonboiが素早くindex追加を済ませてくれたあとは、ChatGPTにチューニングしてもらうのを繰り返し、少しずつスコアが伸びていきました。
特に「総距離をカラムで管理する」ようにした時と、tkuchikiに複数台構成に切り替えてもらった際のスコアの伸び率が高かったです。
感想
tkuchikiがローカルのコードを手軽にデプロイできる仕組みを用意してくれたこと、そしてベンチ実行のたびにDBがリセットされる仕様だったおかげで、各自が並行して作業を進めやすかったです。
AIを駆使することで、普段使いしていない言語でもボトルネックを特定し、スコアを着実に伸ばすことができたのは大きな成果でした。 一方で、スコアが意図せず下がったり、ベンチが失敗した際の原因究明に多くの時間を費やしたことが反省点です。
AIが生成したコードを素早く修正するスキルが不足していることを痛感しました。 これを何とかしない限りさらなるスコアアップは難しいので、引き続きAIを活用しつつ、自分のスキルも磨き、次回はさらに高いスコアを目指せるように精進します。
さいごに
運営スタッフをはじめ関係者の皆様、今年もありがとうございました!
チームメンバーの二人も、いつも一緒に参加してくれてありがとう。