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万を超える

この実装が今回秘孔をついたらしい。

16-17時

  • htmlifyの高速化のバグがなかなか取れなくてこのままでは間に合わない可能性がありそうということに気づき始める
  • これまでhtmlifyの高速化を信じて全く手をいれてなかったので、間に合わなかったことを考えて最低限keywordsぐらいはキャッシュするようにした
  • この実装で6万ぐらいまでいった気がする(記憶が曖昧)

17-18時

  • 初期データのdescription -> htmlの変換を予めやってDBに保存しといた上で/initializeでredisに全部乗っけるようにした
    • その結果スコア15万超える
  • htmlifyの高速化ロジックはバグが取れずにマージを断念
  • ログ切ったりunicornのworker数調整してベンチマークガチャ回して15万弱でfinishした

感想

  • htmlifyのロジック変更が間に合わない場合のことを考えた実装に取り掛かる判断が早めにできたのがよかった
  • アプリケーションよりのエンジニア3人で望んだけどなんとかなる問題でよかった
  • 途中がんばって色々やってもスコアが0ではりついて動かなかったのはつらかった
  • 本戦がんばります