Masteries

技術的なことや仕事に関することを書いていきます.

ISUCON10の予選に参加しました(そして無事予選敗退しました)

「ISUCON参加したことないんで参加してみたいんすよね〜」という友人と一緒に, 「イスイスユカイ」で出場しました. Go実装で結果は1695点, 無事に予選落ち. 例年, ISUCONに出る時はだいたい昼過ぎくらいに何もわからなくなって, 終盤は「もうだめぽ...」となり, 何も出来ずにお通夜状態になっていることが多かったのですが, 今年はなんとか最後まで戦意喪失せずに走り切ることができました(が, 予選は敗退しました).

最後まで走りきれたのもそうですが, Goで意外と(予想以上に)スルスルと読めた/実装出来たことも良かったですね. まあ, もっと複雑なアプリケーションになってくると苦戦するのでしょうが, 今回のISUCON10の予選くらいの規模感であれば普通にやっていける, と知れたのはほんのちょっと自信になりました.

やったこと

DB分割, schema変更, 後はnginxの設定書き換えたりとかをやりました. うち, 自分が手を動かしたのが以下2つ.

DB分割

「なんかこれ, estate(物件)とchair(椅子)でJOINしているクエリなさそうじゃん?」と気づいたので, 適当にコードを書き換えて, ホストのうち1台をproxy/appに, 1台を物件用/1台を椅子用のDBサーバにする, という構成に変更しました. 2台のサーバをMySQL用にするのはチームメンバーにおまかせ. やってみたら思ったよりスコアが上がって, みんなで「ウケるw」という感じになっていました.

schema変更

なぞって検索する機能で, 緯度経度を使っていたので, そのあたりの処理をGeometry型のカラムを追加してMySQLでいい感じにできないか? ということで, fixtureの変更とGoの実装をやりました.

あとは, ある物件について椅子が入るか? というのを判定する処理がだいぶ複雑だったので, door_long, door_shortカラムを追加して, イッパツで引けるようにしたりしました. 椅子のwidth/depthについて, 短い方が物件のdoor_short/長い方が物件のdoor_longより小さかったら入る, という感じでスマートに実装できます.

fixtureの修正は, 思考停止しておもむろにPerlのスクリプトを書き始めて(Go実装でやっているのに!!!)ガッとやったのですが, 感想戦で「初期データを突っ込んで, MySQLにカラム追加して, よしなにデータ書き込んで, dumpした」という話を聞いて「それでよかったわ...」と思ったりしました.

感想

最初にも書きましたが, 今回は最後の1時間前まで予選通過ギリギリラインに踏みとどまれたのが良かったですね(しかし, そこからのラストスパートが全然出来なかったので, そこは完全に実力不足). 今回は事前に(1回だけど)過去問で練習したので, やっぱり場数踏んでおくの大事だなと思ったので, もし来年もあるのならもうちっとちゃんと練習してから望みたいですね... 特にMySQLやnginxなど, ミドルウェアのチューニングが弱すぎるので, 感覚つかんでおけると良さそうと思いました. あとは, 今回はISUCON初メンバーと一緒にやった, という所で, 一応(毎回予選敗退ではあるものの)経験者である自分がいい感じにリードする必要がある, と思うのですがそういった所あまり配慮出来なかったのも反省点です... 申し訳ない.

あと, ポータル周りは毎回進化していて凄い! と思うのですが, 今回は特に, めちゃくちゃいい感じで大変感動しました. 質問をポータルで完結出来るのは大変体験が良かったです. 途中, 1台サーバーが動かなくなってみんなで青ざめたのですが, 「動かないんスけど...」という問い合わせを投げたらシュッと対応してもらえて助かったりしていました. あと, ベンチマークも実行したらじわじわスコアが上昇していくのが見えて, これがまた脳汁が出てきて... 最高...

例年, 運営非常に大変と思いますが, その甲斐もあってありがたい事に今回もとても楽しませて頂きました. 最後まで頑張れると感想戦も楽しいんだな, ということをようやく知ることが出来ました(?). 学びも多かったので, もし来年も開催されるなら次はちょっと力を入れつつ, 絶対参加したい!!! と思いました. 運営の皆様, 参加者の皆様, お疲れ様でした!!!