@ijin

[Michael H. Oshita]

ISUCON3の本戦に参加してきた

先月の予選に通過したので、ISUCON3の本戦に参加してきました。

完敗。

お題発表

画像版twitter。投稿する画像の公開レベルをpublic, private, followers onlyに設定できるシステムが1台のVPS(2コア、4GB RAM)で動いている状態。プレスを打った為、大量アクセスがくる18時までに別途用意された4台のサーバを使ってスケールせよという使命を与えられる。

流れ

画像データが1万点・約3GBあったので、まず失敗しても戻れるようにバックアップ取得を開始。それと平行して他のサーバへのsshキー登録したり、hosts書いたり、もろもろ下準備。

デフォルトのperlのスコアは1206.8

言語はrubyと決めていたので、supervisorで立ち上げてみるが起動失敗。よくよく調べてみるとforemanが入ってなくてGemfileに追加してbundle。

この時のスコアが1180.8

次にデータベースを見てみるものの、レコード数も比較的少なく、総容量が2MBもないのでできる事は限定されていると判断。クエリーをさらっと見た後にentriesのimageカラムに対してインデックスを張ったぐらい。

アクセスログにレスポンスタイムを出力するようにして1回ベンチを走らせログを解析。

ブラウザ上の挙動を確認しつつ、ソースコードを読んで結局画像変換のconvert処理が一番重そうだったのでそこから着手することに。

予選の時も外部プログラムを呼んでいるところが改善ポイントの一つだったので、まずfastimage_resizeを使って置き換えてみるものの、処理速度はそんなに上がらず、スコアもほぼ横ばい。

その間に、ロングポーリングの処理を変更してみるけど、

 "message": "2013-11-09T14:48:17 [36898] [CRITICAL] timeline refrection timeout"

タイムラインの反映がうまくいってない模様。 (ちなみにエラーメッセージのrefrectionはreflectionのスペルミスですね)

次に画像変換処理の部分で毎回リクエストがくる度に実行されるリンクをredisにてキャッシュ。これは効果があり、スコアは6634.2で暫定3位。

その間にVarnishやHaproxy + nfsを軽ーく試してみるものの、スコアは伸びず。

この辺でリンクだけではなく、画像自体をredisに突っ込んで全サーバで処理するアーキテクチャを決定。@acidlemonさんと似た構成ですね。ただ違うのはPOST後のsidekiqを使って処理を裏のワーカーに任せるという事。

sidekiqが動作するところまではでき、全画像の変換を試みるがredisサーバのメモリが溢れてたので、最初にアクセスされる直近30件、アクセス比率が高いサイズsと、新規画像のみに注力。スコアは徐々に上がる。

その後はただひたすらに、もくもく実装とデバッグ。

残り3-40分ぐらいのところで、生ハムチームでブレークスルーが起こり、彼らが一気にトップへ踊り出る。我々も1台構成であれば5位ぐらいにはなれただろうけど、スケールアウトしなければ全く勝負にならないので最後の最後まで果敢に挑戦するもあえなくタイムアップ。

結果、FAIL。

感想

今回はサーバが5台もあったので、スケールアウトしなければならないのは明白で、実装を真っ先に着手するべきでしたね。前半で1台だけチューニングして後でスケールしようと思ったのが戦略上の致命的ミス。時間切れで終わったので実装が間に合っていたらそれなりのスコアが出たはずかと。優勝した生ハムチームが結構ギリギリまでかかったのを考えると、やはり見極めたポイントは重要で、さすがとしか言いようがないです。また、一番時間のかかった画像配信に関しては普段AWSを使っている身としてはs3へ画像を突っ込むのが当然だと考えていたので、なかなか新鮮で違う脳を使う感じで楽しめました。

その他

  • 途中ディスカッションをすれば良かった(予選は上々でも本戦で焦ってしまった)
  • 落ち着いて俯瞰して見るべし。見極め大事
  • 予選とかの先入観が邪魔したのでまっさらの状態で考えるべき
  • ベンチマークツールはFAILしても再実行に2分待たされるのがどうしてももどかしかった
  • ベンチマークツールの他のサーバへの実行切替がバグってて時間をロスった
  • チーム名のRevengeが果たせなかったので、来年はチーム名どうしようかな。。
  • ドヤモリスが満面の笑みで幸せそうだった

ISUCONのレベルも毎回毎回レベルが上がっていき、運営側の苦労が伺えます。本当にお疲れ様でした!また来年にも期待しています!

おまけ

さて。1年間待ち望んだイベントがあっという間に終わってしまって消失感・焦燥感を味わいつつも、気を取り直して次はAWS re:InventのGAMEDAYに日本から唯一(多分)の参加者として参戦します!

Comments