あいつの日誌β

あいつの日誌です。

ISUCON7 に向けて ISUCON6 の予選を復習するために環境を用意する

あらすじ

というわけで 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)"]}

おしまい。