会社の同僚と一緒に「尿酸値E」としてISUCON6出ました。
Ruby実装を選んで、最終的に「32660」というスコアで予選敗退。今年こそは本戦出るぞと意気込んでいたのでとても悔しい。
事前準備
前回出場時に、序盤の解析系作業で手こずったため
今回はかなり念入りに解析ツールの準備を行っていました。
事前に立てていた作戦
- 午前
- 午後
今回は午後の作戦を事前に話してしまったことで、キャッシュ戦略への切り替えが遅くなったのが敗因ぽい。
htmlify
がボトルネックだということに午前の段階で気づけていたものの、ロジック改善を頑張ってしまい
結果スコアが伸びずキャッシュに切り替える時間をロスした。
当日タイムライン
9:30
無事に集合。前回に引き続き、会社のオフィスで作業させてもらうことに。
普段なれてる環境で作業するのが1番でした。
10:00
Azureにデプロイ。
最初なぜかインスタンス起動でエラーが出て、30分ほどリソースグループごと作り直したりしてた。
- とりあえず1度ベンチマークを流す
- 「isudaってなんだ? 増田か!!」
- 「メモリ7GB近くあって結構いろいろのせられそうだね」
nginx.conf
見て「isudaとisutarがマイクロサービスっぽくなってる」- githubにコードを上げておく
- dumpを取る
- ローカルで動かす
最初のインスタンス起動トラブルで焦ったものの、アプリケーションが動き出してからは比較的スムーズにいった。
この時点では作戦通り、まだアプリケーションを読み始めていない。
11:00
事前に準備をしていた解析ツールを入れて導入検証を進める
- kataribeでnginxのアクセスログを解析 https://gist.github.com/takanamito/e3d52c7f07b33a748d47306b04da6628
/
がめっちゃ遅い/css/bootstrap.min.css
返すのにやたら時間かかってる
- pt-query-digestが動かない
- インストールはできたけど実行時にエラー吐く
- 解決に時間がかかりそうなので諦める
- 今回はクエリ的にまずい箇所は少なかったので早めに捨てて正解だった
- stackprofでアプリケーションの解析 https://gist.github.com/takanamito/5ed01a2b50c86bdd0a7caab2e7c0c28b
- 「
htmlify
とkeyword_pattern
がやべーから殺せ」
- 「
- デプロイスクリプトを用意 https://gist.github.com/takanamito/509bb41e5220562560662b83754b770b
- 作戦会議
この辺の作業は
ISUCON予選突破を支えたオペレーション技術 - ゆううきブログ
ゆううきさんのブログを参考に用意していた。
特にデプロイスクリプトでミドルウェアごと再起動するあたりは、忘れがちなので用意しておいてよかったと思う。
作戦会議の結果、特に事前に話していた作戦とは差分なく
- アプリケーション改善
- ミドルウェアチューニング
- DBのindex改善
みたいな配分で作業していくことになった。
ここまでは予定通り。
12:00 - 15:00
各自の改善を入れて少しずつスコアが上がる。しかしこの時間帯はスコアが1万にものらない。 以下のようなことを試した。
- nginx -> unicornのunixドメインソケット化
- staticなファイルをnginxで返す
- unicornのworkerを増やす 5 -> 10程度
- istarをisudaに統合
- MySQLにインデックス追加
keyword_pattern
,htmlify
のロジック改善- ispamは解析始めると時間がかかりそうなのでいったん放置
ロジック改善以外はそこそこ効果があった。 正規表現部分だけどうしようもなくて、徐々にキャッシュの方に話がいきはじめる。
15:00 - 18:00
15:00すぎから、少し作業を止めて話し合い、キャッシュ導入を検討しはじめる。
最初は htmlify
まるごとredisにキャッシュ。たしかこれでスコアが1万を超えた。
そこからまた少しスコアが伸び悩み、再度ロジック改善に走る。
その間に htmlify
の処理を細分化し、さらに細かくキャッシュしていく。これでスコアが2万を超える。
また17:00の時点で一度インスタンスごと再起動してベンチマークが走りきるか確認。
キャッシュを進めていくと今度はまたstaticなファイルを返すのに詰まりはじめたり
ファイルディスクリプタを使い切ったりしたのでカーネルチューニング。
最終的に終了直前に keyword_pattern
の結果をredisにキャッシュしたあたりで3万オーバーのスコアが出て終了。
終了後
近所のすしざんまいに行って反省会
isucon お疲れ会 pic.twitter.com/kRGPZxJPiX
— takanamito (@takanamito) 2016年9月17日
個人的には
- キャッシュ戦略の引き出しが足りなかった
- 正規表現周辺のロジック改善にこだわりすぎた
/initialize
の5秒を使えず
あたりに後悔が残ってます。
今年けっこう気合い入ってただけに悔しい。本戦出場の壁高い。
しかしISUCON楽しい。出題チームの方々もおつかれさまでした。