ISUCON予選に出た #isucon

ISUCON2013の予選にでた。

事前準備は、あまりできなかったので、ほぼぶっつけ本番で1日目の予選に参加した。

当日 9:30 に 相方のid:urapico とオンラインで待ち合わせ。*1
google hangout と IRCでコミュニケーションをとった。

10:00開始で、運営から発表さらたAMIをもとにAWSのコンソールから指定のm3.xlargeでEC2インスタンスを起動。
urapico にざっくり内容を見てもらいつつ、サーバへの接続環境を整えつつ*2、bitbucketにつくったgitのレポジトリに対象のwebapp をまるっとpushした。

対象のwebapp は memoアプリでsignin/signout があるものだったので、PHP の実装をみて、手をいれるところを探った。
改修したらbenchmark を流すということをすすめて、実際のボトルネックになってるのは、mysqlのcpuが効いてるところまで把握。
また、php のデフォルトの状態でもbenchmarkツールがfailを吐くので、それをコードベースで治そうということして、urapico には、そこを追ってもらうことにした。自分は、mysqlとか、apacheとかphpとかのconfig周りを適宜いじった。
あと、netstat で 通常のmemcacheが握ってる11211 port をmysqlが握ってるのを見つけたけど、特に対策せず。*3

そうこうしていて、お昼になったところで、urapico が奥様の体調不良と、1歳になったばかりの息子の世話で離脱。。
その後、一人ですすめることになった。

結局、やったことは、mysqlのslowqueryを握りつぶすために、適切なindexを張ったのと、memos tableにusername を入れることにしてその事前準備用の仕込みと、phpコード内での、改修にとどまった。
事前準備用の仕込みは、benchmarkツールがベンチをとるたびにmysqlのデータを初期化するので、benchmarkツールのオプションで渡せるinit スクリプトに mysql のalter文、update文を作成。これが微妙に時間が取られてしまった。

終了間際で、benchmarkツールの--workload をあげてみたら、デフォルトの状態からでてたfailがあまりでなくなることがわかったので、apache等が死なないぎりぎりのラインまであげて、計測をまわした。

最終スコアは、3027 でトップの足元にも及ばない結果に終わって残念だった。トップの方々はおそらくmysqlをそうそうに捨てて、オンメモリのものに入れ替えたんだろうと予測できるけど、8時間の限られた時間の中での実装力が求められるので技術と経験が必要だろうなとおもった。

反省点

  • オンラインでやるのは、ちょっと厳しかった(どこかにあつまってやるべきだった)
  • ボトルネックの把握と、その対応をどうするかを時間の換算をしながらやるべきだった
  • 時間がなくてもcommit logはちゃんと書く
  • 前日に飲みに行かない

時間がなくてできなかったこと

  • countをcacheする
  • nginxにいれかえる

まだ、予選がおわっただけなので、本戦はこれからですが、運営の皆様、出題のkayacの方々、ありがとうございました!!
また、来年開催されれば、今回の反省点を踏まえてのぞみたいと思います!

*1:前日飲んでしまって起きれるか不安だったけど、起こしてもらえたのでよかった

*2:vimとmoshをインストール

*3:ちゃんと対策すればスコア伸びたはずなので失敗した