@Konboi memo

主に技術に関してつらつらと。

# isucon3に参加して惨敗してきました

先日おこなわれたisucon3に @tkuchiki, @hilotter と

チーム 「既婚1人 + その他2人」で1日目に参加しました。

この通り、soh335チームとのじゃんけんに勝利してしまったお陰で、 カヤック選抜チームとしての出場になってしまい始まる前からプレッシャーがMAXでした。

言い訳です。 はい。

ということで、当日の流れを時系列的で思い出しながら書きたいと思います。

15時以降はほぼ口頭だったので、記述が少ないですw

開始前

事前準備として、

  • @tkuchiki が インフラを @hilotterと自分がアプリ周りとざっくり役割分担
  • 起動したら、1回テスト通してからアプリのソースコードを見ていこう
  • コードは @tkuchiki が用意してくれた github のプライベートリポジトリでやろう

って事が、決まってました。

スタート

  • 自分が10分ギリギリに到着する
  • 問題なくamiを見つけ起動しログイン ここまでは @tkuchikiが落ち着いて対応

10:30~

  • rubyで走らせた初期スコア
2013/10/05 10:29:03 done benchmark
Result:   SUCCESS
RawScore: 2446.3
Fails:    0
Score:    2446.3
[OK] 結果を管理サーバに送信しました
  • 結果画面みて暫定1位になってよろこぶ
  • (この後1位になることはなかった…. orz)
  • @tkuchikiがソースコードをgithubにpushしてくれる
  • pullしながらサーバー色々みる
  • ruby以外のコードもpush したのでcloneが終わらない
  • 11:00~

  • pull出来たのでソースコード見始める

  • アプリの修正の方針は、 毎回 memo/:id に来た際に markdownを作ってるのでキャッシュしよう
  • キャッシュ部分もworkerに流したいね。
  • 劣悪なqueryは @tkuchiki に探してもらって見つけ次第対応しよう。
  • みたいな感じでスタート

11:30〜

  • 初期データローカルでもほしいよね
  • やるねと自分が 何も考えずに mysqldump して scp で手元に持ってくる
  • このとき local test を2,3回程走らせてたのでデータがでかすぎて時間かかる
  • 更にpush しようとしたら100M こえててpush できない。
  • ここで自分のgit でエラーが頻繁してcloneし直し。
  • やっとコード書き始める

13:00〜

  • なぜかテストが実行できなくなる
  • ということで disk full が原因じゃね? ということでディスクをノリで50GB追加
  • この頃からDali ( ruby の memcache ライブラリ) でbenchがこけ始める( memcached っぽいものだと気づかず)
  • ローカルでDB initializeしたいよねっていうことで @hilotter が /opt/data/isucon にある init.sql.gz をgitにpush してくれました。
  • が、これが罠だった…
  • その後、テストを実行できないエラーが頻発しテストが出来ない状態に。
  • 調べてみるとinit.sql.gzはファイルをサイズをチェックしているらしく、解凍してはいけないものだった。
  • さてどうしたものかと思ってたら @tkuchiki が 別途インスタンスをたててそっからinit.sql.gz を持ってきてくれてなんとかなった。

15:00〜

  • markdownをRedisにのっけることに成功し、+1000 ぐらい
  • Daliのエラーを直すべく @hilotter が session周りを memcache からRedis に載せ替えてくれてました。
  • workerに流すよりもクエリ改善しようってことになり、 @tkuchiki と @hilotterが連携して脇でクエリ改善をしてました。

16:00〜

  • 細かいクエリの改善で +500~+1000 で 5000前半をウロウロ
  • index貼ったのにスコアアップしないと悩んでたら init オプションで実行させる必要があり もろもろ @tkuchiki がやってくれました。

17:00〜

  • NewerとOlderのページ送り部分を@hilotter が実装し終わる
  • TOPはcacheしようと自分がRedisにキャッシュさせる
  • このころ スコアは 5500が6000に届こうとする程度...
  • その時README.mdを読みなおした@hilotterがもう1このオプションなに? となり実行
  • スコアが一気に 6900 ほどに
  • 残りはunicornのworker数とworkbenchのオプションで微調整。
  • 18時までに再起動して動く状態に持ってかないといけないと勘違いして、残り10分はその作業してfinish

こんな感じでした。 選抜に選ばれてなかったら予選敗退。 大変悔しい結果でしたね。

反省点

  • @tkuchiki が途中アプリみたいり、自分がnginxの設定したりと中途半端になってしまった。
  • もっとどんなアプリがなのかみればよかった

などなど… 反省すべきことはたくさんあります…

が!!

もう1回惨敗し、失う物は何もないので 本選では 名誉挽回 できるように頑張ります!!

最後に

運営の皆様、このような素晴らしいイベントを企画、運営していただき本当にありがとうございます! 本選もよろしくお願いします!!