isucon5予選に出てクエリキャッシュを有効にしました
isucon5の予選に出て見事僕のチーム「古典論理の犬」は予選を学生枠1位で突破したので僕がクエリキャッシュを有効にした話をします。
isuconとは与えられたウェブサービスを高速化するコンテストで賞金もあります。僕のサークルからは6人出場してニチームに分かれたのですが、そのうちの一チームとして参加しました。
準備
とりあえず一度集まって古い予選をしてみたら iojs と nodejs の分裂に巻き込まれてベンチマークさえ回せなかったので諦めて解散し、新しいのをすることにした。
結局第三回と第四回をやってみて、第三回はまったく芳しくない感じになってindex張っておしまいみたいな感じだったのだけれど、第四回はインフラの @lastcat_ さんのおかげでいい感じのスコアが出た。
その後 golang が速いという話になって、一人で golang で redis にコツコツ置き換えた結果39kぐらいは出てくれたので、満足して予選を迎えました。
予選
蓋を開けてみると golang バグってるらしくて fix なんかしたくないし、第三回の net/http 使った実装に戻ってるし… ということで諦めて ruby ですることに。 ruby はコーディング合宿で300行ぐらいだけ書いたぐらいだったけどまあ python みたいなもんだしいけるやろ、って感じだった。
でもスロークエリとか解析したら明らかにSQLが引っかかってたのでどうしたもんかと考えていたけど、結局良くわからなくて自分は redis に一部置き換える方向でしてみた。
ただ予想以上にコメントとかの件数が多くて /initialize
の30秒では余裕で載せきれない感じだったし、index 貼るのにも時間がかかる感じだったのでうまくいかず、重いクエリ結果のキャッシュに使う実装をして何回も ISE 眺めながらなんとか間に合っても 750 とかいう恐ろしいスコアが出たので、30分前には諦めて他人の進捗を眺めることにした。
最終的に最後の最後にクエリキャッシュONにしてみてはという助言で 2.5k 程度点数を上げたぐらいしかしてなさそう。
レポジトリはこちらで、nonylene-redis ブランチに redis 入れる程度のコードはあります。
その間にチームメイトがいろいろやってくれたおかげで学生枠1位になれたので本選行きます。(ちなみにKMCのもう一方のチームは学生枠を超えて一般枠でした。さすが強い!)
反省
- 問題の洗い出しはできていて、こういう感じにすればよさそうってのはわかったのだけど、どういうクエリ打てばいいかわからなかったので失敗という感じだった(結局チームの人がやってくれたのでよかったけど
- その間にindex貼るとかすればよかったのでは感ある。
- mysqlのクエリの改善するまえに redis にさっさと移行するの、慣れてればいいんだけど慣れてない状態だとよくないし、全部 redis に載せきるみたいなことしないとあんまりうまくいかない。
とりあえず今回の予選の復習したい気分なんだけどベンチマーク公開されてないのでどうしようかなあという感じ。反省点は見えたとはいえ楽しい予選だったので参加して良かったです。
本選は活躍して賞金もらって焼き肉食べるぞ!!!