ISUCON11出場して予選落ちしてきた。
手元での最終点数は6万点台、参考スコアでもこれぐらいだったのでまあそれぐらいの点数が出たということです。
全体的な感想としては、もう1改善ぐらいできたら本戦に行けたんじゃないかという感じがして悔しい感じがする……。
前日までの準備
環境確認がCloudFormationを流すだけでStack完成してすごい。本番の環境もすごくよくできていてよかった。運営の方々ありがとうございます。
本番でやったこと
前述の通り、準備を全くしていなかったので、始まってからMakefileでデプロイスクリプトを編んでいきます。泥縄……。
https://github.com/primenumber/isucon11q/commit/68fc5629aeda74631ea2c1249a9e07bde225037d 当日にあわてて準備しているから、デプロイする前にappのbuildをしていなかったりするMakefileを書いてしまう……。
過去のISUCONでは前もって準備したitamaeでデプロイしていたこともあったが、8時間程度しか使わないならMakefileにscpコマンド並べたりしていく程度で十分ではないか と最近は思っている。
sshのコネクション切って貼ってになるな〜 とか思ったけどまぁそこで困るほどでもないからと見なかったことにした(どうせappの転送時間が主となっていたので)。
いつも
とりあえずベンチマークを回してみる。
ログを眺めて、回数が多くて重いところを探す。
そこのコードを眺めて改善する。
をループして改善している。
これをするためにalpで眺めるということを、いつも行っている。
https://github.com/primenumber/isucon11q/blob/develop/Makefile#L49 これもMakefileのコマンドに纏めてたんだけど、match-groupの指定がこれだとマズくて、
/icon
の取得とかが行われていないかのようなログをずっと見ていた……。 感想戦で「ほとんどリクエスト来てなかった」って言ったら否定されて、生ログを見て「たしかに」と言っていた。
ちゃんと生ログは見よう。
この改善対象の解析をミスっていたにもかかわらず、だいたいはあっていたので、結果的にはなんとかなったが……。
最初はDB-boundであったため、appを1に、DBを3に振り分けて様子を見るが、やっぱりDB-boundだった。
GET /api/isu
のN+1を解消しようとクエリを眺めてるうちに、 isucondition
にindexを貼ってやると、劇的に改善する。 このindex自体は後で https://github.com/primenumber/isucon11q/pull/17/commits/03e651e50d9b4035ea1bdab4ae094261ca1974d3 に飲まれて消える。どこか別の箇所にこのindexを貼ればいいらしい(そすうさんにまかせてた範囲なのでよくしらない)けど、この追加されたコードを見て「多分そっちだけでこっちのindex含まれてるから消せる気がする」みたいな会話はした)。
ここで1段階レベルが上がったという感じがして、appのほうのCPU-boundに切り替わった。
N+1がぜんぜん解消できないので、そすうさんにおしつけつつ、1と2をappにして前段2台構成にするとスコアは伸びるものの、もちろんDB-boundへと返ってきた。
このへんでだいたい最終スコアと変わらないぐらいの点数となっていた。
細かな修正をいくつか入れて若干よくなったり、そすうさんがN+1を解消してくれたりしたがあまり点数が伸びない。
このへんでログの解析ミスっていたことが効いてきてしまっていたのかもしれない?
あと1変更ぐらい跳ねられたら本戦出場もありうるかという思いで色々試みるものの、時間内にできたのはこのへんまで という感じだった。
箸にも棒にもではなくワンチャンあった ぐらいという感触で悔しい。
反省・まとめ
全くリクエストが来てないようなエンドポイントなんかたぶんないから、ALPでなさそうな感じがしても、生ログのgrepぐらいはしてもよかったと思う。
/icon
は来てないし手があいたらやるか とか言っていた。 あとは単純に手が足りていなくてあと3倍高速に行動できていれば……。
来年こそは本戦行くぞ……(毎年言っている)(初回(ISUCON5)で学生枠で一度行けてから、毎年また行くぞと言っているがまだ行けていない。今年はそんなに遠くなかったと思うのでやっぱり悔しいね)。
今年の運営はめちゃくちゃスムーズだったのでよかった。ありがとうございます。