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

@Konboi memo

主に技術に関してつらつらと。

ISUCON本選に出場してきました 【アプリ編】

はじめに

先日行われた、 ISUCON3 本選 に会社の先輩の@hilotterと同期の@tkuchikiと チーム カヤック選抜「流れ弾」として参加してきました。

f:id:Konboi:20131110190114p:plain

ISUCON3 予選では 惨敗していたので 本選ではなんとか選抜チームとして汚名返上しようと挑みました。

結果としては、中盤に暫定1位になり、特別賞を争い スコアが上がってからの中盤以降は5位以内に食い込めていたので、選抜チームとしての役目は果たせたかなと思いつつ、最終ベンチでFailになりなんとも悔しい終わり方でした。

とりあえず、当日のログがあまり残ってないので忘れないうちに振り返りたいと思います。 自分は、主にアプリを担当したのでアプリの方を中心に書きたいと思います。

あわせて読みたい

インフラ編は担当した @tkuchikiのブログ ISUCON3 本選に出場してきました 【インフラ編】 をご覧下さい。

画像まわり以外のチューンナップを担当の@hilotterさんのブログISUCON3 本選に出場してきました 【祈り編】も合わせて御覧下さい。

当日までの準備

使用言語は自分と@hilotterが通常の業務で使い慣れているRubyを使うことに決めていました。

役割分担としては、予選の反省を踏まえ

自分と@hilototter がアプリ担当 @tkuchikiがインフラ担当

という役割分担を決めておきました。

また、@tkuchikiが予選でapacheの設定ファイルに戸惑っていたのでその辺の インフラ関係の設定ファイルやgithubのプライベートリポジトリなどを準備してくれました。

自分と@hilotterは普段使い慣れてないけど使うかもなというミドルウェアだったりgem だったりを触れておき当日困らないようにしておきました。

自分はRedisのドキュメントを呼んでいろいろやってたんですが、当日使うことはなかったです。

当日

9時45分にヒカリエ11階に集合してみんなで会場に向かいました。

始まる前に@hilotterはレッドブル+ポカリ @tkuchikiはモンスター+ポカリの特性ポーションを 作り準備万端のようでした。

f:id:Konboi:20131110185937j:plain

かくいう自分はLINEだーってはしゃいでましたw

f:id:Konboi:20131110185958j:plain

isuconのお題は twitterの画像版。

ざっくりと説明するとユーザーは画像が投稿でき、 投稿画像にはprivate, follow, publicの公開範囲が3段階ありs.m.lのサイズ違いの画像を表示させる必要がある。 ユーザーのプロフィール画像は変更できて、アイコンにはs.m.l がある。

与えられたサーバーは5台 ただし、1台しかアプリが入っていないので、残り4台は自分たちで構築する必要あり。

そんな感じのアプリケーションでした。 詳しくは公式ブログで記事になるかもしれないのでそちらを期待。

11時~

  • サーバー情報が配られスタート
  • @tkuchikiが各サーバーで鍵認証ログインできるように準備
  • その間に自分と@holitterでどこが重くなりそうかなとアプリケーションをいじってました。
  • 鍵の設置が終わったので ssh/config の編集して サーバー全台にログインできるように確認
  • @tkuchikiに必要なソースコードをgithubにpushしてもらってある間にアプリケーションのコードをざっくりと呼んでました。
  • 今回は予選の反省を踏まえて、必要な物以外はpushしなかったのでpullもすぐに終わりました。

12時〜

  • もろもろの設定が終わったのが12時頃
  • slow query, access log まわりを整理して、初べンチ
  • スクショとかメモをとってなかったので大体のスコアしか覚えてないのが悔やまれるが約1240前後だったはず。
  • ベンチみて、画像周りを自分がそれ以外のところを@holitterを担当する形で実装し始めました。
  • レギュレーションからいかに画像を早く返して、加点で稼げるかだなとなんとなく思ってました。
  • 12:30頃にimageはparameterがあるごとに都度生成してたのでそこの改善を始めました。
  • 方針としては、アクセスしてそのパラメータの画像がなければそのサイズの画像生成し、保存 次回以降は生成済みの画像を返す という方針で進めました。

13時~

  • 自分が実装してる間に@hilotter が 必要なところにindex張ったり細かいところのチューンナップをし @tkuchikiが nfs 導入方法を調べてるっぽかったです。
  • 腹が減り過ぎで頭がまわらなく弁当を待ちわびてたきがします。

14時〜

  • この頃に、image 部分の実装がおわる。
  • iconも同様の実装を施さなければということでicon部分も同様の実装をしていた。
  • できた!! と思ったらiconを何故かisuconとtypoってたりとチョンボがもったいなかった...
  • 今思い返すと、ここがすんなりいってたらもしかしたら特別賞は自分たちにきてたかも… (´・ω・`)
  • 14時30分ごろにimageとiconの都度生成をやめた実装ができあがりベンチを走らせる
  • ここで 約6800のスコアを計測 暫定1位に
  • 初期スコアから約5倍のスコアアップ
  • topみててもCPUが60%ぐらいとまだいけるかもなーと思ってた。

15時〜

  • てことで、15時ごろに workload 2 で ベンチを走らせた
  • その時の結果が 約12000点 !!
  • ここからは @tkuchiki が nfs の準備をおわるまで他のスコアアップできるところがないか見始める
  • イコン画像、投稿画像を投稿時に生成したほうがいいかもなーと投稿部分で画像を変換する実装をし始める
  • とりあえずはアイコン部分だけと実装し、始める

16時〜

  • サイズLの画像はブラウザで見る限り参照してるとこないなと思い Lは事前に生成せずにしてみた
  • 変なところでハマってしまい、実装できたのは30分過ぎ。
  • しかし、ベンチを走らせてみるとスコアがダウンし masterには反映せず。
  • 今考えると、並列数も少なくアイコン画像は特典が低いのでそのせいかなと...
  • @achidlemonさんの解説を読む限りそんな気がする
  • このころにnfsの準備が終わるも、FileUtils.move が動かずはまる
  • FilteUtils.cp に変えるも動かず…
  • コマンドでは動くということなので 仕方なく system 関数で copy させることに
  • そしたら問題なくcopyできた。

17時〜

  • もろもろ設定してとりあえず、2台でベンチをかけて動くことを確認
  • 5台にふやしていくぞ!! ってときにチームLINE選抜に 40000万点超えで抜かされ特別賞ももってかれてしまった...
  • 追ってベンチをかけ、 30000万点超えで2位に。 く〜くやしい。 1分30秒差...
  • スコアがハネたのも束の間、nfsのサーバーが最初に立ち上がる確証がないのでマウントできないのでは? とやばいということに… 
* ギリギリでnfsがマウントできるように設定したが、ALL再起動で確認できず…
  • 最後workload確認のためのベンチまわして 約35000点 を計測し終了
  • そのときは workload 8, サーバー5台 でした。
  • 最終てきな構成はこんな感じでした。

結果

結果は冒頭で述べたようにfail 0点 なにがいけなかったのか nfsかな…

Successしてせめて2位にはいりたかった… orz

懇親会

とりあえず、悔しい思いもあるもののやりきった達成感を味わいながら データホテルさんがスポンサーの懇親会を思い切り楽しみました!

もっと他の参加者と話せばよかったなというのが若干、心残りです。

最後に

isucon運営のみなさま、普段のお仕事もありながら、準備お疲れ様でした。 おかげ様で、非常に楽しく濃密な時間を過ごす事ができました。

ありがとうございました!

@holitter, @kuchiki 一緒にisucon参加してくれてありがとうございました! & お疲れ様でした。

f:id:Konboi:20131110190338p:plain