cnosuke's blog (′ʘ⌄ʘ‵)

へっぽこエンジニア

#isucon参加記録 またはへっぽこ学生エンジニアは如何にしてRedisを愛するようになったか。そしてエモい話。

先週末の日曜日、#isucon のオンライン予選に参加しました。
「休学って楽しいよね! (まてぃー「僕はちがいます!」)」というチーム名で、大学の知人である、あおみかんさん(@AknEp)とまてぃくん(@rkmathi)とで参加しました。
余談ですが、僕は今は復学しています!
(けど週の大半は毎日の料理を楽しくするお仕事をしています)

結果は

という感じで、大変嬉しいことに学生枠でギリギリ3位に入ることが出来ました!
いえーい ✌(◔ڼ◔)✌

早速追記: やっぱりバグのせいでスコアが満たず駄目だったようですヾ(。>﹏<。)ノ゙

時系列っぽく振り返ってみる

  • あおみかんさんがAMIからインスタンスを建ててくれる。
  • 最初インスタンスガチャしたほうがいいのかなぁという話もしたけど、最終的にAMI提出して運営側でチェックされることになるから意味ないかということで素直にそのまま使う。
  • 先ずは一通りコードを読む。
    • ActiveRecordとか使ってないことに気づく。そういえばARでmodel作るの激重だったなぁ。まぁ使ってないのかーとか考える。
  • とりあえずSQLにIndexを貼りまくる作業をする。
  • 平行してまてぃくんが unicorn + nginx に変更する作業をする
  • gzipの罠をしっかりと踏む。
  • トップページ開く度にわざわざカウントしてるの大変そう。 => memcached(もどき)に乗っけてカウントを管理しよう!ということで実装する。
    • これ、かなり早い段階でやったんですが、それが後で災い結果を生むことに・・・。
  • puma + Rubinius にしてみる
    • 爆速との噂を聞いて。
    • 結果、MySQLのconnectionが足りなくなったりして大変なことに。(増やそうにもそれがどの程度意味があるのかよくわからなくなった)
    • 結果、断念してunicornに戻す
  • あおみかんさんがユーザのログイン周りとかセッションまわりを鬼改造する
  • markdownのレンダリングredcarpet に変える
  • 起動時に既にあるmarkdownデータを全てレンダリングしてmemcachedに突っこむことにする。
  • 新規作成データも全て突っ込むことにして、読み込み時のmarkdownレンダリングを全て無くす
  • Dallimarshal data too shortって怒られる。
    • 結局memcachedがニセモンであることには最後まで気づかなかった...
  • 怒られたら逃げるが勝ちの精神でRedisを使うことにする。*1
  • Redis最高!!Dalliに怒られない!
  • markdownのレンダリングもRedisに乗っけてると速い!Redisいい人!*2
  • 記事のカウントを非SQLにした部分で紛込ませてしまったバグが今になって火を噴く。 ごめんなさい・・・。
  • 必死で対応するも時既にお寿司*3

という感じでした。

反省点+もっとこうした方が良かったかなぁと思うこと

  • ちゃんと最初から最後までベンチマークテストがちゃんと走ってそこそこのスコアを出すことを確認し続ける。
    • いろんな理由でまともにベンチ出来たのがそもそも少なかったと思います。
  • プルリク開発的なのやったほうがよかったかも。
    • バグを未然に防ぐ + 変更点をみんなで共有するのは大事そう。
    • CI的にベンチ走らせれば前項との関係も良い感じ。
    • めんどくさがらずにcapistranoとかも使えるようにしたほうが良かったと思う。
  • 初期のサーバの状態をもっとちゃんと確認する。
    • memcachedの罠
    • topとかもまともに使わなかった。
  • 定石的なチューニングをちゃんとする。
    • my.cnf とか手が回らなかった。
    • Redis も使うならちゃんとチューニングしないとあんま意味無いらしいですね・・・
    • unicorn のworker数ももっと調整するべきだった。
    • そういえば結局varnishも使わなかった。

なんか思ってたり考えてたりしたことを整理出来てなかったせいもあって、ちゃんと出来なかったってのが多い気がしますね。
あと、知ってても実際ちゃんと使ったことが無かったせいで、あんまり意味が無かったり使おうと思ってもすぐに使えない、というパターンも多かったと思います。

まとめ的なsomething

すごく楽しかった。

普段の仕事もまぁ高速化を考えてはいますが、いざインフラまわりも含めて自分でやるとなると、結構知識であったり経験が不足している部分が多いなぁと改めて知らされた。
なんとなく知っているけれども、実際に触ったことが無かったりちゃんとチューニングしたことないもの多いなぁと反省。 一方で、少なくとも知っているという状態(あたまに少しはインデックスがあるような状態)のおかげで、少しは何をしたらいいかがわかったのはよかった。

今後

いろんな高速化のテクニックをもっと学ぶ。
DBまわり勉強しなおしたい・・・
Redisかわいい

あとがき+エモい話

もっと学生の参加者が増えて欲しいなぁと思いました。
実際、僕ら自身もどこまで出来るか全くわからない感じで、「記念受験だね」と良いながら参加しましたが、結果的には記念以上にもっと価値があるものが得られたと思います。
僕らのチームメンバーはまてぃ君以外は休学期間を挟んでたり、今も復学してるけど仕事メインでやってるような感じで、果たして学生なのか?というと微妙な感じではありますが、まだまだ経験不足なヒヨッコという点ではちゃんと学生"枠"だと思います。
今回の#isuconに参加したことで、自分の知識を少し整理出来たり、足りない知識だったりに気づけて凄くよかったですし、他のWeb系に興味がある学生諸氏にも是非勧めたいと思いました。

あと、全て終わったあとのtwitter上に見る一体感とかね、あれヤバイですね。

実は学生諸氏にとって1番価値があるのは、結果うんぬんじゃなくて、終わったあとに感じる、他の参加者との一体感かもしれない。

僕らは、まだヒヨッコですからみなさんは僕らの名前も知らないだろうし、僕らも超有名人のみなさんを羨望の眼差しで見つめる可愛い少年です。

そんな僕らが、他の参加者のみなさんのブログを読んだりtwitterを見てたりして、ある種のカタルシスのような気持ちと共に感じた一体感は、僕ら自身もWeb系の業界の一員にしっかりと参加しているような、そんな感覚でもあったのかもしれません。

もしかすると本戦に参加出来ないかもしれませんが*4、私個人としては予選参加だけでもかなり大きな価値を得ることが出来たと思います。

運営者のみなさま、他の参加者のみなさま、ありがとうございました&&お疲れ様でした。

PS. 五万円欲しい

*1:実はRedisは最初から使うことを考えていた。実際に使うことにしたのはかなり終盤。

*2:というかRedisじゃなくても先にレンダリングしてるから速いだけ

*3:誰かお寿司食べにいきましょう

*4:バグが残っていてAMIが不安定なので失格になるかも・・・