ISUCON11本選にチーム「焼肉ジャンボチキン」で参加して96,344点で4位でした。

今回は序盤がかなり調子が良く、ぎりぎり8万点を引いて特別賞をいただきました。 その後の改善はほとんど不発に終わってしまい点数が伸びませんでしたが、Failすることなく4位が取れました。

以下チームでやったことを簡単に書きます。
repository は https://github.com/ichyo/isucon11f にあります。

10:00 ~ 11:00 (73000)

とりあえず適当にDBの設定をした。

  • DBを別のインスタンスに分ける。
  • 最大コネクション数は128
  • InterpolateParams=truePREPAREを消す。
  • innodb_dedicated_server=1など
  • innodb_flush_log_at_trx_commit=0
  • disable-log-bin

echoのリクエストログがCPU10%くらい使っているので消した。

11:00 ~ 12:00 (77000)

nginxとappを分けてみると77000点ぐらいになって惜しい。2回に1回くらいFailするようになったので戻した。

12:00 ~ 13:00 (80000)

appを2台で動かしたい。assignments系はファイルに依存しているので1台に固定しつつ、ほかのエンドポイントは2台に分散するようにした (#6)。ここでぎりぎり特別賞に届いた。

13:00 ~ 16:30 (81000)

/api/users/me/grades がtimeoutしてるので改善しようとした。 N+1を消したり点数をWRITE時に計算したりして軽くしたけど、ほとんど点数につながらなかった。 今考えるとDBの使用率が一杯なので重いクエリから見るべきだった気がする。

途中で急にディスクが一杯になり、/initializeでファイルを正しく消せていないことに気づいた。コンテスト終了後に引っかからなくてよかった。

16:30 ~ 17:30 (90000)

しかたがないので一番重いSQLを眺めて速くできないか考える。EXPLAINして眺めているとGET /api/announcementsのSQLがインデックスの順番を入れ替えると速くなりそうだった。試すと意外と5000点ぐらい伸びた (#11)。

次に重いクエリを見ると、いらないトランザクションがあるので外した (#12)。2000点ぐらい増えた。

外部キー制約が要らなさそうなのでインデックスに置き換えた (#13)。2000点ぐらい増えた。

17:30 ~ 18:00 (98000)

もう時間がないので諸々の計測を取り外した。最終的に98000点ぐらいになった。