#isucon 2013で優勝しました

第三回 ISUCONの本選に、参加しました。予選から引き続き、@さん、@さんとの「LINE選抜チーム」。


第三回 #isucon 本選リアルタイムフォトレポート【更新終了】 : ISUCON公式Blog

結果はなんと、優勝!!
おや、優勝2回目だ。→第1回のとき

タイムライン

予選のとき同様に、自分の手元にある記録と記憶を辿ってどんな雰囲気だったか書き残してみます。間違っていたらゴメンナサイ。
使用言語はPerlです。

〜10:00
  • 出社…じゃなくて会場入り。ちゃんと前日に早寝したので寝坊せずに済みました。
〜11:00
  • 開会待ち。早くきすぎた、でも他の参加者さんたちも早くからしっかり集まってる。
  • ルール説明。ストーリー仕立てで緊張感が走る。画像系サービスか〜。
11:00〜
  • 開始。用意されたのは5台、初期実装で動くものは1台目のみ。
    • サーバの扱いに慣れているお2人に任せて鍵やらhost情報など整理していただき。
  • webapp/perl以下をgitリポジトリにして、github private repositoryにpush。
    • このへんは事前に共有しておいていたのでスムーズに。
    • 前回の反省なんかも踏まえ余計なものを入れないようにignoreとか
      • そのへんの手順やチェック項目も予選後にgithub wikiで共有しておいてたのは良かった
  • access logを分析してbenchmarkでどのURLにどれくらいリクエストくるか調べる
    • これも必要だろうと事前にtagomorisさんが用意していた
  • 手元のローカル環境で同じアプリを動かせるように
    • 画像はリポジトリに入れなかったのでそれさえ落としてくれば問題なく動くようになった
  • なんかlib以下にKossyが入ってるけど0.23で古いしCartonで0.25入れて使えばいいよね?
    • 11:42 initial commit
    • ついでにgit pullcarton installsupervisorctl reloadするdeploy scriptとかも用意
12:00〜
  • 一度手を止めてチューニング方針を話し合い。
    • 予選のときの反省で「発見順に手をつけていく」ではなくある程度の方針を決める相談タイムを設けるべき、と決めていた
  • 12:23 決めたのが以下。
    • **1をDBサーバ、画像サーバ、ワーカを動かすものとして使う
    • **2**5 の4台で受ける
    • 画像は投稿された時点で変換したものを作る
    • 既存の画像はバッチ処理で変換後のものを用意
  • 1台目に画像データを集約しフロントを4台で受けて、というおおまかな構成はこの時点で決定
  • 画像をPOSTされた際にローカルに保存だけして、レスポンスはすぐに返し別のワーカーで変換・転送処理しよう、としていた
    • のちに、これでは駄目で破綻することを知る。
  • 12:47 カスタマイズしたStarletに入れ替え、Proclet化など(kazeburoさん)
  • 12:50 apacheをnginxに入れ替えて再度ログを取ってみたり(tagomorisさん)
13:00〜
  • お昼ごはん。
  • 13:41 画像データ集約のためのWebDAVサーバ構築(tagomorisさん)
  • 13:45 アイコン画像はキャッシュするようにする、など(kazeburoさん)
  • 14:12 画像POST時にローカルに保存し、別のworkerでconvert処理しGET時にそれを返すよう変更(sugyan)
    • まだWebDAVは使ってない
  • 14:45 timelineまわりのSQLチューニング(kazeburoさん)
  • 15:22 uri_forのチューニング(kazeburoさん)
  • 15:24 WebDAVFurlからのPUT/GETでconvert画像をやり取りするよう変更(sugyan)
  • benchmarkを走らせてみたがエラー頻出、ダメだ
    • POSTのレスポンスからすぐにGETで画像とりにこられたらダメだよね、ということに気付く
    • workerでconvertする方法自体が破綻している、ということでボツに
  • 既存の画像のcrop_square & convertした画像を生成する作業に取り組む(tagomorisさん)
  • 15:59 iconのPOSTされたものはconvertしてWebDAVへPUT/GETするよう変更(kazeburoさん)
  • 16:28 画像もPOSTされた時点でconvertしてWebDAVへPUT/GETするよう変更(sugyan)
    • 全台で動かしても大丈夫だよね、ということで**2**5へのデプロイも始めたり
17:00あたり〜
  • 画像の変換も無事に終わる
  • なんか色々うまく動いていなかった部分を修正したり
  • 17:30くらい? ようやくエラーなく走り切り、workloadも増やし40,000点越え
    • 特別賞獲得!知らなかったけど次のチームと1分半差だったんだ…
  • まだDB初期化せずに再度benchmark走らせるとエラーでるとか
  • あやしいところを潰して、最後に初期化して提出
  • で、終了
結果発表
  • ドキドキ
  • 177,290点で優勝!

まとめ・雑感

予選のときの反省を活かし、目についたところから手をつける、ではなく一度話し合って方針を決める時間をはやめに設けた。(ほんとうはその実装は15時頃には終わらせてそこからさらにチューニングするくらいのつもりだったけど最終的にはそこでほぼ終了だった…)
やっぱり焦って色々ミスったりもしたけど、冷静に(?)間違っている部分を探して素早く直して進めていけていたのではないかな、と。どハマりして死んだ、とかは無くてよかった。最終的に時間ギリギリにはなってしまったけど。
IRCのチームchannelはログ40行くらいしか残らず、ほとんどが口頭でのやりとりで対面のコミュニケーションで進めていた。良かったのか悪かったのかは分からないw


ともかく、良い結果を出すことができてよかった!kazeburoさん、tagomorisさん、ありがとうございました!
出題者、運営の皆様、ありがとうございました!


先月の予選と今日の本選と行きたい現場に行けなかったぶん、賞金でたくさんアイドルに会いに行こうと思います。