暇人じゃない

ISUCON 3 予選に参加してきた
ISUCON

同僚の @harutamakoto 、@asuenami と ISUCON 3 の予選に参加してきました。

最高点は 6900 点ほどで予選落ちでした。 未来の自分の参考になるかと思い、記録を残しておきます。

僕は主にアプリ周りを担当しました。 以下、チームでやったことです。(抜けがあるかもしれません...)

やったこと

  • 設定ファイル、アプリを GitHub でバージョン管理
  • Capistrano でデプロイを行えるようにした 普段、Sinatra でデプロイすることがないので手間取ってしまいました...
  • Apache から Nginx に変更し、静的コンテンツは Nginx から配信
  • インデックスを貼った
  • 一時ファイルを作って markdown コマンドを通して変換するような処理が重いなと思ったので Redcarpet を導入して置き換えた DOM 構造が変わるかと不安でしたが、そんなことはありませんでした。
  • CSS/JS を gzip で配信した あんまり意味がなかった模様、というかスコアが下がりました。
  • ログイン時に last_access を UPDATE しているが、どこでも使っていないので一旦削除。しかし何かの罠か!?と疑心暗鬼になり元に戻した 罠でも何でも無かったので大丈夫でした。スコアはあまり変わらなかったので気にするほどでも無かったのですが。
  • url_helper を使用せずに直書きにしてみたがスキームが違うとエラーが出たので元に戻した
  • GC を止めた、がよく考えれば止めるようなアプリではないのであんまり効果はなかったので元に戻した
  • nginx と unicorn の worker プロセス数を調整した nginx は 2、unicorn は 10 で落ち着いたのですが、unicorn は 50 にしていたというチームもあったということで、もっと試して見ればよかったかなと思いました。
  • markdown を HTML に変換したものを Redis に格納するようにした まずは手始めに... これだけでもスコアがだいぶ上がりました。
  • 総件数を Redis に格納し、メモを登録する時にインクリメントするようにした
  • タイトルと内容を分離
  • リストで使用するためにデータを Redis に格納した

    • JSON の dump, load は Oj を使いました
    • mapped_mget を使用して一気に取得するようにしました

終了 30 分前にインスタンスを再起動すると、ベンチマークが FAIL するようになりました。結局復旧できずにタイムオーバー... その後調べてみると、Errno::EADDRNOTAVAIL: Cannot assign requested address - connect(2) というエラーが多発していました。

以下のような書き方をしていたため Redis にアクセスしようとする度にコネクションを張っていたためです。 これをアプリで使いまわすようにしました。本当に反省しています...

def redis
  # BAD
  Redis.new(host: "localhost", port: 6379)

  # GOOD
  @redis ||= Redis.new(host: "localhost", port: 6379)
end

反省点

  • ちゃんとアクセスパターンを解析するべきでした。
  • Capistrano でデプロイするようにしていたが、git pull を行って unicorn を再起動するだけのスクリプトで十分かなと思いました。
  • workload の存在を勘違いしていた...
  • MySQL で行くのか、Redis などの他の DB を使用するのかもっと早めに判断するべきでした
  • 試せるのは一度限りだ、と、どなたかがブログに書いていましたが、その通りだと思いました。

他にも反省点はあると思うのですが、思い出したら追記します。 焦りがあったのが良くなかったなあ、と思いました。悔しいです。

帰りは太樹苑で焼肉を食べながら反省会をしました。

最後に、LINE 株式会社さん、面白法人カヤックさん、とても楽しい機会を作ってくださり、ありがとうございました。

経験を積んで、機会があればまた参加したいと思います。

オンライン予選の概要と開催日 & 本選開催日のお知らせ : ISUCON 公式 Blog http://isucon.net/archives/30675532.html

2013/10/09 追記:

うおー、悔しい!

ISUCON 本戦出場者決定のお知らせ : ISUCON 公式 Blog http://isucon.net/archives/32951235.html

ISUCON オンライン予選 関連エントリまとめ : ISUCON 公式 Blog http://isucon.net/archives/32874340.html

About

chocoby (GitHub / Twitter)

フリーのソフトウェア開発者です。 Ruby を使った Web 開発を得意としています。