読者です 読者をやめる 読者になる 読者になる

100万円が欲しくてisucon2013予選に参加したけど惨敗した話 #isucon

表題の通り。

予選に参加できなかった某bobpp(優しいからリンクはしない)を甲子園(本戦)につれてくと強い約束をしましたが、結果完敗しました。

初参戦のisuconで思ったより何もできないのがショックで思わず当日の夜は焼き肉食いながらくだをまいたりしてたんですが、

そもそもフロントエンドエンジニア(笑)ですしみたいな言い訳とか言うと @hokaccha さんとかから椅子が飛んできそうなので自重しつつ

バックエンドの素人がどう考えて何を行ったのかをログにしておきます。

ちなみに参加した(するはずだった)メンバーとしては

  • damele0n(フロントエンド、バックエンドちょっと分かるくらい)
  • junqi(バックエンドアプリケーションエンジニア)
  • bobpp(バックエンドアプリケーションエンジニア)

という構成。ちげーよってなったらmentionください。

前日

最初から2人で予選を戦うことは分かっていたので、みんな大好き渋谷グリフォンで3人で作戦を練る

  • 使用言語はPerl(まぁPerlが一番慣れてるよね[ぼくは書けませんが]みたいなノリと勢い)
  • アプリを junqi 、インフラを damele0n でいいんじゃない。知らんけど。
  • とりあえずベンチ走らせてアクセスログ見ようか
  • 多分何かしらのKVSは必要になるよね。アプリの状況見ながら Redis か memcached かな。
  • HS(HandlerSocket) どうよ?ビルドめんどくさいよねー、アプリも全部リプレイスできる余裕あるかな。
  • 無難なところからやろう(クソクエリ潰す、インデックス貼る)
  • 構成は nginx をフロントでアプリを Starlet で
  • 任意のタイミングで再起動して耐えられるって、いきなり再起動かかったりするのかな…?
  • 某社内のキャッシュ機構をパクリ影響を受けたらいいんじゃないか
  • Template Toolkit使ってりゅううとか無いよね(もちろん無かった)
  • 時間に余裕できたら NYTProf でプロファイリング

インフラエンジニアなんてやったこともない私はその日28時くらいまでChefレシピをまねごとしながら作ったり、nginx の基本的な使い方を勉強したり、MySQLのチューニングなどをせっせと勉強したりしていました。

当日

当日はjunqiの家で戦いに挑んだのですが、開始前にいきなりWifiがつながらない問題が発生。僕は最後までLTEのテザリングで参戦することに。

以下、時系列

10時

AMIからインスタンス作るところはスムーズに進んだけど、あれ ssh 繋がらなくねとか言ってたら Security Groups の設定ミスっててポート空いてねーfxxkーーーとか言ってたら30分くらいになってた。

とりあえずアプリを見てgit化。nopasteかーとか言いながら Slowlog 吐くようにして一旦計測回してみる。

11時

アクセスログも見つつ、 /recent/N で飛ぶクエリが重いのは察したのでインデックス貼って様子見。

同時にキャッシュ機構入れ始める。ちなみに最後まで MySQL の memcached plugin だってこと気づいてませんでしたq^

この辺りでスコア3600台。7位くらいには入ってた気がして浮かれてました。

MySQLを適当にチューニングぶっ壊し始める。

12時

軽くつまめるとの理由で寿司の出前を検討し始める。

アプリ側は Markdown を外部プロセスに回してるところを Text::Markdown でリプレイス

バックエンドは静的ファイルを nginx で返してるからそれ直すかーという感じに。

50分くらいに初めて本番計測をしたら、3100ぐらいに落ち込んで???ってなってた。

13時

寿司の出前を頼む。おもわず笑顔がこぼれるが裏で12時台の本番計測が落ちた理由を悩む

そのあと、適当に寿司食いながら作業

14時

12時台に決めた改修が完了

でも全くスコアがでない。testでも出なくなった。3100とか。

つーかこれって毎回DBリセットされるからインデックス元に戻るんじゃない?->戻ってた

でinitのスクリプトでインデックスを貼るようにした。

しかし、ここでもスコアが伸びす。3600台を出れない。

15時

2人で改修方針に悩む。もう Redis 化する余裕もなさそうなので、junqiの発想に任せて改修を行う。(他力本願)

とりあえず Starlet 化してみる。一切スコア変わらなくて手首を切りたくなる。

16時

プロセス数とか色々ゴニョゴニョしては計測。さほど効果のある改修はなし。

俺たちの junqi の改修が完了!さぁいこう本戦へ!いざ100万円!!->initの60sec制限でコケる

17時

沈黙。淡々とisuconのメンバーページをリロードして、ガンガンスコアに差が付いていくのを見ていた。

50分頃、気を利かせた junqi が蛍の光を流し始める。

俺たち頑張ったよな!な!みたいな謎なテンションになる。甲子園の地区予選で落ちる高校球児はこんな気持ちなんだろうか。

18時

敗因

色々敗因はあれど、経験と知識不足へ全て収束すると思う。

あえて挙げるとすれば

  • 必要なログをカジュアルに見れるようにしなかった。しかも後半ログ見なくなってた
  • アプリの性質をちゃんと理解して、どういうチューニングにするべきかをきちんと最初に話さなかった
  • (主にインフラで)行った改修と計測をきちんと対にして、行動と結果を明示的にすべきだった(なにやったか忘れたりしたので)
  • やっぱ3人は必要だと思った(スーパーハッカーなら2人でいいかもしらんけど)
  • 寿司をつまむ時間さえ惜しむべきだった

おわりに

すごい苦しかったし悔しいけど、nginxとかchefとかsupervisordとか色々学べたのは大きかった。また一人で色々できるようになった気がする。

でも本当に悔しいので来年こそ本戦に行きたい。病気の祖父のために100万円が必要なんです。

開催に尽力された KAYAC, LINE のみなさん本当にありがとうございました。いい勉強になりました。