チーム「さばかんちゃーはんかれー」でISUCON9に参戦してきました。

昨年と同じメンバーの @matsukaz, @kz_morita と共に今年もISUCONに参戦してきました。
最終スコアは 8860 で 予選通過ラインの 10000 には届きませんでした。あと一手何か入っていれば行けたかも。悔しい。
とはいえ今回はあまり対策という対策はしていなかったので思ったよりは戦えていたようにも思います。

やったこと

起床 - 10:00

今年も集合時間を指定しておきながら、自分が一番到着が遅かったです。みんな優秀。
簡単に作戦の打ち合わせをしたり、環境の整備などをしていました。

10:00 - 12:00

インスタンスを立ち上げて、ソースコードや各種設定ファイルをGit化したのちにレギュレーションを読み込み。
また昨年はいちいちsshしてインスタンス内でbuildかけたり、git pullして反映させたりするのがかなり面倒だったので、 ローカルでビルドしたり変更した設定を、コマンド一つでデプロイできるようにスクリプトを整備。
初期スコア2000くらい。

12:00 - 14:00

nginxで静的ファイルを返すよう対応。
また、やたらとロックをかけていたので明らかにいらなそうなロックを解除したり、冗長なクエリを除去したりする。
あまりスコアにインパクト無し。

14:00 - 15:00

今回は外部サービスが各所で呼ばれているが、明らかに不要な呼び出しを削除したり、シーケンシャルに呼び出している箇所を非同期化。
他のメンバのクエリ改善やインデックスの最適かもあり、ここで一気にスコアが6000くらいまで伸びた。

15:00 - 16:00

キャンペーンを調整してみるが、max connectionに当たってfailする。go側でコネクション数制限すれば、通るには通るがスコアが上がらないため最終的に戻す。

16:00 - 17:00

レギューレション内に新着情報をユーザにあったものにすれば購入されやすくなるとの旨があったので、getNewで返す内容を検討。
販売済みの商品を返さないようにするとややスコアが上昇する。
またユーザの購入履歴をみると同じカテゴリの商品ばかり購入しているので、ユーザの購買履歴にあるカテゴリの商品だけ返してみる。
これは件数が違うとかでエラーになるため諦める。
この辺りで、他のメンバのキャッシュ対応やN+1改善が入り、8000くらいまでスコアが伸びる。

17:00 - 18:00

外部サービス呼び出しをもう少し非同期化できそうだったで修正を開始するも、複数台構成にした方がインパクトがありそうなので中断。
しかし、複数台構成がギリギリ間に合いそうになかったので安全策をとって、軽微な修正に留める。
最後はベンチガチャで良さげなところでfinish。

感想

今年の問題は色んなポイントが盛り込まれていて、すごく面白い問題でした。すごく疲れましたがめちゃくちゃ楽しかったです。
ほぼぶっつけ本番だった割には、あまり手が止まるようなこともなく作業ができていたように思います。ただその分、地力の足りなさが感じられる結果でした。
来年もリベンジで挑戦したいです!