ISUCON初出場と予選通過

少し前にtagomorisさんと飲んでたらISUCON出ようぜーって誘われたので、一緒に出ることになりました。
メンバーは、私(joker1007)、tagomoris, tnmtの3人。

今までの職場で一緒にISUCON出ようって感じの人が周りに居なかったので、今回何気に初参加だったのでえらい緊張してました。
特にモリスさんはISUCON無敗神話を持ってたので、足引っぱらないか不安でしたね。
前日に素振りした感じでは、Webアプリとして真っ当にチューニングしてスコア出せる感じなら大体いけるやろーと思ってたんですが、当日のあの問題の感じでは割と焦りまくりでした。

やった事は大体以下の様な感じ。

  • isutarを統合する (不要なマイクロサービスは殺すべし)
  • keywordリストを全部redisに乗っける
  • 瞬間的に各keywordに大量のアクセスが来てunicornが詰まるのでpumaに変える (loginとかのPOSTが詰まると減点がでかい)
  • nginxで静的なファイルの配信をしてクライアント側にキャッシュさせる

この辺りで、大体5000ぐらい。
周りが既に数万とか越えてて、これはいよいよアカンかなあと思ってました。
大体15時前ぐらいまでこんな感じで、俺達は駄目だ〜〜……という雰囲気ですげー辛かったです。
(後で知った感じだと、Rubyでやったチームは割と皆この辺まで辛そうだったみたいですが)
その後で、モリスさんがhtmlifyした結果を事前にrenderしてDBに全部保持するようにしたら50000越えて一気に10倍になりました。
この辺りでテンション上がってやる気が復活してきたw
後は以下の様なことに時間を費しました。

  • キーワードが新しく追加された時だけ、それを含むドキュメントをexpireする
  • トップページのHTMLをredisに突っ込む

これで大体10万から12万ぐらいになりました。
ただ、リンクが無いよというエラーがめっちゃ大量に出て辛く、キャッシュではそれをどうしても消し切れなかった。
ここで時間食い過ぎて、もうちょっと改善する余地があってもトライしきれなかった。
正直、エラー表示を気にし過ぎたのが失点だったと思います。無視して突っ走ればもうちょっと時間が取れた。
多分、pumaのワーカー数を上げるとかすればもうちょっとスコア伸びてたはずで、ちゃんとベンチの結果を得られてなかったのが残念でした。
最後の最後で、エラー消し切れてないけどスコアは出てるからこれでエンキュー。
これは落ちたなーと思って「人権をロストした」とかツイートしながらヤケ酒を飲みにいきました。
特に最後トップページのキャッシュを実装してたのが私だったので、時間内にやり切れなかった感じで、本当しくじったなーと思ってました。
途中から何となく思ってて終わってからモリスさんに、JRubyに変えてシングルプロセスでメモリ上に全部積んでスレッド立てまくれば実は結構スコア伸びたんじゃ、という話をしたら早く言ってくださいよー!って言われたw
そんな感じで店を探してる途中で、予選通過の案内を確認してその場でハイタッチしてヤケ酒から祝杯へチェンジすることになりました。



名立たるISUCONの猛者達が次々と爆死する中予選突破出来たのはとても嬉しいです。
モリスさんの無敗神話が継続できたのでチームメンバーとしてとてもホッとしました。


今回は私がRailsの基盤周りとnginxのちょっとした修正、後はモリスさんと相談して分担しつつ重いところを直すって感じで、インフラ方面をtnmtさんに見てもらってました。
インフラ方面の設定を任せてたらいい感じに準備しておいてくれるのにとても助かりました。後ログの情報を取っておいてもらったり、再起動のスクリプト用意してもらったり。
モリスさんには流石にISUCON慣れしていて段取りがとてもスムーズだったのにも、とても助けられました。


どうも参加者のツイートなりブログなりを見る感じだと、10万辺りで割と団子だったっぽく、ベンチマークのスコアのブレが結構大きかったこともあって、本当に運が良かっただけっぽいなあという気もしてますが、せっかく本戦出場できる機会を得たので、本戦ではしっかりと結果出していきたいなあと思います。


初参加でめっちゃ疲れましたが、とても楽しかった。そして予選突破できて本当良かったです。