社内ISUCONをやった

3ヶ月以上ずっと趣味で社内ISUCONの問題を作っていました。ブログを書きました。是非読んではてブしてください。

inside.pixiv.net

github.com

以前も書きましたが、今年のISUCON6では出題に関わる予定です。

catatsuy.hateblo.jp

なのでこれから本番に向けてまた頑張る必要があるので非常に厳しい感じです。

参加者は自分の選択した言語実装以外のことを考える必要は無いですが、問題作成側はベンチマーカーを作りきらないといけないし、複数の言語の実装も作らないといけないし、ポータルサイトやら環境やら様々なものを構築する必要があるし、全部を結合してちゃんと動かさないといけません。

今回の社内ISUCONは自分が1ヶ月程度をかけて、問題とベンチマーカーのプロトタイプを作成して、その後に全員で足りない部分を作ったり、ブラッシュアップをしたりし続けたという感じで何とかできました。やることが多すぎて1人では途方に暮れる量なので仲間の重要性を感じました。

問題の初期実装はSinatraでサクッと作ろうかと思いましたが、tagomoris/mysql2-cs-bindのバグというか、想定外の使い方をしてしまってかなりハマりました。今ならbrianmario/mysql2でもprepared statementが使えるということで使ったら、バグを踏んでエラーが出たりと非常に厳しい感じでした。

Golangへの初期実装移植のときにハマることはなかったのと、移植した他のメンバーからハマったとは聞いてないので、RubyMySQLと異常に相性が悪いのではないかという気持ちでいっぱいです。

Rubyから作り始めたのは、過去のISUCONはRubyから作っていたと聞いたことと、自分が比較的慣れているという理由でした。実際MySQLとの相性を除けば、基本的なWebアプリケーションを作る上では困ることがなくて、初期実装を作る上では非常に便利なので理に適っていると思います。

問題を作るに当たって、過去のISUCONの問題をかなり調べました。実際に問題を作るとなると今まで気にしてなかったような細かい部分も見る必要が出てくるので、問題作成者が有利と言われるのも当たり前という感じがします。

ベンチマーカーも最初はどうやれば作れるのか分からなすぎて迷走し続けました。とりあえず動くものができた段階で他のメンバーに見てもらってリファクタリングや機能追加などしていきました。ベンチマーカーはGolangで書きましたが、並列性が高いプログラムを書く必要があるのでGolangは非常にあっていると思います。

ただSinatraで書かれたWebアプリケーションをGolangに正確に移植するのは極めて困難でした。そもそもSinatraの時点で工夫をすればだいぶマシにできたはずなので次回はそうしようと思います。

それとベンチマーカーを作っていると、いくらでもチートの方法を思いつくので、防ごうと思うと際限がなくなります。それにバグを付くよりも正攻法でチューニングした方が効率良くスコアを上げられるはずなので、そこまで気にする必要は無いかなと思いますが、実際には色々防ぐ必要があるのだろうなと思います。

細かい知見などはたくさんありますが、本番のISUCONもあるので特に発信することはないかもしれません。

というわけでISUCONがんばるので皆さん出場してください。