ISUCON4本戦に「railsへの執着はもはや煩悩」というチームで参加しました

f:id:k0kubun:20141109002503p:plain

@cnosuke@rkmathiと僕で学生枠で予選通っていたので、ISUCON4本戦出てきた。

予選で反省して直した点

悲惨な前回の記録

予選の時は常に精神的に余裕がなかった上にチームワークが全く成立していなかったので、@cnosukeに指揮をとってもらってお互いの作業が被らないようにし、 サーバー上で変更を加えるときは声を掛け合い、またチームの誰かが話してるときは落ち着いて聞くようにした。

前回はDevOps的なことに時間を大量に使っていたけど、普通に全員サーバー上で作業して手動デプロイするようにした。 @cnosukeと@rkmathiがインフラを見てくれていて、僕はアプリのコードの読み書きに集中できたのでよかった。

戦略

ファイルサイズの大きい動画配信だったので、何か去年と同じような問題なのかなーと思って全台の帯域を使い切ることを目標にした。 フロントは3台でリクエストを受け、動画は各サーバーにおいてそのホストにリクエストが行くようにして、それ以外の資源はコアが多いサーバーにおいて共有するようにした。

僕がやったこと

チームのリポジトリ: k0kubun/isucon4-final

時間 score やったこと
11:00 - リポジトリの準備。ここから2時間くらいじっくりコードを読み始める。
12:00 - めっちゃおいしい弁当食べた。
13:00 1344 みんなで戦略を立てた。僕がRedis周りのコードを改修することになったのでRedisがどう使われてるかじっくり読み始める。
14:00 1344 まだRedis周りのコード読んでる
15:00 4746 やっと僕の中でRedisをどう変えればいいか確信がもてたのでコードに触り始める。POSTされた時点で動画のリクエストを飛ばす先を固定する変更をデプロイしてベンチが通ることを確認。なんかインフラ側でVarnishの導入などで点が上がっている。
16:00 4746 1台のRedisを共有し、動画だけは各サーバーのRedisに置くという変更を入れ、3台に向けてベンチを走らせるように変更するも、FATALが出る。
17:00 4746 3台にリクエストを飛ばすとFATALになる理由がログだけ各サーバローカルになっていることに気づき、ファイルロックの代わりにMySQLを使うことにする。必要なスキーマ定義とインデックス張りをやった。
18:00 5922 ちゃんと動き始めたんだけどメモリが足りなくてRedisで死に、ここでやっと動画をRedisに入れなくした。余裕がなかったのでFile.writeしてsinatraでFile.readするだけ。うまく動いてからはローカルで8000〜12000くらいのベンチが出るようになったので、再起動確認をして提出することにした。

結局FATALが出まくってリモートは一度も高い点出せていなくて、実際最終スコアは5922になっていてそれほど高くならなかった。 でもFAILしなくてよかった。

感想

なんかみんなFAILすると思ってたのと、点差がめっちゃ開くと思ってたのに、みんなFAILしないで似たような点数だったのが面白かった。 1万点を超えるチームあんまいないと思ってたけど、1位がめちゃくちゃ高い点出してるの見て、実力の違いを感じた。

普段Railsのおかげでソース読むスピード上がっていて、Sinatraしんどかった。(煩悩)
複数台構成も動画配信も自分は普段やってないことなので、出題の意図を考える余裕すらなかったけど、現状できることはできた気がするのでよかった。 けど、正直学生相手には勝って学生賞をとって帰りたかったので、くやしい。

社会人相手にも勝って当然なくらい実力をつけられるようがんばります。
ISUCONとても楽しくて、参加できて本当によかったです。運営の皆様、本当にお疲れ様でした。