あいつの日誌β

働きながら旅しています。

isucon5 予選の復習を macOSX でやってみる

isucon5 予選の復習を local 環境でやってみる

前回までで Azure 上でアプリが動かせるようになりました。 今度はローカルでソースコードを動かしたいと思います。

おそらく予選時に複数人で作業する場合は直接 VM のファイルを編集すると不都合が発生するため、事前にどのように作業するかを確認しておきます。

git による管理

複数人で作業する事を考えると local で作業する事が好ましいと思います。

Azure -> Bitbucket -> local

Azuer 上で git 管理をしたいと思います。 まずは秘密鍵を作り、公開鍵をコピペします。

$ ssh-keygen -f ~/.ssh/isucon_id_rsa -N ''
$ chmod 600 ~/.ssh/isucon_id_rsa
$ cat ~/.ssh/isucon_id_rsa.pub

config も作成します。以下のようにします。

$ cat touch ~/.ssh/config
Host *
 ServerAliveInterval 120

Host bitbucket.org
 User YourID
 Port 22
 Hostname bitbucket.org
 IdentityFile ~/.ssh/isucon_id_rsa
 TCPKeepAlive yes
 IdentitiesOnly yes

Bigbucket の管理画面上で先ほどの公開鍵を設定しておきます。

その後以下のようにして push します。

cd $HOME/webapp
git init && git add . && git commit -m 'firts commit'
git remote add origin git@bitbucket.org:okamuuu/isucon5q-webapp.git
git push -u origin --all
git push origin --tags

とりあえず今回は Perl で動作させてみます。 ちなみに私は Perl の環境は以下のようにして入れています。

cd $HOME
git clone https://github.com/tagomoris/xbuild .
$HOME/xbuild/perl-install 5.20.2 $HOME/.local/perl

インストールされていることを確認

% $HOME/.local/perl/bin/perl --version | grep 'version'
This is perl 5, version 20, subversion 2 (v5.20.2) built for darwin-2level

私は direnv で PATH を通しました。

echo 'PATH=$HOME/.local/perl/bin:$PATH' > $HOME/isucon5q-webapp/perl/.envrc

必要なモジュールをインストール

% carton install

なぜか DBD::mysql が fail するので cpanm でインストールします。(よくわからないがとりあえず気にしない)

% cpanm DBD::mysql

起動

% carton exec -- plackup -s Starman -p 8080 --workers 10 --disable-keepalive app.psgi

この状態でTOPページが表示されるはずなので http://localhost:8080ブラウジングして確認。

あとは MySQL をセッティングする。私は dump.sql を ISUCON5 予選時の gcp の image から取得しています。

% mysql -uroot -e 'create database isucon5q'
% mysql -uroot isucon5q < ~/dump.sql

MySQL 用の User を作成します。

mysql> CREATE USER isucon IDENTIFIED BY 'isucon';

環境変数にその User を使うようにセットします。

echo 'ISUCON5_DB_USER=isucon' >> $HOME/isucon5q-webapp/perl/.envrc
echo 'ISUCON5_DB_PASSWORD=isucon' >> $HOME/isucon5q-webapp/perl/.envrc

改めて起動しログインできる事を確認します。

% carton exec -- plackup -s Starman -p 8080 --workers 10 --disable-keepalive app.psgi

以下の ID, PW でログインできれば OK

ID: edwardo3657@isucon.net
PW: edwardo3657

あとは gitignore で不要なファイルを設定しておきます。

% cat .gitignore
local

その他のファイル

my.cnf や nginx.conf といった middleware の設定ファイルを git で管理します。 この辺は各自の好みではあると思うのですが、私は MacOSX 上に VM を立てずに予選に望む予定です。

予選で使用される VM のスペックは CPU 4, Memory 4GB 程度になるような予想を勝手にしていて、その場合は手元の環境に致命的な差が生じないと思っています。

そうすると手元の MacOSX 上で設定ファイルの動作確認ができるのと後で自分が何をやっていたのかわかりやすいので私はこれらの middleware のプロセスを手元の MacOSX で立ち上げて作業したいと思っています。

といいつつ、いざ当日になったら直接本番環境を操作する可能性ありますけど...

% cd $HOME/isucon5q-webapp
% mkdir etc
% touch etc/nginx.conf
% touch etc/my.cnf
% git add etc/nginx.conf etc/my.cnf

ローカルで使用されている nginx.conf と my.cnf を退避させて上記のファイルへのエイリアスを作成します。

mysql

mysql.server stop
mv /usr/local/etc/my.cnf /usr/local/etc/my.cnf.orig
ln -s $HOME/isucon5q-webapp/etc/my.cnf /usr/local/etc/my.cnf
sudo mkdir /var/lib/mysql
sudo chown -R _mysql:wheel /var/lib/mysql
mysql.server start

nginx

% sudo nginx -s stop
% mv /usr/local/etc/nginx/nginx.conf /usr/local/etc/nginx/nginx.conf.orig
% ln -s $HOME/isucon5q-webapp/etc/nginx.conf /usr/local/etc/nginx/nginx.conf
% nginx -t 
% sudo nginx

元に戻したい場合はエイリアスをオリジナルに向ける

mysql

% mysql.server stop
% rm /usr/local/etc/my.cnf
% ln -s /usr/local/etc/my.cnf.orig /usr/local/etc/my.cnf
$ mysql.server start

nginx

% sudo nginx -s stop
% rm /usr/local/etc/nginx/nginx.conf
% ln -s /usr/local/etc/nginx/nginx.conf.orig /usr/local/etc/nginx/nginx.conf
% sudo nginx

と、このような感じで試験環境と開発環境の設定ファイルを共有化しておくと便利かもしれません。もしかしたらそうではないのかもしれませんが、やり方は一つではないということで...

ベンチツールを実行する

実行するディレクトリ移動

cd isucon5-qualify/bench
jq '.[0]' < ../webapp/script/testsets/testsets.json | gradle run -Pargs="net.isucon.isucon5q.bench.scenario.Isucon5Qualification 127.0.0.1"

ローカル環境だとこんな感じ

{
  "valid" : true,
  "requests" : 914,
  "elapsed" : 67385,
  "done" : "[{Isucon5InitExecutor},{BootstrapChecker},{Isucon5Load,Isucon5Load,Isucon5Load,Isucon5Load,Isucon5Checker}]",
  "responses" : {
    "success" : 697,
    "redirect" : 216,
    "failure" : 1,
    "error" : 0,
    "exception" : 0
  },
  "violations" : [ ]
}

というわけで ISUCON5 の予選はソースコードを改修する作業が多くなると思いますので一度ローカルで作業内容を確認してから VM を起動するなどしたいときはこんな感じでできると思います。