isuconに初参加してきました

土曜日に職場の@handlenameと@nobu_ohtaと組んで参戦してきました。
結果は惨敗。でもすごく楽しかった。

始まる前

他の2人は仕事でPerlを使っているので、自然とPerlを選択することに。
僕はPerl全然わからないので、始まる前はどうやって空気にならないようにしようか、ってことばかり考えてました。

いざ開始

いざ始まってみると、本当に乱暴にソースコードだけ投げられるんですね。
特に説明も無しで始まる異様な空気を感じて、「これがisuconかぁ」とバリバリ初心者の心境でした。

各々が動き出す

まずは、みんなでReadmeをチラ見しつつ、アプリケーションを立ち上げざっとページを確認。
その後、handlename先輩はEC2のサーバに入ってgitリポジトリ作ってくれたり、nginx入れてくれたりとか色々してくれていた。
nobu_ohta先輩はアプリ担当ということで、ソースを眺めながらindexはってたりした。
当の僕は、さっそく空気になりそうだったのでとりあえずローカル環境に構築するためにシェルスクリプトとかを作っていました。

それだけでもう12時前になっていたので、事前に聞いていたとおり8時間なんてあっという間だと痛感しました。


キャッシュ戦略を練る

お昼ぐらいになって、キャッシュ戦略を相談して、でも実装はできないから全部任せるという暴挙に。

でも実装してみると(実装したのはnobu_ohta)、まぁ@fujiwaraさんの罠にハマるハマる。

  • マイページは丸々キャッシュしちゃっていいねー
    • CSRFトークンがあるから無理だった
  • 詳細ページもページャーの部分含めてキャッシュしちゃえばいいじゃん
    • ログインしているユーザー名とかもキャッシュしちゃってた

結局markdownにしている箇所を投稿時だけにするようにキャッシュをするだけになってしまい、キャッシュ戦略の甘さが無駄に時間を浪費させてしまいました。

そろそろ仕事をする

とはいえ、そろそろ仕事をしなければと思い、毎回COUNTされていた総投稿数をRedisでキャッシュするようにかえた。

あと、newerとolderの処理のクエリをちょっといじったぐらい。

一番の仕事は、"/"が指定されていたlinkタグを発見したこと。
handlenameが、「なぜかリクエストが2回飛んでいる」ってところではまっていたのだけれども、罠を発見できて一安心。
@fujiwaraさん怖いなーとgkbrしてました。

そんなこんなで

あっという間に8時間は過ぎてしまいタイムアップ。
結局いわゆる普通のチューニングしかできずに、スコアも5000いったりいかなかったりで惨敗でした。(30000というスコアが夢に思えました。)

反省点としては

  • Readmeをしっかりと読まずにworkloadオプションを見落としたこと
  • アプリケーションの仕様をしっかりと把握しないままキャッシュ戦略を練ってしまったこと

この2つが大きいなーと。
インフラ周りの知識が強くないからこそ、そこにもうちょっと時間をかけて検証できるようにアプリケーション側のチューニングでいかに無駄な時間を無くすかが重要だなと思いました。(終わってみて、もっといろいろ実験できたなーと反省)

でも、初めてのisuconすごく楽しかったです。運営の皆さんありがとうございました!
本戦出場の皆さん頑張ってください!