あらすじ
というわけで ISUCON6 予選の環境を再現したいと思います。当日行われた環境とはディレクトリ構成などが違うと思いますがそのあたりはご容赦ください。
あと PHP はよくわからなかったので除外しました。
Azure で以下の VM を用意
私は今回 Azure を用意しましたが良いスペックの PC をお持ちの方は VirtualBox でも良いのかもしれません。
OS: Ubuntu Server 16.04 LTS サイズ: Standard DS2 v2 ユーザー名: isucon IP: 静的に変更 受信規則: HTTP を追加
ansible を読み解く
おそらく起点はこちら。 https://github.com/isucon/isucon6-qualify/blob/master/provisioning/image/init.sh
なんですが https://github.com/isucon/isucon6-qualify/issues/6 にあるように現在は少し Ansible が想定とは違う構造になっているようです。issue にあるように target を dev にする必要があるのと、それでもエラーが出る場所があるので修正をします。
エラーが出る場所1: bin の位置
https://github.com/isucon/isucon6-qualify/blob/master/provisioning/image/ansible/04_deploy.yml#L10
エラーが出る場所2: PHP
https://github.com/isucon/isucon6-qualify/blob/master/provisioning/image/ansible/04_deploy.yml#L10
構築手順
最初に最低限必要なコマンドを入手します。ack-grep
は私の趣味です。
sudo apt-get update sudo apt-get upgrade sudo apt-get install -y --no-install-recommends ansible git aptitude ack-grep
Ansible
git clone
cd /home/isucon git clone https://github.com/isucon/isucon6-qualify.git
bin が当初想定していた場所とは異なっているようです。あとPHPがなぜかエラーになる。ということで以下の修正を加えます。
edit isucon6-qualify/provisioning/image/ansible/04_deploy.yml
--- a/provisioning/image/ansible/04_deploy.yml +++ b/provisioning/image/ansible/04_deploy.yml @@ -7,7 +7,7 @@ - dev tasks: - synchronize: src=../../../webapp/ dest=/home/isucon/webapp owner=no group=no links=yes - - synchronize: src=../../../bin/ dest=/home/isucon/bin owner=no group=no + - synchronize: src=../../../webapp/bin/ dest=/home/isucon/bin owner=no group=no - synchronize: src=../files/env.sh dest=/home/isucon/env.sh owner=no group=no - file: path=/home/isucon owner=isucon group=isucon state=directory recurse=yes become_user: root @@ -35,19 +35,19 @@ shell: PATH=/home/isucon/.local/go/bin:$PATH GOROOT=/home/isucon/.local/go GOPATH=/home/isucon/webapp/go make all args: chdir: /home/isucon/webapp/go - - name: composer - get_url: - url: http://getcomposer.org/composer.phar - dest: /home/isucon/webapp/php/composer.phar - mode: 0755 - - name: php - shell: PATH=/home/isucon/.local/php/bin:$PATH php composer.phar install - args: - chdir: /home/isucon/webapp/php - - name: php-fpm (isuda) - copy: src=../files/isuda.php-fpm.conf dest=/home/isucon/.local/php/etc/isuda.php-fpm.conf owner=isucon group=isucon mode=644 - - name: php-fpm (isutar) - copy: src=../files/isutar.php-fpm.conf dest=/home/isucon/.local/php/etc/isutar.php-fpm.conf owner=isucon group=isucon mode=644 +# - name: composer +# get_url: +# url: http://getcomposer.org/composer.phar +# dest: /home/isucon/webapp/php/composer.phar +# mode: 0755 +# - name: php +# shell: PATH=/home/isucon/.local/php/bin:$PATH php composer.phar install +# args: +# chdir: /home/isucon/webapp/php +# - name: php-fpm (isuda) +# copy: src=../files/isuda.php-fpm.conf dest=/home/isucon/.local/php/etc/isuda.php-fpm.conf owner=isucon group=isucon mode=644 +# - name: php-fpm (isutar) +# copy: src=../files/isutar.php-fpm.conf dest=/home/isucon/.local/php/etc/isutar.php-fpm.conf owner=isucon group=isucon mode=644 - hosts: all gather_facts: no
この状態で ansible を実行します。 target に dev を指定する事によって冒頭に説明した問題を回避しています。
cd ~/isucon6-qualify/provisioning/image/ansible/ PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ansible-playbook -i localhost, *.yml --connection=local -t dev
DB setup
DB を初期化します。
cd ~/isucon6-qualify/provisioning/image/ sh db_setup.sh
この状態で IP を直接叩くと Isuda が表示されると思います。
bench tool を用意
ベンチマークツールを同一ホスト上に設置する
.bashrc に以下を設定します。
echo 'export PATH=~/.local/go/bin:$PATH' >> ~/.bashrc echo 'export GOROOT=/home/isucon/.local/go' >> ~/.bashrc echo 'export GOPATH=/home/isucon/gocode' >> ~/.bashrc echo 'export PATH=$GOROOT/bin:$PATH' >> ~/.bashrc echo 'export PATH=$GOPATH/bin:$PATH' >> ~/.bashrc echo 'export PATH=$HOME/isucon6-qualify/webapp/bin:$PATH' >> ~/.bashrc
環境変数を適用させる
exec $SHELL -l
edit ~/.gitconfig
[ghq] root = ~/gocode/src
isntall
go get github.com/motemen/ghq ghq get https://github.com/isucon/isucon6-qualify.git
ビルド
cd /home/isucon/gocode/src/github.com/isucon/isucon6-qualify/bench go get go build
最初のベンチ結果
$ ./bench -datadir=data -target=http://localhost {"pass":false,"score":0,"success":0,"fail":0,"messages":["初期化リクエストに失敗しました"]}
もう一度実行
$ ./bench -datadir=data -target=http://localhost 2017/10/18 15:46:39 start pre-checking 2017/10/18 15:46:45 pre-check finished and start main benchmarking 2017/10/18 15:47:39 benchmarking finished {"pass":true,"score":3233,"success":1568,"fail":4,"messages":["リクエストがタイムアウトしました (POST /keyword)","リクエストがタイムアウトしました (POST /login)","リクエストがタイムアウトしました (POST /stars)"]}
おしまい。