κeenのHappy Hacκing Blog | Lispエイリアンの狂想曲

#isucon で学生賞二連覇してきた

κeenです。@nemunemu3desuさん(ねむさん)、@cocodripsさん(くーむさん)とチーム「(ρ_-)/超銀杏バスターズ\(・ω・ o)」でISUCON4で学生賞とってきた。二連覇わーい。 ※2014-11-09 16:50 ちょっと加筆修正しました

やったこと

本番前

なにもしなかった。しかも前日に体調崩して簡単な打ち合わせも欠席という状態。結局前回と同じく私インフラ、ねむさんアプリ、くーむさんDB。

当日

起床成功。

競技開始〜昼御飯

くーむさんにssh、ねむさんにgitレポジトリの設定してもらって私はcapistranoの設定。capistrano触るのは去年のisucon以来でうんうん言いながらやってた。

rack-line-profをしかけてもらってNginXでjsとcss返してベンチ走らせるもなんか動かないしでつまる。運営からベンチに障害があるとのアナウンスがきてローカルで動かすもエラーが出るわプロファイル結果出ないわ。

foremanが死んでなかったっぽいことが判明したりとちょっと前進するもエラーは残る。

しばらくにらめっこしてもエラーとれないのでとりあえず昼御飯食べながらプロファイル結果見て作戦会議。ここ遅いよって言われて見てみたらrubyからmp4返してたので第一段はそこをWebDAVサーバーに置くことに。因みにエラーの原因は後にline-profのバグだったことが判明。

1号サーバーだけCPUが少ないので3号サーバでリクエスト受けて動画のPOSTは1号サーバーで動いてるWebDAVサーバーにスルーパス、GETはリダイレクトな感じにしよう。私がWedDAVサーバー、ねむさんがアプリ、くーむさんは引き続きアプリ読んで次のボトルネック解析。

因みになんで1号サーバーをWebDAVにしたかというと次の手で2号サーバーもフロントにしたかったから。

昼御飯後〜15、16時くらい?

静的ファイルならlighttpdかなと思ってWebDAV設定するもyumで入れたやつはWebDAV用にビルドされてなかった。結局NginXにした。

lighttpd、一瞬で消え去ったと思ってる方も居るかと思いますがRaspberry Piでも元気に動いてくれる良い子なんですよ!!

ねむさんはWebDAV叩くの初めてみたいで苦戦してたり私の設定ミスもあったりでようやく動く。これでスコアめっちゃ上がる。

社会人相手に一時的に4位を取ったのは嬉しかった。

どうやらネットワーク帯域を全部埋めたよう。

16時以降

くーむさんの分析でログをファイルに書き出してる部分がめっちゃ無駄&フロントの2台化を邪魔するのでどうにかしようとの話になる。最初jsonをシリアライズしてるからMongoDB、いや、やっぱ安心と信頼のMySQL、いや、やっぱ既に動いてるRedisと言って結局MySQLに落ち着く。2台からアクセスが来るので1号サーバに置く。

くーむさんがねむさんにデータベーススキーマの設計とか説明しつつねむさんが実装、私がMySQLのリモートログインとかその他DB全般の設定をする。よく考えたらねむさんPythonアイドルの女子大生とペアプロしてるぞ。

しかし結果間に合わず。うーむ。

最後

ベンチマーク毎にWebDAVにファイルが溜っていくのでどうにかしよう。今までは手動削除してたけど本番計測下手したらこけるんじゃねって不安。アプリの初期化API内でWebDAVサーパーのファイルを全部削除しようとするもなんか拒否られる。設定ミスってたかなあ。

結局CGI(シェル)スクリプトで叩くという荒技。レスポンスが500なのは御愛嬌。しかもNginXがfastCGIしかサポートしてないのでNginXからApacheにフォワードしてからApacheがCGI起動という曲芸のような仕様。MySQLが間に合えばこのシェルスクリプトにDBの初期化も入れるつもりだった。lighttpdならこんなことにはならなかったのに…

Unicornのワーカー数とかベンチマークのワークロード数とかいじってみるも測定誤差がめっちゃ大きくて参考にならず、4位に浮上したときのパラメータで挑む。

結果

タイトルにあるように学生賞。全体は12位で一応真ん中よりは上。賞金GET!無料 VPS GET!!しかもVPSはTECHORUS社長の一声で半年から1年になりました。TECHORUS++++

懇親会で@tagomorisさんに学生チームで帯域を埋めるのは大したもんと褒められた。ヤッター。

反省

個人的には自由奔放すぎた。もうちょっと協調的だったら、とかREADMEくらい書いたら、とかあった。あと私はインフラ担当だったからどのミドルウェアがどのログ管理してて、っていうのを把握してたけど他の二人は把握出来てないことを把握してなかった。毎回rubyのログはどこにあるんですかとか聞かれてた。Capistranoとか結局私しか使えてなかった。

チーム全体では最初ごたごたし過ぎた所為で最後MySQL入れるのが間に合わなかったのと静的ファイルをキャッシュしてなかったねっていうの。静的ファイルをキャッシュしようとしたらまぐれでCache-Control設定したかもしれない(実際2位のチームがそうらしい)。sinatraをproductionモードするのを忘れないって競技中にHangoutに書いたのに忘れてた。Unixドメインソケットも使ってなかった。最後焦りすぎたね。

最後に

私は今年で学生枠で出るのは最後でした。来年からは猛者犇めく一般枠での参加になります。予選突破が大きな目標ですね。出来れば次回はCommon Lispで出たい。

私のインフラ周りの知識や経験はほぼISUCONの経験を通して得られたもので、一年ちょっと前のSQLも見たことない自分に比べるとずいぶん成長したなと思います。LINE、COOKPAD、TECHORUSの方々、運営お疲れ様でした。本当にありがとう御座います。来年も宜しくお願いします。

Written by κeen
Later article
Semantic S式