しょ〜うぃん広場

おもにTech系なブログ、ときどき個人的なブログ

社内ISUCONでISHOCON2を使用するための手順まとめ

概要

この記事では、ISHOCON2を皆で解くイベント を開催した際に使用したISHOCON2のベンチマーカーとポータルサイトの構築手順を紹介します。

背景

ISUCONも今年で8回目となり、最近では多くの会社で社内ISUCONが行われています。 pixivさん(catatsuy/private-isu)、Yahoo! Japanさん(yahoojapan/yisucon)、Recruitさん(recruit-tech/r-isucon)では独自で問題を作成されており、他の会社で社内ISUCONを実施する際にはこれらの問題が再利用されることが多い印象です。(特にpixivさんの問題はISUCONのインスパイアとしては(ぼくの知る限りでは)最初に登場したため知名度も高く、よく使われているように思います。)

ぼくは社内ISUCON向けという形ではなく、個人で楽しむことを目的としてISHOCONシリーズを作成しています。

ISHOCON1は沖縄で開催されたISUCON模擬試験イベントや、Wantedly さんの新卒研修で使って頂いています。

ISUCONイベントを開催する場合、作成済みの問題を使用することで問題作成のコストは下がりますが、ベンチマーカーのインフラを用意したり、参加者がスコアを確認するポータルサイトを準備したりと意外とやるべきことが多いです。 そのハードルが高くてなかなか社内ISUCONが実施できない。という組織も多いのではないでしょうか。

この記事では、ISHOCON2を皆で解くイベント を開催した際に使用したベンチマーカーとポータルサイトの構築手順を紹介します。この記事で主催者の心理的ハードルが下がり、より多くのISUCON関連イベントが開催され、より多くのエンジニアがアプリケーションの高速化に興味を持ってもらえたら嬉しいです。
(とかいいつつ、ISHOCON2はベンチマーカーとポータルサイトでそれぞれ1点ずつ不具合を抱えているのですが。。ASAPで直します…)

ちなみに、今回のイベント準備は右往左往して結局15~20時間位かかってしまいましたが、この記事を読めば2,3時間で環境構築できるのではないかと思います。
(サーバーレスにしようとして上手く行かなくて、結局ECS使うことに落ち着いた話はまた別記事で書きます…)

ベンチマーカーの準備

ここからが本題です。
ISHOCON2はアプリケーションとベンチマーカーが別インスタンスで動くようになっており、(現時点での)最新のベンチマーカーAMIは ami-78b66107 です。ただしこれは個人で取り組む用の実装になっているので、こちらは使用しません。
使用するのはこちらのコンテナイメージです。 showwin/ishocon2_bench_for_contest
このイメージは、HTTPリクエストを受け取ると、ベンチマーカーが起動して、ベンチマーカーの実行ログを Firebase に吐き出されるようになっています。 (WebアプリケーションはPython, Flaskで書かれており、このあたり に実装があります)

Firebase の Database は現在 Cloud FirestoreRealtime Database の2種類がありますが、今回は後者の Realtime Database を使用します。
ベンチマーカーの実行のためには POST /run に以下のパラメータをJSON型で投げますが、今回説明するポータルサイトとセットで使う場合には、特に意識する必要はありません。

key 説明
ip ベンチマークする対象のIPアドレス
name 実行した人の名前(ポータルサイトに出す用)
workload ベンチマークの負荷量

コンテナを動かす環境はどこでも問題ないですが、ぼくは使い慣れているECSを選択しました。 ECS + SpotFleet な構成だと金額的にかなり低コストに収まると思います。
コンテナを起動するときに以下の環境変数を設定してください。

key 説明
FIREBASE_URL 結果を投げるFirebaseのURL。(e.g. https://xxxx.firebaseio.com )
MYSQL_USER 後述するDBにアクセスするためのユーザ名
MYSQL_PASS 後述するDBにアクセスするためのパスワード
MYSQL_HOST 後述するDBのホスト

ベンチマーカーのバックエンドにはデータベースが必要で、アプリケーション実装の初期値と同じデータが入っている必要があります。 ISHOCON2/ishocon2.dump.tar.bz2 at master · showwin/ISHOCON2 · GitHub にDBのダンプファイルがあるので、こちらを解凍してデータベースに流し込んでください。

ベンチマーカーのクラスタサイズの目安としては、25人が参加したイベントで、1コンテナあたり2CPUを割り当てて、20コンテナぐらい用意したところ、クラスタ全体のCPU負荷が常時<20%でした。 少し余裕を持つとして、1コンテナあたり2CPUで、参加者2人につき1コンテナぐらいの割合で良いかと思います。(競技終盤はガンガンベンチマーカーが実行されるので、終盤だけ少しスケールさせておくと良さそうです。)
DBはRDSでt2.microを使用していましたが、もう一つ上のインスタンスサイズでも良かったかなと感じました。CPUへの負荷はかかりませんが、ベンチマーカーからの接続数はそこそこな数があるため、メモリにもう少し余裕が欲しかったです。

注意すべき点として、後述するポータルサイトからは workload 30 までしか実行できませんが、workload > 50 ぐらいで実行するとベンチマーカーが途中で止まる可能性があるバグが存在しています。(https://github.com/showwin/ISHOCON2/issues/27)

ポータルサイトの準備

ポータルサイトはこちらのレポジトリにあります。showwin/ISHOCON2-Portal
使い方は こちら をご覧ください。

設定しなければいけない値としては、上で用意したベンチマーカーのURLと上で用意したFirebaseのデータベースURLの2つになります。

Issue に上げていますが、webpack の1系でしか動作確認できていないので、注意してください。

当日のマニュアル

今回のイベントで使用したものを元にテンプレートを作ってみました。よろしければ使ってみてください。 https://gist.github.com/showwin/8c2ff3f3c57c0135f7fbf4383942e1b8

ISHOCON2を使ったイベントを開催したら…

showwin/ISHOCON2#関連リンク追記しますので、イベントレポートを書いていただいて、@showwin まで連絡いただけたら嬉しいです!

Enjoy ISHOCON Life !