😇
ISUCON11予選惨敗してきました
ISUCON11予選は惨敗でした。反省を込めてやったことを軽く振り返っておきます。
リポジトリはこちらです。
最終スコアは36630点で上位層には遠く及ばずでした。 https://isucon.net/archives/56021246.html
メンバー
自分以外は今回ISUCON初出場の2人の計3人チームでした。
やったこと
- スロークエリから
jia_isu_uuid
,timestamp
の複合インデックスを貼る - assetファイル配信をnginx経由でexpireを付ける
- isuテーブルでGROUP BYしていたのでcharacterにもindexを貼る
- テーブルのレコード数が小さいので多分インデックスは使ってなかった気がする
- echoのアクセスログなどを無効に
- ログが多すぎてCPUを使いすぎていた。エラーログも無効にしてしまったのでechoのいいログの出し方を知りたい
- window関数を使ってN+1クエリを減らす
- MariaDBでもwindow関数を使えるらしかったが、なぜかMariaDBだと動くがMySQL8だと動かないクエリになった
- このクエリ自体がスロークエリなのでスコアはむしろ少し下がった
- 今から考えれば上位1件を取ってくるだけだから、GROUP BYとサブクエリで十分だった
- この後MySQLを別サーバーにしたタイミングでN+1クエリの速度劣化が大きくなったのでmerge
- 参照系しか投げてないのにトランザクションを貼っていたので外す
- 少し上がった
- MariaDBを別サーバー、アプリケーションサーバーを2台に
- MariaDBがCPUを使い切ってしまうのでアプリケーションサーバーの分割はあまり意味がなかった
- DBに対するアプローチが必要なことは明白だったが、やりきれなかった
- getTrendで全件取っているが、最初の1件しか使ってないのでLIMITする
やりたかったができなかったこと
- bulk insertで500msごとに一気に書き込むとかやりたかった
- 純粋に時間不足
- インデックスを貼ってからはDBがN+1クエリだらけになってしまったので、有効な策だったと思う
- DBのレプリケーション構成
- ISUCON10予選ではINSERTが少なかったので2台にINSERTする荒技を使えたが、今回はINSERTが多く、分けるとするとレプリケーション構成をしたかった
- ただレプリケーション遅延をどこまで気にする必要があるのかなど、ISUCONだと厄介な局面も多いので今のところ挑戦できたことがない
- getTrendの高速化は厳しすぎて時間内にできる有効な手立てが思いつかなかった。力不足
- N+1クエリはどこが本当のボトルネックなのかが分かりにくいので、ここを読み解く力が必要
- conditionの正規化
- しないと最適化が厳しそうな気配だったが、時間不足で挑みきれなかった
感想
運営がJWTでログインサーバーを提供するアイディアを以前聞いたときは正直面倒過ぎるだろうと思っていたのですが、ちゃんと実装されていて本気度に驚きました。もしかしたらISUCONのデファクトスタンダードになるかもしれないと感じます。
自分の力不足を思い知るいい問題でした。ベンチマーカーも安定していて、ポータルの機能も多く、運営にかけられているリソースが桁違いであることを外からも感じることができました。ISUCON11予選をしっかり復習して行きたいと思います。
運営の皆様本当にありがとうございました。歴代の運営よりもはるかに多大なリソースを使っていて非常に大変だったと思います。知見などを発信してもらえたらうれしいです。
Discussion