2013年10月7日月曜日

ISUCON3 に参加して予選敗退したので反省してみる

ISUCON3に会社の方と3人でチームを作って参加しました。結果は... 予選敗退! スコアは初期状態のGoで測ったものが最終スコアです...

当日の流れ

今年初参加で、全く予習をしていなかったので勘所もなにもつかめず、まずWebアプリケーションがいくつか転がっていることを認識。言語は議論の末皆がやったことのある Perl に決定。 Perl の会社に務めているのに私だけ Perl がろくに書けません。

作戦は、まずコードを読んでボトルネックになっていそうなところを修正しようとして、コード分析から始めました。具体的には以下の様な点があがりました。

  • markdown を毎回 fork して変換しているのは遅そう
  • ログインしていない状態のページはキャッシュできそう
  • pager は怪しいけど後回しかな
  • 静的ファイルも後ろに投げているのでリバースプロキシで処理しよう
  • SQLにインデックスがなかったり、MySQLがデフォルトで動いているのをなんとかする?

それで、作戦としては基本的にはコンテンツから静的ファイルを作成して nginx の rewrite でがんばろうという話になりました。

最初に想定したアーキテクチャ

初期段階で「このアーキテクチャで行こう」となったものは次のような感じです。

フロント nginx
静的ファイルをサービスする
Webアプリケーション
markdown への変換と動的コンテンツの提供
バックグラウンドWorker
Webアプリケーションから受け取ったデータで静的ファイル生成&DB更新
memcached
アプリケーションとworkerから参照するキャッシュ
RabbitMQ
更新があった時にworkerに仕事を投げるqueue

いま考えると少し大掛かりすぎるわりには全体をカバーできていないアーキテクチャでした。

つまづいたところ

私の担当はworkerだったので、Queueからfetchして静的ファイルを生成するところを作成しだしました。 RabbitMQ との接続には Net::RabbitFoot を使いました。まずはトップページだけ... と思ってやって、ボチボチ出来かけたところで...

  • uri_for で URI 生成しているけど裏workerだと使えない
  • ページにユーザー情報埋め込んでるけど取ってこれない
  • っていうかセッション情報入ってる... 静的にして大丈夫?(いまさら

のようなところで悩み、うまく行かなくなって「ごめん、やっぱり無理...」と断念しました。

その後はいろんなページをmemcachedでキャッシュする方向に進みましたが、なかなか思うように成果が出ず時間切れで終了しました。

こうしたらよかったかな

  • チームで得意言語が違うとそれなりに不利なので、得意言語は合わせるorちゃんと予習したほうがいい
  • 全部を一度に作りなおす方法だとハイリスクなので、少しずつチューニングするほうが失敗した時のダメージが少ない
  • もっと積極的にbenchmark回せばよかった。つねにgit pullしてbenchmarkだけ回し続けるようにしてもいいくらい
  • プロファイリングしたのが午後4時ぐらいで、遅すぎた。
  • いろんな罠が仕掛けられている可能性を考慮すべきだった。
  • ベンチツールがどんなクエリを投げているのか統計とるべきだった

罠というのは、たとえば memcached が 11212 で上がっている問題がありますが、これは自分でmemcachedの設定を書き換えていて、「あれー、反映されない!」となっているのに気付かず、 stats とった時の値がおかしいのに気づかず... というので、自分の設定ミスばかり疑っていました。また、「DOMを変更しないこと」とあったので、スタイルシートの指定にトップページがあるのは気づいていましたが、変更できない... と諦めていました。

memcached 作戦はそこそこ動いて、testでスコア5000ぐらいまで行ったのですが「testは通るけどこの場合にうまくいかない」みたいなケースを見つけてしまいやり直して泥沼にハマってしまいました。多少FAILしても積極的にbenchmarkをとる作戦のほうがよかったと思います。

でも最大の失敗は、コードを中途半端に読んでボトルネックを「推測」するだけに終わり、最初からプロファイリングしたりシステムメトリックスを取得してチューニングに挑まなかったことだと思います。こんなですが会社ではチューニングもやってます...

次回があるとしたら、すぐにgangliaを入れれるようにしておいて基本的な数値は常に見ながらやるようにしようかなぁ、と思いました。あとNYTProfのようなツールの使い方をもっと覚えないといけませんね。

あと一人一インスタンスだったのでChefで構築しようとして途中で諦めてさらに時間をロスしていました。

くやしい

くやしいです...

0 件のコメント:

コメントを投稿