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.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.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 を起動するなどしたいときはこんな感じでできると思います。