さて、秋といえば、読書の秋、食欲の秋、ほしのあき、と色々ありますが、やはり IT エンジニアたるものISUCON の秋ですよね。 ということで、Backlog 開発チームのリーダ山本とわたくし染田、そして福岡の盟友 Fusic の 平田さん と混成チーム Fulab にて ISUCON の本戦に参加すべく、先週末の土曜日 11月9日 に大都会渋谷ヒカリエにある、LINE 本社にお邪魔して参りました。
結果は既報の通り LINE 選抜チームが二位に四倍近い差をつけてのぶっちぎりの優勝でした。私たちは 三位となりました。
尚、前日の事前打ち合わせにて念押しして確認した事は「金曜だからって飲み過ぎない事」「(福岡、京都からの朝移動なので) 寝過ごさずにちゃんと会場につく事」という、技術以前の 心配をしていた我らが Fulab ですが、当日は問題なく予定の 10:00 前には会場に入りました。他のチームもほぼ時間通りメンバーが揃っており、 技術系イベントにも関わらず異例の勤怠(?!)の良さに会場もどことなくソワソワ。
さすが LINE 本社だけあって、普段色々お世話になっているステッカーがそこここに。 会場のカフェスペースにも LINE のキャラクターがそこここにあってテンションもあがります。
そして、オープニングのムービーが。最初は笑いがあったものの、今回のお題は画像投稿系のサービスということで、 そのハードルの高さに気付いた参加者から会場にざわめきが。そしてスタッフより、各チームがログイン出来るサーバ情報が入った封筒が手渡され本戦がスタート。
作業の流れ
予選と同様、まずは各自がアプリの構成などを 1 時間弱ほどかけて確認。最初にたてた方針は以下の通りでした。
- 予選同様フロントは varnish に入れ替えてキャッシュなるべくきかせよう
- アプリの外部プロセスでの変換処理がツラいので Imlib2 (or Imager) に置き換えよう
- MySQL の timeline 周りの臭そうな所をひとまずつぶそう
- いきなり複数台展開するとボトルネック分かりづらくなるから、まずは一台でチューニングして各サーバへの展開は後からにしよう
三名で手分けして上の三つに手をつけていくも、varnish に置き換えただけなのに fail し出したので、 varnish 職人の平田さんに調査をお願いして 一旦 apache に差し戻して、その他の対応の効果を測る形で作業を黙々と進めました。
DBアクセス周辺については、timeline の dependent subquery をなくすために、あるユーザがフォローしてるユーザのリストを memcached に載せるようにして IN 句に置き換え。また MySQL の設定そのものもいつも使っているテンプレに切り替えて performance schema を off にしたり、slow query 出すようにしたり、クエリキャッシュとかバッファプールとかよくあるものを よくある感じに設定したり、と。 予選は DB 周りに色々仕掛けありましたが、本戦は対照的にデータ量もそんなないしスロークエリもないし、これ以上突っ込んでもリターンは少なそう、ということで早々に切り上げ。
画像変換周りは、予選で markdown の変換処理で痛い目にあったこともあり、これをインプロセスで処理させようとして奮闘するも、 変換処理の差分が出てしまう状況がなかなか解決出来ず。 ではキャッシュしたらどれくらいスコア的に効果でるのか確認してみよう、ということで crop と convert した画像をある程度 memcached にのせるよう warmup した後に走らせたところ、それまで硬直していたスコアが大体 4,000 くらいまでにのびたので「これだ!」となりました。 そこで初期画像については、まずあらかじめ変換処理しておいた画像を memcached の起動後にロードするような形にするよう戦略変更。
その後 varnish も icon はキャッシュが効くことがわかりその辺りの設定を追加したところ、スコアが 12,000 くらいになり暫定で三位くらいに ランクイン。ようやくこの辺りから複数台でベンチ走らせてみようというするも、fail をとることが出来ず。lsyncd や NFS などなどのアイディアを出したりしていたのもこの辺り。
残り 30 分くらいを切ったところで既に LINE チームがぶっちぎっており、 自分たちは 7,8 位くらいにつけていました。 おそらくトップは厳しそうだと思いましたが、チューニングしたい気持ちをぐっと抑え、 最終測定で結果が出ることを優先して、サーバ起動時に各種のウォームアップがちゃんと 走るとか、iptables でアクセス弾かれないように、等々を丁寧に確認してタイムアップ。
まとめ
最終的なサーバ構成は以下の図の通り、リバースプロキシの varnish 一台、アプリ一台、memcahed 一台、DB サーバ一台の計四台で isucon 社の社長が用意してくれたサーバは一台あまる形となりました。無念。
チーム Fulab としての結果につながった要因はまとめると以下辺りだと思います。
- varnish で icon 周りキャッシュ
- 初期画像については変換画像を事前ローディング
- 再起動して安定稼働することに最後の30分を費やした事
最初のレギュレーションの説明の時に色々ヒントあったにも関わらず、帯域を使い切るアプローチに最初から倒せなかったのは力不足でした。 安定的に 10,000 前後のスコアが出るようになってから、複数台に散らすやり方に取り組み始めたのですが、さすがにそこからだと時間が足りなかったですね。
「#茶番」というハッシュタグも流れる結果ではありましたが、さすが LINE 選抜の実力は抜きんでいました。そういった LINE 選抜チームをはじめ、パワフルなエンジニアの方々が沢山参加している中で (差は大きかったですが)、初参加で三位に入ることが出来たことは嬉しかったです。
出題内容や提供される環境が、アプリからインフラまで通してエンジニアとしての現場力をまざまざと問うてくるような作りになっていて、本当によく出てきているなぁ、 と感じました。このような楽しく挑戦的な機会を与えていただいた、ISUCON 運営チームの皆様、本当に本当にありがとうございました!
追記: 平田さんも Isucon 振り返りエントリ を書かれています。Varnish 周りの奮闘の模様は是非こちらからご覧ください!