Isucon6 予選に参加した

去年に引き続き、今年も同じメンバーで チームYashio として isucon6 予選に参加してきた。
今回は去年の経験を活かして予選通過できそうな気がしていたけど、またしても結果は惨敗で非常に残念。

前日までの準備期間

ちょうど1週間前あたりから、azure にアカウントを作って前回の予選の環境をデプロイして、 3人で色々な改修・実装を試してベンチマーカーを回したりして楽しんでた。
この一週間はとてもイイ感じで、N+1 を解消してみたり、DB のデータを redis にキャッシュしてみたり、3人で愚直にスコアを上げるのを楽しんでいて「なんかこれ今年は行けるんじゃない?!」みたいな雰囲気を感じてた。
あと、去年はサーバ上で直接コード修正するなどしてしまい、メンバーが並行して実装する事が非常に困難だった反省から、ローカルでの開発環境構築と deploy の仕組みの整備を @muratayusuke が確立してくれて、当日もおおいに役立った。

当日

今回はヒカリエの会場で参加。
朝は若干の緊張と期待感で、部活の試合の日の朝っぽい感じだった。

10時に始まってからは、@muratayusuke が競技用のインスタンスの起動とか deploy 周りを整備したり、ruby 実装が起動するようにするなどした。
@tatsuyaoiw がコードを読んだりアプリケーションを触って理解を進めてた。
僕は、開発用として、マシンイメージを別の環境にデプロイしてインスタンスを起動して、そこの DB にローカルから接続できるように設定して、ローカルでアプリを動かすための設定をするなどした。
ローカル環境で開発して本番に deploy できる環境が整ったのがだいたい11時過ぎくらい。

ruby 実装での最初のスコアは 1100 くらいだったけど、スコア安定しなくて大体 0 だった気がする。
そこから @muratayusuke が nginx から static ファイル返してクライアントキャッシュ有効にしたり、 unicorn の worker 数増やしたりして 3000 くらいまで上げた。

stackprof の結果見てて、#htmlify がとにかく遅いって事で @tatsuyaoiw と話したりして、正規表現を使わない実装にチャレンジしてみた。
で、ここから何度か修正してはベンチマーカーを流して、「リンクがありません」エラーメッセージが出てそれを見て直してを繰り返して15時くらいまでひたすらやったんだけど、エラーが完全に取れなくて一人疲弊してきて、正規表現使わない実装は諦めて、keyword 一覧を redis から取ってきて、それを content に含まれてる keyword だけに限定して gsub に渡すっていう修正にとどまった。
これで 16,000 までは上がったけど、もはや上位陣との差が空いていて厳しい感じだった。

それから @tatsuyaoiw が user の情報を redis でキャッシュしたり isutar へのアクセス回数を減らしたり、@muratayusuke が nginx の設定変更とかもろもろやって 19,000 くらいが最高だった。

まとめ

一つに時間掛け過ぎた。一時間くらいで諦めて他の方法とか箇所とかに切り替えた方が良かったと思う。
終わってから3人で飲みに行って悔しがった。
今回のお題は、スロークエリや N+1 みたいなものがほぼ無かったので、とにかく #htmlify をなんとかしないとーっていう感じだった。
そこでアルゴリズムの問題としてそれに向き合っていた時間が長すぎたんだけど、生成された html 自体をキャッシュするとかっていう方向でも良かったわけだし、そういう方針の切り替えができるような落ち着きの時間を持てると良さそう。
予選後に飲みながら話してた時に「そういう方法があったね」って話になったから、本番中に一旦落ち着いていればそれを思い付いて実行出来てたかもなーって思った。
来年こそは…!!