ISUCON11予選 tetoraの記録
ISUCON11予選に学生チームtetoraとして、 @tesso、 @ras と一緒に参加しました。
結果として 31075点までしか点数を伸ばせず、予選突破とはなりませんでした。来年またがんばります。 ISUCON予選から時間が立ってしまい、忘れた部分も多いですが、自分の担当したことをなんとなく書いておきます。
やったこと
自分は主にDB周りを担当しました。振り返ってみると何もできていません……難しいなぁ
以下自分の関わった部分です。
初動
最初の50分何をするかある程度打ち合わせていたので、かなりスムーズだったと思います。 初手のベンチでは1000点ちょっとくらいでした。 開発用のスクリプトを配ったり、バックアップを取ったり、ドキュメントの読み合わせをしました。
DBはMariaDB 10.3でした。事前の情報でサーバーはUbuntuとあったので、Ubuntu20.04でmysql8.0が入っているかも!? と予想していました。流石にそんなことはないか。
複数台の準備だけしておく
複数台構成にするときDBの接続がミスりがちだったので先に設定変更をしておきました。 CPUがきついなぁとなっていたので、初手3台構成で試しても良かったかもしれません。(この先、修正すればするほど点数が下がって苦しみました)
DBにインデックスを貼った
slow query logを見つつ、適当にIndexを貼りました。
INDEX idx_jia_isu_uuid_timestamp(`jia_isu_uuid`, `timestamp`), INDEX idx_jia_isu_uuid(`jia_isu_uuid`)
これだけで20000点くらい出て驚きました。 実際はjia_isu_uuidとtimestampの複合インデックスだけでも良かったのかな?わからず。
DBチューニングをする
秘伝のタレ(?)を入れました。ほとんど効果なし。
bulk insertをする?
POST /api/condition/:jia_isu_uuid
に時間がかかっていることがわかったので、クエリを一本にまとめようと考えます。
……と思って、アプリケーションを見るとすでに修正が入っていました。チームメンバーに感謝。
ただ、このあたりから修正すればするほど点数が下がります。サーバーのさばける件数は増えたけどタイムアウトも増えたのでしょうか?原因はわかりませんでした。改善の効果を計測できずISUCON中かなり苦しかったです。
GET /api/trendを修正する
最新のデータ1件だけ取ってくればいいよね!となったのでN+1になっていた部分も合わせて修正します。SQL文を書いて必要なデータだけを取ってくるようにしました。ただ、この修正はあまり良くなかったかもしれません。ISUCON11 予選問題実践攻略法にあるように、LIMITだけかければ十分なのかも? N+1の修正に意識が行き過ぎて、一つ一つの修正に時間をかけてしまいました。
ちなみにこの頃、nginxのキャッシュ?やアプリケーションのログを止めるなどについてもいつの間にか修正が入っていました。チームメンバーに本当に感謝。
ここから先、沼……
この先、複数台構成せず、アプリケーション側でのオンメモリキャッシュにも手を出していきます。点数が伸びず、エラーも出て厳しかったです。
きちんと覚えていないのですが、チームで役割分担しつつ/api/isu
, /api/trend
, /api/condition/:jia_isu_uuid
あたりのAPIがオンメモリになりました。点数は増えません(なんで?)
最終的にオンメモリ実装でバグが出て、自分の実装した部分は利用されずに終わりました。 そうこうしているうちにポータルサイトが落ち、ベンチマークが一時的に回せなくなりました。ポータルサイトが負荷によって落ちている間に簡単に再起動試験をしました。
終了直前
複数台構成に手を出します。オンメモリをある程度諦めて、nginxで3台のサーバーにリクエストを振り分けました。 ただ、さすがに時間が足りません。3台構成が終わって中途半端な状態でベンチを回してタイムアップ。dropProbabilityの変更までは間に合いませんでした。
反省
- もっとできることがあった
- isu_conditionテーブルにlevelカラムを追加するなど、もっとDB側で対応できることがあった
- クライアントキャッシュを利用できたが気づかなかった
- N+1の修正に固執して時間をかけすぎた
- 無限にバグらせてしまった
- マニュアルにかかれていた点数計算周りをあまり理解できなかった
ISUCON10に参加したときと比較するとだいぶ手が動くようになりました。ただ、実装力や知識が全然足りていません。また、来年がんばります!