#isucon3予選で惨敗してきた

前回と同じメンバー(@froncool,@iszk) でリベンジ!のはずが、リベンジならず。

なにか神がかった奇跡が起きて、自分たちより全員失格で決勝進出をはたすわけもなく、今年のisuconが終わったので、次回に向けてブログに残します。

前日

  • 土曜日に出場するので、前日は金曜日。お互い飲んでもいいけど翌日残らない程度でね!と。集合は9:30だよ!と約束をする。
  • bitbucketでグループと非公開のリポジトリ作ったりして準備
  • AWSを使ったことがあるのが私がAWS係に任命されたので、久しぶりで忘れていないか確認しようとして事件が。 個人で使っていたAWSがクレジットカードの更新を忘れて止まっていました!支払いはするも、アカウントは回復せず。。。サポイートにメールして翌日には使えていることを祈り眠りにつきます。

当日

6:30

  • ドキドキとワクワクで起きてしまう。遠足か!
  • 家の猫に「なんでこの時間に起きてるの?」と不思議そうな目で見られる。

9:30

  • 集合場所に到着。しかし誰もいない!
  • とりあえずAWSのアカウントが回復しているか確認してみるも、どうやら回復していない。しかたがないので新たに別のクレジットカードでアカウントを作成。9:50ぐらいになんとかインスタンスをたてられるとこまでいって、一安心。

10:00

  • 他のメンバー1名到着。もう1名がもうちょいでくるという状態。
  • AWSのインスタンスをたてようとおもうが、指定された、AMIが見つからない。regionをTokyoにしないといけないことに気がつくまで数分焦る。

10:30

  • なんとかAWSたてて、ログインも確認でき、メンバーも全員そろったーということで、コードをみながら作戦会議
  • Perlにしぼる。なぜかはこの日記の最後に書いてます。@froncoolにはインフラ側をお願いする

11:00

  • とりあえず私がPlack::Middleware::Profiler::NYTProfを仕込む。
  • プロファイラーを仕込みながら、過去の経験からmarkdownを変換するのはどうやっても大変なのでどうキャッシュするか検討しだす。@iszkが「redisにhashとって結果ぶちこんじゃえばいいじゃん」とナイス悪知恵をだしたので、その実装をお願いする。

12:00

  • NYTProfの結果をみるも「うーん、DBが遅いのはわかるけどいまいちどこが悪いのかわからない」状態に陥り、使い慣れていないものは使うべきじゃないといまさら悟る。

13:00

  • @froncoolがとりあえずnginxを前にたててくれて静的ファイルをnginxから返すようにしたらちょっとスコアがあがる。
  • @iszkのmarkdownまわりの実装がおわって、試したら「これだいぶヒットするじゃん」ということがわかり一気にスコアがあがる。まだプロファイラがはいっていたので、とったらもっとあがるじゃん!と一気にテンションがあがる。

14:00

  • プロファイラをとったら一気にスコアが下がる。予想としてはそのぶんwebが楽になってさばけるようになったぶん、後ろがつまったんじゃないかという予想。
  • またスコアがばらつきが多いのでちょっとそのあたりを追ったところ利用したredisのライブラリに問題があってエラーが多発していた模様。とりあえず違うライブラリに差し替えたら安定するようになる。
  • @froncoolが一個ずつ丁寧にsqlのindexの見直しをしてくれて地味にちょっとずつスコアがあがる。

15:00

  • sqlを早くするために正規化を崩したりする。
  • ところがbenchmarkとると初期化されてなかったことにされてしまう。indexにしても同様。本当はsudo isucon3 benchmark --initでファイルを渡さなければならなかったことに気がつくまでと、どうやって渡すかで四苦八苦して無駄に時間をとられる。

16:00

  • memo/:id で前のページと次のページを出すクエリがアホなことをやっっていたのをみつけてとりあえずsql2回流す方法で直す。
  • もうmemo/:idごとキャッシュしようとするがエラーがでまくったのでrevertする

17:00

  • 一旦、AMI再起動して大丈夫か確認しようということでそれを行う。案の定nginxが立ち上がらなかったりしていたので、見つかってよかったねと安堵する。
  • その後、titleのために本文をsplitしてるところ別カラムにしようとか見つかりはするも、時間的にギリギリだったためそのままフィニッシュ。

まとめ

 前回は「あわわ、あわわ」している間におわったけど、今回は一応冷静にプロファイルとったりできたのは成長したかなと思いましたが、地力が足りないですね。仕込んでいたとされる罠もあんまみつけられませんでした。

アプローチ的には間違っていなかったのでちゃんとプロファイラーを使いこなせていればという悔いは残ります。

あとインスタンスはケチって1台だけたてるなんてせず、人数分、3台たてればよかった><結構誰かのベンチ待ちでまってたり、修正がかぶってとかいろいろあったので。

 

次回もあったら絶対参加したいので反省は次に活かします!

 

 

あ、freakoutに転職してました。