cnosuke's blog (′ʘ⌄ʘ‵)

へっぽこエンジニア

#isucon 4本戦に「railsへの執着はもはや煩悩(以下省略)」で参加 && 爆散しました

アルバイト仲間な @k0kubun と大学の友人の @rkmathi となんとか予選を突破できていたのでISUCON4の本戦に出場してきた。

そういえば今思い出したのですが予選も記事に書いてなかったのでさらっと予選についても書いておく。

予選の話

ちなみに去年も出てました。去年の話はこちら。予選突破と思いきやFail出過ぎで結局スコア低くて死亡みたいな感じだったので今年はなんとしても予選は突破したい気持ちでした。

去年の反省で一番大きかった「ベンチがちゃんと通る状態を続ける」というのを徹底的に守ることを意識。 今年は事前に集まって練習したりもしたので、まぁよく使われるnginxとかvarnishとかunicornとかmysqlとかはそれなりに設定いろいろ弄って実験して感覚掴んで望んだつもりだったのに、やはり試合となると、ほんとなかなか思い通りに行かなくて辛かった。。。

あと去年の反省でcapistrano的なのやっぱりあるほうが便利だなと思ってたので、今年はItamaeを使ってみたけど、結果的にはやはり完璧に使いこなせる状態じゃなく結構はまって時間使ってしまったのは痛かった。(Itamaeはしっかり実用段階だったけど、僕らの知識が不足してた。。。)

時系列でどんなことやったかはk0kubunrkmathiが時系列でまとめて記事にして下さったのでそちらをご参照下さい。

あと予選の時の大きな反省点として、チームワークが出来てなかったことがやはり大きかった。 具体的には作業の分担も曖昧で何がまだ出来てないかみたいなのもちゃんと把握出来てない状態で、終了間際になって、まだそれやってなかったんだっけ??みたいな状態にみんなでなってアワアワしてた。

それで、完全に実力を出せてないような不完全燃焼な感じだったのでマジ死亡したというか死亡して天に昇って雨となって地上に振り落ち草木を潤して幸せに過ごしたいと思っていたらなんとか予選突破できてたので本当に嬉しかったです(遠い目)

本戦の話

そんなわけで本戦ですが、前述のチームワークの反省を生かし、明確に僕が指揮を取ろうということになった。 指揮といっても、指示を出すような大層なものでは無く、なんていうか「事務局長」みたいな感じ。 具体的には、競技スタート直後の作戦会議やある程度コードを読んだあとの作戦会議の司会進行、仕事の分担の整理みたいな感じで、調整するための中心軸みたいなもの。 実作業の分担としては、やはりk0kubunが僕より全然コード書けることは普段の仕事でもいつも思っていたので、アプリケーションコードはk0kubun中心にまかせることにして、インフラ面を僕とrkmathiで見るという感じにした。もともとは3人ともアプリケーションをよく書いている人間だけれども、比較的僕とrkmathiは前職の関係もあったり僕らは元々インフラまわりが好きみたいなのもあってこういう分担になった

戦略

動画配信の問題だったので、ふと割と最近みた id:Yoshiori さんの料理動画のスライドとか思い出して、帯域とコネクション握りっぱなし問題で辛くなるのではと考えた。

f:id:cnosuke:20141111002707p:plain

そんなわけで、おおざっぱに図示すると上のような構成を考えた。 上の図、1がCPU1つのサーバ、2,3はCPU2つのサーバで、2と2'、3と3'は同一のサーバだけど便宜上図の上では分けた。

まず考えたのは、3台ともフロントに並べて外側の帯域を使い切れるように。その時、assetファイルは各サーバから直接返せるように。また、一貫性を保つためにredisの各assetがどこのサーバにあるかといった情報を含めた(assetそのもののデータ以外の)全ての情報を2'に集めて、ロギングは3'にいれたmysqlにぶっこんでいくようにした。

午前中の大半はコードを読んだりログを取ったりして戦略を練ったり、設定ファイルをリポジトリから管理しやすくしたりするのにほとんど使って、本格的に手を入れ始めたのはお昼ご飯の後だった。

最初にnginxとかの設定ファイルを先にこれまでのisuconの問題の傾向とかである程度テンプレート化したのを入れてしまった...。これが本当によくなくて、ある意味これを信じすぎたせいで最後までcache-controlには気づかなかったし、keep aliveも意図的に超絶短くしたままだった。 実世界だったら考えそうなことなのに、isuconは特殊な状況だという思い込みによって完全に縛られてしまっていた。本当に悔しすぎるし、ここをついてくるベンチマーカー優秀過ぎて辛い。。。

あと、実は僕らのチームは18時くらいまでは動画を普通にメモリ上から返していた。 理由は、最初の段階でログを見てみるとゆーてそんなに大量に動画postされてこなくね?みたいな考えがあって、僕らの戦略だと3台のサーバに動画ファイルがpostされてきて保存も3台に分散されるから、3台分のメモリ合計まではオンメモリでまだいけるんじゃね?それにやっぱり配信だからpostがめっちゃ来るというよりはやっぱり配信数がメインなんじゃないの?みたいに考えたからでした。 で、そんな感じでやっていくと、まぁベンチマーカーはスコアが上がれば上がるほど鬼畜になっていくみたいな感じで、8000点を安定的に超えるような点数になると、普通にswapして死亡みたいになるようになってきた(varnishも爆死するみたいになった)ので、流石にもう限界だね、って話をしてFileに書き出すよにした。(18時くらい) で、残り時間が少なくて、あと一時間でちゃんと再起動しても動く状態を保ってnginxから直接assetを返せるように設定とアプリケーションコードに手を入れるのはリスクが大きいのでは、という話になって、めっちゃゴミっぽいと3人とも認識しながらSinatraの上で File.writeFile.read するようにした。ゴミっぽいとは思ったけど、メモリ使い切って死ぬよりはマシだということで取りあえずこれにしたんだけど、そのあとはいよいよ時間が無くなってきて、なのに希に FATAL で測定で失格になりそうな現象が起きることに気づいて、アワアワしているとTimeUpみたいになった。

時間内に計測していた感じだと、8000点から12000点とかは出ていたので、なんとか学生枠では1位取りたい取りたい!!!って思っていたけど、最終スコアが5922点で本当に膝から崩れ落ちそうになった。辛い。Failしなくてよかったとか思ったけど、涙出るほど悔しい。

本戦についてのk0kubunの記事はこちらで、rkmathiの記事はこちらにあるので、時系列で詳しく見たい方はこちらを参照下さい。

感想

チームワークは本戦は凄く良かったと思うし、知識とか経験でも正直学生枠みんなそんな大差無かったんじゃないかと思う。で、敗因は何かってことをここ数日ずっと考えているんだけど、本当に人間的な無力さとかを考えてしまって辛い。。。

特に試合中のスコアを見てもまさかこんなに惨敗するとは思ってなかったので最終スコアみた時本当に辛い気持ちになった。 あと、やっぱり生ハム原木チームさんめっちゃ凄いと思う。本戦で、しかも例年のisuconの裏をかくようなベンチマーカーだったのに見事に見破ってたし、それ以外でもしっかりパフォチューしてきてるの、本当に尊敬。 あと、他のチームのみなさんも、後の懇親会でいろいろお話を伺ったり、会社で出場していた人に話聞いてみたりするとみんなやっぱり凄いいろんなこと考えていろんなこと試しててやっぱり全然勝てないと思った。同じ学生枠だったBIG丼チームとかも、元々友人で知っている人なつもりだったけど、やっぱり彼らめっちゃ凄いしめっちゃ面白いと思った。

はー、なんだか、ほんと信じられないくらい、自分の無力さを感じた試合だった。

だけれど、どMなのか知らないけどめっちゃ面白かったのも事実だし、ショックを受けたことが少し気持ちよかった気も今はしている。もしかしたら、さすがに日数が経って冷静になったからかもしれないけど、なんていうか、もっと勉強すべきことはいっぱいあるし、そのためには時間がいくらあっても足りないんだなみたいに思うとちょっと楽しくなってきた気がする。

めっちゃ悔しいし、考えていると胸の中ポカポカ状態になってくるけど、このエネルギーを使ってもっと精進したいし、今年度こそは修論を書き終えたい。

今年度こそは、修論を書き終えたい。

来年は一般枠でみなさんに拳を振り上げていきたいと思うので、引き続きよろしく御願い致します。

PS. 運営の皆様、本当にありがとうございました。 めちゃめちゃ面白かったですし、来年度以降、参加者の立場で盛り上げたい気持ちは当然ですが、僕も何かお力になれたらとか思うくらい、なんかかっこよかったです!パイセンかっけー!!!:star: