#isucon2 で惨敗してきた

先日 NHN主催の #isucon2 に「アルコールが足りない人たち」チームで参加してきました!

メンバーは 私と @iszk@froncool でして、なんと「全員アプリ側」という。

 

バランス悪!

 

当日までの流れ

 

みんな普段書いているのが ruby, perl, php という状態で、参加を決めたあとにやったのが、まず言語を決めるための宗教論争でした。

なんとなく php で勝ってもうれしくないよねという流れになり、rubyperlにしぼられました。

参加者のメンツ的にやはりperlの人が多かったので、その方面で勝てる気がしないとかいろいろ理由があり、最終的にはrubyに。

まぁ一応全員Javaかけるので、もしJavaの実装があって、サーバのメモリ的に余裕ありそうだったらJavaでもいいかもね。というのはありましたが。

 

その後、事前に使いそうなミドルウェアのrpmだったりソースをDropboxで共有して、事前準備してました。チューニングに使うような情報だったりもテキストにまとめて共有。

その当時は完璧だとおもってたんですが、実際は全然役に立たず><

まぁミドルウェアを最新にしたら倍になりました、なんて簡単なお題なはずがないわけで。。。。

いざ出陣!

そしてむかえた当日。「遅刻厳禁」なので事前に駅構内のパン屋に集合して朝ご飯を食べた上でヒカリエに。

お題とサーバを受け取ったらとりあえずhostsの設定とか、gitの設定をしつつ、お題となるアプリをざっとみる。

 

そこで衝撃の事実。

 

RubySinatraの実装。

 

まぁちょっと考えれば予想はつくはずなんですが、Sinatraの素振りをしてませんでした><

まぁまだSinatraだけならよかったんですが、テンプレートエンジンがSlimで、しばし呆然。

といっても慣れているRailsで書き直したらさらにおそくなること確実なので、覚悟を決めました。

 

ためしにJavaも動かそうとおもったんですが、Springでだいぶ最初からハンデが多そうだったのと、時間も限られているので断念。

 

ボトルネックを探すの巻

 

私がgitの準備やボトルネック調査のためにnewrelicをいれているあいだに、@iszkがコードをざっとみて、@froncoolがサーバ周りの設定を確認という役割分担でした。

とりあえずさくっとなおせそうなところが何カ所かあったので、一番rubyになれている私がコードを修正しつつ、他に簡単になおせそうなところがないか@iszkが調査。

その間に、@froncoolがwebサーバをapacheからnginxに変更。

 

ところが、ここでがくっとスコアが落ちる。

 

なんか設定が間違っているんじゃないかと試行錯誤。あとから他のチームの話をきいてわかったのは、ほぼ静的ファイルがない状態で、nginxに切り替えても、nginxの長所を生かせずスコアがさがると。ここであわてて結構時間をロス。切り替えては戻してを何度かくりかえしてました。

 

いやここは冷静になろうとご飯を食べつつちゃんとnewrelicの結果を見る。

 

うん、/ticket がやっぱ異常に重い。

 

アプリ改修するの巻

 

ここで購入処理が重いのかviewの表示が重いのか悩んでいたら、@iszkがさくっと購入処理のロジックを直す。

 

だがスコアがあがらない。

 

やはりviewの表示なのではということになり、購入処理をしたら購入結果のテーブルを組み立ててしまえということに。

だが時間がおしせまっていて、一番さくっとできる方法がDBにいれちゃうことだったので、@iszkがまたさくっとDBにいれてくれた。

 

ここでわりとぐっとスコアがあがる

 

ところがたまにfailするので原因をさぐって修正したらまたスコアがおち、じりじりと時間だけが過ぎていく。

とりあえず安定するようになったのが終了10分前。

 

いやこれ以上さわったら、絶対failするという恐怖に負けそこで試合終了。

 

とりあえずfailせずにスコアが最後にでたけど、30万円は夢と消えました><

反省点は多すぎて、まだ引きずってます。

 

当日、懇親会がおわったあとに、1時過ぎまで居酒屋で反省会でした。

まわりの人に喧嘩しているんじゃないかと勘違いされそうなくらい、白熱した反省会で、となりの若者との温度差がすごかった。

大人なのに泣くかとおもった。

 

とはいえ、久しぶりにいろんな人とあえたし、7時間がまさに精神と時の部屋で、得るもの多くて、大満足ですわ。

 

次回こそはもうちょっと上位にはいって、いや優勝できるように日々鍛錬をつみます!