社内ISUCONを開催した話

先日2日に渡り社内でISUCONを開催してきました。今後社内ISUCONやるぞ!という方もいらっしゃると思いますので、そこで得られた知見などを書き記しておきます。 なおリファレンス実装やベンチマーカのコードはこちらになります。

github.com

なぜ社内ISUCONをやろうと思ったか

本家ISUCONに出てメチャクチャ面白くて、社内にも広めたい!!!という思いからです。

またISUCON5本戦で「ISUCON出題すればISUCON勝てる」みたいな話が飛び交っていたので、ベンチマーカ実装にも興味があったので開催する運びとなりました。

イベントとしての工夫

今回社内ISUCONをやるにあたって懸念だったのが参加者が集まるかどうかでした。そもそも社内でのISUCON認知度が低い、平日開催なので通常業務もあるという状況でしたが、最終的には合計15チームに参加してもらってワイワイ感がありました。

2日開催

一番やって良かったな〜というのは本家ISUCONの予選同様、2日開催にしたことです。事前エントリーではそれほど参加者数が伸びなかったのですが、2日開催にして1日目競技中に参加者が2倍くらい伸びました。

ポータルサイトのゲストログインを実装しておき、1日目にエンジニア全員が入っているチャンネルでワイワイ騒いでいたので、興味はあるけど参加どうしようかな〜という勢に響いたのではないかと思っています。参加者の割合は1日目4チーム、2日目11チームと圧倒的です。

実際年末に一度開催しようとした時は4チームほどしか集まらず、この時は告知も余裕無かったし〜ということで延期した苦い過去がありました。忙しい方が多い場合や積極的な方が少ない場合は実際に盛り上がっている様子を中継出来ると参加者が伸びるかもしれません。

競技時間

本家ISUCONは8時間ですが、今回は平日開催かつ参加しやすいものを、ということで競技時間は14時〜18時の4時間としました。 合わせて参加者全員分のVMを予め用意し、アプリケーションの切り替え手順もマニュアルに載せてなるべく作業に集中出来る環境を整えました。

問題

ISUCON5をベースに作らせていただきました。TwitterベースのSNSサイトを題材にして、DBボトルネックの問題としました。index貼ってN+1クエリを潰していけば確実にスコアが上がるような問題です。 社内なので敢えて罠は設けず、普段触る設定ファイルがちゃんと設定出来て基本通りのクエリチューニングが出来るかどうかという所を焦点としました。

ベンチマーカ

これもISUCON5をベースにさせていただきました。本記事冒頭でも述べましたが、ベンチマーカの知見を得たいという目的もあったため、ISUCON5qのベンチをScalaで書き直して実装しました。なおScalaは完全に趣味です。

ベンチマーカなんてこれまで書いたことが無かったので、並列性、セッションの扱い、整合性チェックなどなど非常に参考になることばかりで書いたことない人は一度書いてみると良いと思います。 ポータルと連携させた時にどうやってベンチマーカをスケールさせるか、具体的にどう実装すれば良いかという知見も得られました。

このリポジトリを支えている先人の方々には感謝しかありません。

反省点

問題の準備がギリギリになってしまい、事前に満足なチューニングを行うことが出来ませんでした。それにより適切な難易度調節が行えず、結果的に簡単すぎる問題になってしまったかもしれません。

また今回は準備から開催まで全て1人で行いましたが、まぁ結構大変(複数言語でのリファレンス実装用意、第三者に解いてもらって調整等々)なので出来れば数人で準備出来たほうが良いでしょう。アプリケーションの性質上、相談出来る相手が準備チームに限られるので1人だと何かと不便です。

終わりに

社内ISUCON、準備は大変ですがイチから準備することによって得られることが沢山ありますし、参加してもらった人にも楽しんでもらえると思うので是非やってみると良いです。

おまけ

社内ISUCON開催後、高スコア獲得者を集めて各々何をやったか、みたいなことを喋る勉強会をやりました。以下公開されている僕と@do7beの資料です。

speakerdeck.com

github.com