1. 前書き
先日のISUCON7予選敗退の悔しさをメンバーとともに引きずっているので、我々がISUCON7 Finalに参戦できたらどこまで行けたのかを検証するべく、競技用インスタンスを構築して社内ISUCONをやることになりました。
この記事では、競技用インスタンスを構築する際にやったこととつまったことを紹介します。
最後のほうで、今回作ったAnsible playbooksを紹介しているので、良ければ皆さんもISUCON7本選環境を構築してみてください。
2. 構築する環境
2-1. マシンスペックと構成台数
レギュレーションを確認します。
最小構成は以下の通り
- ベンチマーカー兼ポータル:1台
- Webサーバ:3台
- DBサーバ:1台
各サーバのスペックは本選出場チームのブログを参考にCPU:2コア、メモリ:2GBで用意するつもりでしたが、社内の手続きが間に合わず、Amazon EC2でm4.largeを選択しました。この時点で帯域は再現できず。
出題者の本選解説記事を読むとCPU:3コアとも読み取れる記述があったので詳しく知りたい。
今回は4チーム参加ということで、インスタンス16台+ポータル1台を用意することになりました。
17台の構築を手でやるのは非常に面倒なので、オーケストレーションをTerraform、プロビジョニングをAnsibleで行う・・・つもりでしたが、最終的にAnsibleでWeb+DBサーバを構築したあと、AMIを作って16台増設しました。
2-2. OS
さくらインターネットさんが協賛なので、さくらのクラウドで選択できるUbuntuの最新バージョンではないかという推測のもと、Ubuntu Server 16.04.3 LTS 64bitを選択しています。
3. ハマったこと
おそらくここが気になっている人が多いと思うので、先に書いておきます。
ちなみに、1VMで構築する分には、GitHubに公開されているリポジトリのREADMEに沿って準備するだけでよく、特につまるところはありませんでした。
▼各クラウドサービスのサービス制限により必要台数インスタンスを用意できない・・・。
普段社内で利用しているIDCFクラウド, AWSで環境構築を検討しましたが、準備を前日に行ったこともあり、必要台数確保できないかも・・・と非常に焦りました。
大量にインスタンスを立てる場合は、サービス制限にかからないかを事前に調べて、上限解放をリクエストしておく必要があります。
▼Ubuntu 16.04でAnsible playbooksが動かない・・・。
こういうメッセージが出ます。
"/usr/bin/python: not found"
こちらのIssue(Ubuntu 16.04 requires Python 2)を見て解消しました。
Ansible playbooksを実行する際に、Python2入ってないよ!と怒られた模様。
以下のコマンドをpre_tasksで実行することにより解消しました。
$ sudo apt install python-simplejson
▼portalでmakeできない・・・。
必要なパッケージが見つからないと怒られる。
$ cd ~/portal
$ make
GOPATH=`pwd`:`pwd`/vendor go install ./src/cmd/...
src/cmd/import/import.go:16:2: cannot find package "github.com/go-sql-driver/mysql" in any of:
/home/isucon/local/go/src/github.com/go-sql-driver/mysql (from $GOROOT)
/home/isucon/portal/src/github.com/go-sql-driver/mysql (from $GOPATH)
/home/isucon/portal/vendor/src/github.com/go-sql-driver/mysql
...
これはgbの使い方を知らなかっただけ。
~/portal/vendor/manifest
というファイルがあるので、以下のコマンドを実行すると必要なパッケージが入るので、先ほどのコマンドも通るようになります。
$ gb vendor restore
4. Ansible playbooks
今回作成したPlaybookをGitHubに公開しました。
https://github.com/ihsiek-s/isucon7-final-ansible
Goの参考実装をmakeするときにこけるので、07_build_webapp.ymlはコメントアウトしてます。
わかる人、教えてください・・・。
5. おわりに
社内ISUCONの運営と競技両方に参加しましたが、アドバンテージを得ないようにレギュレーションを読んではいけないという制約の中で準備をするのはすごく大変でした。
中途半端にアドバンテージを得てしまったり、競技開始後に運営で手をとられたりといろいろ問題があるので、運営と競技者はちゃんと線引きしたほうがいいというのが、今回得た教訓です。