ISUCON6 予選の記録
ISUCON6にしましまスペシャルというチーム名で会社の同僚と参加して最終スコア147,028で予選通過できました。言語はRubyです。コードはここに公開してます。
https://github.com/hokaccha/isucon2016_qualifying
以下やったこととかのメモ。
10時-11時
下準備を整える
- どういうアプリケーションか確認
- コードをざっと読む
- サーバーのスペックとか動いてるプロセスを確認
- ベンチ流してみてリクエストの傾向を把握する
- nginxのログから集計してブラウザから見れるような雑なやつを用意しといた
11時-12時
作戦をたてる
- とりあえず
/
と/keyword
が遅いのでそこを改善することにする htmlify
の改善、isutar
の統合、インフラ・ミドルウェア周りの設定の3つに作業を分けてそれぞれ取り掛かるisupam
もどうにかしたほうがいいかと思ったけど、計測結果を見るにそこまで遅くないのでこの時点で改善を捨てた(結果この判断はよかった)- とりあえずruby実装に変えてベンチ流したらスコア 0になってここからしばらく0だった
12-15時
- ローカルで開発できる環境作ったりdeploy script書いて開発環境を整える
- nginxでstatic file返す
- unix domain socketを使う
isutar
を統合してstarを全部redisに載せるuser
は最初に全部引いてきてメモリに載せる- unicorn の worker 数増やす
- などなど、
htmlify
の改善以外は(isupam
を除いて)ほぼほぼやり終えた - しかしスコア300点だった(0からやや進んで喜んでた)
15-16時
htmlify
の置換処理をいい感じにする最初の実装がマージされる- 正しくリンクが作られずベンチがfailしたのでrevertする
htmlify
の高速化が入ってもどのみち結果はキャッシュしといたほうがよさそうなのでキャッシュを実装してみるhtmlify
の結果をredisにキャッシュしといてPOSTでinsert/updateが走ったときに変更が必要なキャッシュだけ消す実装にした- キャッシュの実装が入った結果スコア2万を超える
この実装が今回秘孔をついたらしい。
@sora_h @kani_b select keyword from entry where description like '%#{keyword}%' で引いてきたやつを全部消した
— Kazuhito Hokamura (@hokaccha) 2016年9月18日
16-17時
htmlify
の高速化のバグがなかなか取れなくてこのままでは間に合わない可能性がありそうということに気づき始める- これまで
htmlify
の高速化を信じて全く手をいれてなかったので、間に合わなかったことを考えて最低限keywords
ぐらいはキャッシュするようにした - この実装で6万ぐらいまでいった気がする(記憶が曖昧)
17-18時
- 初期データのdescription -> htmlの変換を予めやってDBに保存しといた上で
/initialize
でredisに全部乗っけるようにした- その結果スコア15万超える
htmlify
の高速化ロジックはバグが取れずにマージを断念- ログ切ったりunicornのworker数調整してベンチマークガチャ回して15万弱でfinishした
感想
htmlify
のロジック変更が間に合わない場合のことを考えた実装に取り掛かる判断が早めにできたのがよかった- アプリケーションよりのエンジニア3人で望んだけどなんとかなる問題でよかった
- 途中がんばって色々やってもスコアが0ではりついて動かなかったのはつらかった
- 本戦がんばります