ISUCON公式Blog
お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル、それがISUCONです。
http://isucon.net/
はじめまして、今年新卒で入社したエンジニアの富岡です。先週のGWの合間の5/2に行った社内ISUCONの様子をお伝えします。
ISUCON は「Iikanjini (良い感じに) Speed Up Contest」の略で、2~3人のチームで課題として与えられたウェブアプリケーションをできる限り高速化し、そのスコアを競うコンテストです。2011年に第1回が開催されて以降毎年開催されており、年々参加者を増やし盛り上がりを見せています。
僕たち新卒メンバーは4月に通常の業務を行うかたわら、研修として夕方の1~2時間でビジネスマナーから数値目標の建て方、エンジニアとしての基礎知識など多岐にわたる内容を学んできました。その中で今年は技術的な研修がやや少なかったこともあり、研修の締めくくりとして社内ISUCONを行うことになりました。問題は pixiv さんが社内ISUCON用に作った問題 を使わせていただきました。
今年は新卒エンジニアが4人いるので、2人一組のチームに分かれて行うことになりました。うち2人は去年のISUCONを経験していましたが、僕ともう1人は初挑戦でした。
ここからは実際に参加した僕の視点で社内ISUCONの様子を振り返ります。
僕は初挑戦だったので、まずはネット上のISUCON常連の方たちによる解説記事を読んでどんな感じでやっていったらいいかポイントを勉強しました。チームの相方と作戦会議をして、普段インフラをやっている相方がインフラ部分を、僕がアプリケーション部分を主に担当することにしました。言語は普段使い慣れている Ruby でやることにしました。
新卒エンジニアに加えて CTO の川崎も単独チームとして飛び入り参戦しました。
10:30 オープニングとともにスタート!ここから18:30までの8時間で問題に取り組みます。
部屋に入って早速問題に取りかかります。事前の打ち合わせ通り、まずは相方がローカルで開発できる環境を整えたり、デプロイやプロファイリングを簡単にできるスクリプトを用意したりという作業をしました。
僕の方はアプリケーションのコードを読んで、すぐに改善には取りかからず、後で相方がアプリケーションの改善に合流したときのために問題のありそうな箇所の洗い出しを行いました。その上で影響の大きそうな DB の index づけや N+1 query の解消などから取りかかりました。
12:30時点での途中経過がこちら。すでにCTOの川崎 (kawasy) が一歩抜けだしています。もう一方の新卒の チーム (anton) も善戦しています。
僕たちのチーム (michael) はこの時点ではまだ unicorn のチューニングなどを行っていなかったため、初期スコアからほとんど変わらずという状況でした。ですがまだ6時間もあるので巻き返しは十分可能、ということで焦らずタスクに取り組みます。
14:00 くらいになって相方の環境整備や unicorn のチューニングが一段落し、僕の方も DB 周りの簡単な改善はできていましたが、スコアは 18000 くらいとやや伸び悩んでいました。
nginx や MySQL のプロファイリングを見て明らかに画像へのアクセスや posts を取り出しているクエリが大量に発生していて重いことがわかったため、ここの改善に2人で取り組むことにしました。
まずは DB に保存されていた画像を最初にアクセスがあったときにファイルに書き出して、2回目以降のアクセス時にはそちらを見に行かせるようにしました。これでスコアがだいぶ上がるはず、という期待とは裏腹にベンチマークを走らせるとなんと逆に5000ポイントほど下がってしまいました。後から気づきましたが、実は直前にやっていた MySQL の buffer pool の設定によってこれまでフル稼働していた unicorn の使えるメモリが減ってしまい、スコアが下がってしまっていたようでした。
その頃、情勢は川崎が大人げないまでの圧倒的な抜けだしを見せていました。社内の観戦チャットも盛り上がります。
続いて posts を取り出すクエリの方もキャッシュに乗せたいということで、Redis を使いたいとなったのですが、2人とも Redis を使ったことがなく、どうやってやったらいいんだと調べているうちに終了まであと40分くらいとなってしまいました。ここからやるのはもう無理だということであきらめて JSファイルの nginx からの配信や細々としたアプリケーションコードの改善などを行いました。
そして最終結果がこちらです。川崎が CTO の貫禄を見せつけて圧倒的勝利を収めました。新卒の2チームも苦戦しながらも初期スコアの約10倍のスコアに到達してのフィニッシュとなりました。
競技終了後には各チームでやったことや良かった点・悪かった点などを皆で振り返りました。
自分は N+1 query の解消などさほど難しくない改善にも思ったより手間取ってしまい、もっと素早く的確にできたらよかったと思いました。また当日に各種プロファイリングツールや Redis の使い方を調べて使うというのはかなり無謀だったので、普段から広くいろいろな技術・ツールに触れておくことも大切だと実感しました。
また新卒のもう一方のチームは Go で取り組んだとのことでした。2人ともインフラ経験が少なかったこともあり、開発環境の整備等はあまり行わず、最初から nginx の設定やSQL・アプリケーションコードの改善に取りかかったとのことで、序盤は川崎と良い勝負を見せていました。また MySQL のバージョンを上げようとしたら動かなくなり、焦ってかなり時間を消費したとの反省も語っていました。
最後に貫禄の勝利となった川崎の解説には感心することばかりでした。
これまであまり触れたことのなかったインフラ周りの技術に触れたり、アプリケーションのパフォーマンスを強く意識する良い機会になりました。正直言って何もできなかったという気持ちが強く、勉強のモチベーションが上がりました(ちょうど翌日からは GWだったこともあり、GW中は勉強が大いに捗りました)。他の参加メンバーからも楽しかったという感想とともに、悔しい・もっと勉強したくなったという声が多く聞かれました。
今年はまだ本家 ISUCON の開催は未定 (?) ですが、開催されることになればぜひリベンジしたいと思います!
ISUCON7 の開催が決定しました!