第三回ISUCONの予選に出たけどダメだった

つい数日前に、あおみかんさん(@AknEp)としんのすけさん(@cnosuke)と一緒に、第三回ISUCONの予選に出場しました。
チーム名は、休学って楽しいよね! (まてぃー「僕はちがいます!」)でした。
(自分休学したことないです)
あおみかんさんしんのすけさんもwrite-upを書いているので、そっちも読むとより雰囲気が分かるんじゃないかなぁと思います。

予選は2日目で参加したため、競技終了後すぐに暫定版の結果が出たのですが、その時はギリギリ学生枠3位で本戦出場予定!でした。
∩(´・ヮ・`)∩やったー
ですが、提出したAMIで思った通りの記録が出ず、確定版の結果では本戦出場ができないとわかりました。
∩(´;ヮ;`)∩うわーん

どんな競技だったのか

#isucon 2013年予選問題の解説など に出題者の方からの解説がありますが、今回のお題はgistのようなWebサービスのパフォーマンス改善でした。
参加するまでは、「どんな言語の実装で来るんだろう」と不安だったのですが、Ruby, Python, Go, Node.js, PHPの実装が用意してあったので助かりました。

RubySinatraPythonはFlask、Node.jsはExpress.js(他の2つは見てないです)がベースで実装されていたのですが、チームのみんなが使えるRuby実装で取り組みました。

ちなみに競技で使ったAMIは、最新のAmazonLinuxで、nginxなど便利そうなパッケージが入ってる感じのやつでした。

何をしたのか

競技時間中はかなり必死だったので、細部まできちんと覚えていないのですが自分が試したことを書いてみます。
  • アプリケーションサーバをpumaに置き換えようとしました
    • が、オプションをうまく調節できずMySQLがToo many connectionsエラーを吐きまくったので諦めました('A`)
  • nginxを設置しました
    • フツーにunix domain socket経由でつなぎました
  • memcachedからRedisに置き換えました
    • memcachedの罠に関しては全く気づけなかったのですが、Redisのほうが早いと思ったので、置き換えました
    • 残り時間がなかったので、普段自分がさくらのVPSで使っている秘伝のredis.conf(特に凄いわけではない)を使いました
  • 使わないサービスを切りました
    • 最終的に提出したバージョンではmemcachedを使っていなかったので、パフォーマンスが上がればいいなぁくらいの思いで、chkconfigでいらなそうなサービスをぽちぽち切りました
自分ができたことはこのくらいでした。
(書き出してみると全然できてない;´Д`)
あおみかんさんしんのすけさんが、Sinatraまわりやデータベースまわりの改善をしてくださいました。

反省はしているが後悔もしている

  • そもそも、ベンチマークスクリプトの結果を競う競技なのに、改善前/改善後の比較などをしていなかったのがダメでした
    • 時間ない!って思ってしまい、てんぱってしまいました
  • 常にmasterブランチはオールグリーンな状態を死守するべきでした
    • 今回の競技の場合はベンチマークスクリプト自体が最強のテストツールになっていたので、それを回して間違いに早く気付けたら...
  • 大規模なアクセスを考えた時のベストプラクティスがわからない
    • MySQLunicornやnginxやRedisの設定を改善するだけで、かなりスコアが上がるらしかったのですが、どれをどのくらい改善すればよいのかを考えながら設定していく余裕がなかったです

    最後に

    ほぼ準備もできず、記念受験な状態だったのですが、いざ競技が始まるとみんな必死にやっていて8時間がとても濃密で楽しかったです。
    本戦に出場できないことは悔しいですが、今回の予選で大規模アクセスがあるWebサービスを構築するためにこれから勉強するべきことが見えて有意義でした。

    運営をしてくださった皆様には感謝しきれません。
    本当にありがとうございました。