あざらし備忘録。

音ゲー好きなウェッブエンジニアがいろいろ思った事やった事を書いていくブログです

魔王軍としてisucon3予選学生領を制圧してきた

理解に苦しむ表題かと思いますが、isucon3のオンライン予選に内定先の同期(@, @, 僕@)3人で参戦してきました!

興奮冷めやらぬって感じなので今のうちにブログを書きたいと思います(できれば昨日書きたかったけど死んでた)

はじめに

そもそものきっかけは2ヶ月前(あ、もうそんな前なのか)に行われた学生限定のisucon夏期講習なるイベントに参加したことでした。

webアプリは書いたことはあれどサーバーの設定とかチューニングとか全くの無知の状態だったので、興味本位で参加した感じでした。

結果はこれまで感じたことの無いくらいの???加減に呆然としたままに終わりました。そもそもどこが遅くなりそう、とかどうしたら早くなりそう、とかそういった目や手札が無い状態でただただ夏期講習の時間はすぎて気づけば終わってました。すごく悔しかったのと同時に結構落ち込んで正直チューニングとかわからんこわ〜い(´・ω・`)みたいに参加前よりもなっていましたw

予選参加登録

そんな状態ながら、夏期講習に参加した同期と一緒にisucon3のオンライン予選に参加することになりました! チーム名は魔王。チーム名は魔王。(大切なことなので2k(ry)

1週間前

メンバー3人で一応当日の段取りとかをゆる〜くskype等々を使って話してました。isucon夏期講習の教材が手元にみんな残っていたのでそれぞれ復習してました(実はこの時も正直チューニングわからんこわ〜い病に結構かかってて苦しんでました)。この時に、

  • アプリケーション:僕

  • インフラ:@a_macbee, @cosadn

といった感じにざっくり割り振りをして当日までにChefで環境を整備できるように本番のAMI公開後すぐ作業に取り掛かれるようにしようということになりました。このあたりを前もって調整できたのはすごく良かったなと思ってます。現に予選始まってからは時間が全然なかった。

本番のたちまわりとしては

  • コード読んでどんなアプリケーションかを共有する
  • 構造チェックする
  • どんなクエリが飛んでるか確認する
  • クエリチューニング
  • Ruby的にもっとよくかけそうなところがあれば書いちゃう
  • 他の人が詰まったりしたら助っ人として調べたり云々をなるべく柔軟に対応する
  • gitをフル活用してとちってもすぐ動くように戻せるようにする

あたりを注意してやっていこうと思ってました。

前日

日中みんなで集まって前日打ち合わせをやろうという予定でした。 だがしかし前々日の飲み会やらなんやらの影響でなんと起床時刻19:30。oh... 「オール?オール?オールなら今からダッシュで行くんで!!」って土下座しながら準備して片道2時間の会場へ。wだいぶ頭おかしい。w

前日集まってやったことは、実際にAWSでインスタンス立ち上げて本番っぽくみんなでAWS上でisucon夏期講習の教材を解いていこう!というもの。だいぶやってよかった。本番の立ち回りを実際にイメージ出来て、楽しくなってきた。ここで実践っぽくみんなでわいわいやれたことでチューニングこわいこわい病は治りできないなりにも今できることをやっていこう!と前向きにいけました。チューニング楽しい!✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

当日

そしてまぁメンバーそろってほぼ徹夜の状態で参戦。こういうの状態きらいじゃないのでテンション高めでmonsterを注入←

前日の演習の甲斐あってか立ち回りは相当イメージどおり行けて結果に大幅に寄与とか云々は置いておいてスムーズに進んだ感。

ちなみにRuby好きなのでRubyでやりました。 実際にやったこととしては、

  • ルーティング別にどんなことやってる所かとどんな感じのクエリ飛んでるかを共有

    ** mysql2-cs-bind...??ってググったら夏期講習でお世話になった@tagomorisさんのgemだとわかりにやける

  • 重そうな所を書き出す + 実際にslow query log見ながら重い所をなるべく軽くできるように施策を打ちまくる

    ** memcachedがもともと使われてたのでもっと使ってみようとする =>1発目の施策うったときに手応えがなかったので潔く切る

    ** 無理やりjoinっぽいことしている箇所があったので素直にjoin => カイゼン成功

    ** Redisアプリケーション側実装

    *** countで毎回毎回とってきているところをredisにのっける

    *** 最新100件の情報をとってくる、みたいなところをredisにのっける => 時間なくなってしまって実装できなかった

    ** 使ってないカラムあるよね〜みたいな話をする => そのまま忘れ去った(´・ω・`)気づいてたのに...w

  • テーブルの構造を@a_macbeeが洗い出してくれていたのでそこと相談

  • 他の人が詰まった時の調査部隊

  • ページネーションみたいなの実装してるところ結構気持ち悪いと思ったので実装考える => 時間たりず

  • unicornのプロセス数調整

まぁこんな感じでしょうか。施策については経験とかも無いのでとりあえず打ってみていい感じの結果が出たら採用でなかったらgitなので戻す、みたいな方式でやってました。が、理由を持ってあたりをつけて効率的にカイゼンできるようになりたい。

細かい施策系は割りと序盤の方にジャブっぽくぽこぽこ当ててた感じでした。中〜終盤にRedis実装しようってなってなれないRedisに時間を食ってしまって結局思ったとおりに実装できなかった。悔しい。+でやろうと思ってた実装も焦って忘れてしまったので悔しい。

@cosadnが担当してたVarnish作戦が見事成功してスコアが9000近くも増えてみんなでうぇーいwwwってなってましたw

さすがです!!!

その時の様子がこちら↓

https://twitter.com/a_macbee/status/386765619544084480

https://twitter.com/46goma_goma/status/386765935144493056

https://twitter.com/cosadn/status/386766186970509312

この時だけチーム揃ってテンション高めのツイートとか、なんという低度な情報戦...www

この後はスコアを上げる方よりも運営の方が実行しても安定してスコアを出せるように調整していました。 案の定結構苦戦してたので良い判断が皆で出来たと思います!

これ来たんじゃね?これ来たんじゃね?どうか学生3位以内でお願いします...って言いながら結果発表。

http://isucon.net/archives/32848462.html

・オンライン予選 学生枠 TOP3チーム

 1位 : 魔王

 2位 : ( (0) / (0)) ☆祝☆

 3位 : 休学って楽しいよね! (まてぃー「僕はちがいます!」)

魔王軍 \\٩( 'ω' )و ///学生領制圧

なんと学生枠1位でisucon3予選を終えることができました!!!最終スコア:12636.5

自分たちとしても実感が無いのですが、決勝進出できてとてもワクワクしています!

でも、今回の予選ではただただ凄腕の同期に支えられた感があってすげーなーと思うと同時にやっぱり悔しいです。僕も今回でチューニングの楽しさを身を持ってしれたのでもっとやっていきます!

決勝は複数台サーバーによるネットワーク構築とかが出てくるはずなので、よりアプリケーション的なカイゼンは減っていくかと思われます。 なのでこれから本番にむけて今圧倒的に足りていないサーバー力を鍛えてチームに貢献していきたいです。がんばろう!

めちゃくちゃ楽しい場を作ってくださったLINE株式会社様、面白法人カヤック様、株式会社データホテル様、運営の皆様、本当にありがとうございました!ためになりすぎて生きるのがツライです!

また、何よりも今回いい成績を出せたのはisucon夏期講習あってこそです。本当に夏期講習出てよかったです。お世話になった@tagomorisさん(Hiveロゴの可愛さについても語り合えて感謝の限りですw)、@kazeburoさん、@941さん、ありがとうございました!