ISUCON10予選に「Railsへの執着はもはや煩悩(ry」で参加したけどダメでした

ISUCON10の予選に参加しました。

今年は@cnosukeさんと@aibouさんと、「Railsへの執着はもはや煩悩の域であり、開発者一同は瞑想したほうがいいと思います。」というチームで参加しました。 この3人でのISUCON参加は初めてでしたが、cnosukeさんとは毎年参加していることと、aibouさんは前の職場が同じだったということもあり、またcnosukeさんとaibouさん同士も知り合いだったので、とてもスムーズに進められました。

先週にISUCON8の予選問題を使ってリハーサルを行ったのですが、カンを取り戻す意味で非常に良かったです。

(今回の予選問題については、きっと公式の方で解説をだしてくれると思うのでそれを見ていただきたく。)

なんとなくの役割分担として、cnosukeさんがAPIのコード変更を行い、aibouさんがDB周りのチューニングを行い、自分はgit管理したりと雑多な対応やデプロイ実行などをしていました。

APIを眺めてて、chairテーブルとestateテーブルを両方さわるエンドポイントがほとんどなかったので、基本戦略として1号機がベンチマークの受付と静的ファイルを処理し、2号機がchairsに関するAPIとchairテーブルの処理、3号機がestatesに関するAPIとestateテーブルの処理を行う方針で行くことにし、それからイロイロ遅いところを改善していこう、ということを決めていましたが、最終的に815点(最高点でも845点なので多分誤差)に留まってしまいました。

f:id:rkmathii:20200913112057j:plain

競技用リポジトリのgit logを眺めつつやったことをざっくり振り返ってみると、

時刻 やったこと メモ
09:15 集合
開始時刻が12:00になることが分かったので暇つぶし。
散歩したりNFLを見たりひたすら楽してロマサガ3リマスターを見たりしてた。
12:20 競技開始 初手でとりあえずベンチマークを走らせようとしたが、
混雑していて難しかったので先にソースを読んだりをすることにした。
12:41 webappや、schemaをダンプしたものをgitリポジトリに突っ込んだ。
13:36 new relic導入
13:37 初期スコアが500くらいだった気がする。
14:20 POST /initializeの処理を分けた このときに1号機がベンチマークの受付と静的ファイル、
2号機がchairsに関するAPIとchairテーブルの処理、
3号機がestatesに関するAPIとestateテーブルの処理を行う方針を決めた。
14:49 ほとんどのAPIを2号機と3号機に分散させるようにした。
15:03 GET /api/recommended_estate/:id だけは
estateとchairの両テーブルを触っていたので、
3号機に処理させつつ、chairを引いてくる処理だけ2号機にAPIを生やすことにした。
15:49 unicornをpumaに置き換えた。
15:52 テーブルにインデックスがなかったので、いい感じに貼ってもらった。 今回は書き込み処理がほとんどなかったので、インデックスをたくさん貼っても書き込み処理で詰まることはないだろうという読み。
16:25 chairとestateのテーブルを正規化し、DB処理の高速化を図った。 が、完走しなくなってしまったのでバグ調査。
19:00 estateテーブルのrange indexが効くようにrentの値でpartitionを切った。
19:28 GET /api/recommended_estate/:idでDBで重いソートが走っていたのでRuby側でやらせようとしたが、
なぜか完走してくれなくなってしまった。。。
のでrevert
19:37 インデックスを更に追加。
19:57 テーブル正規化のバグが取れて完走するようになった。
20:46 そういえばbotのアクセスは503で弾いていいんだということを思い出したので、急遽nginxの設定を変更。
20:55 最終スコア815で終わり。

これ以外にもmysql, nginx, pumaの設定ファイルをいじったりしていましたが、ほとんど効果はなかったです。

chairとestateがきれいに処理が分けられるので、それぞれ2号機と3号機に分担させたという方針は良かったと思うのですが、APIもDBも載せてしまっていたので、もしかしたらDBだけを担当させるようにしていたらもうちょと伸びたのかな、、、と終わってから思いました。

new relicを眺めて、一番処理に時間がかかっているAPI、次に時間がかかっているAPIをそれぞれ担当を分けて対応していく感じで進めていたので、(ちょっとコンフリクトしたことはありましたが)そんなに大きくトラブったこともなく、わりと進めやすかったと思います。

結果が出ず残念ではありますが、問題もわかりやすくとても楽しい予選でした。

今回のISUCONは参加チームがとても多く、しかも例年と異なり1日で全チームの予選を行うため、サーバを用意していただいたり運営するのがとても大変だったのではないかと思います。

最後になりましたが、運営の皆さま本当にありがとうございました!!