あいつの日誌β

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

ISCON5 予選を自習したい

あらすじ

エントリーしたんですが所用により参加できませんでした。 というわけで自習をしたいと思いましたがベンチマークの動かし方でちょっと迷ったのでメモしておきます。

動作環境

% sw_vers
ProductName:    Mac OS X
ProductVersion: 10.10.5
BuildVersion:   14F27

% java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

% ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]

% mysql --versiond
mysql  Ver 14.14 Distrib 5.6.20, for osx10.9 (x86_64) using  EditLine wrapper

環境構築

https://gist.github.com/tagomoris/1a2df5ab0999f5e64cff

以下のようなコマンドでインスタンス内にログインできることを確認します。パラメータは適宜置き換えて下さい。

% gcloud compute --project isucon5-xxxx ssh --zone asia-east1-a instance-1

すでにアカウント持っていて GCP 使ったことある人なら5分程度でここまで作業終わると思います。

あとは外部公開されている IP をブラウザで開いて画面が表示されれば OK です。

ベンチマーク

どうやらベンチマークは以下の操作で実行できそうです。

isucon5/bench

macosx 上で java8 をインストールする方法は割愛します。 よくわからない方はこの辺りを参考にして下さい。

http://qiita.com/vicugna/items/99ed473751cfb808e860

以下の操作が問題なく実行できればOKです。

% git clone https://github.com/isucon/isucon5-qualify.git
% cd isucon5-qualify/bench
% gradle compileJava
% gradle run
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:run
reading stdin
> Building 75% > :run

この状態は java プログラムが標準入力を待ち受けています。これは bench/agent.rb で使用されます。これは動作確認ですので Ctrl-C でこのプログラムを終了してください。

次に bench/agent.rb を起動します。まずは必要な ruby モジュールを install します。

% cd isucon5-qualify
% bundle install --path vendor/bundle --binstubs=vendor/bundle/bin

bench/agnet.rb を実行します。

% bundle exec ruby agent.rb

ただし、このプログラムには MySQL の接続先が ISUCON5 用にハードコーディングされています。ローカルの MySQL を使用するために以下のように修正します。

-MANAGER_ADDRESS = "104.155.221.244"
-MANAGER_USER = "portalsan"
-MANAGER_PASSWORD = "tony-morris"
+MANAGER_ADDRESS = "localhost"
+MANAGER_USER = "root"
+MANAGER_PASSWORD = ""

mysql に root でパスワード無しで入れる方はこれを参考にしてください。そうでない方は適宜変更をお願いします。

isucon5/eventapp

次にベンチマークを実行するポータルサイトを起動させます。こちらも設定がハードコーディングされている箇所があるので修正する必要があります。

先ずは DB を作成

% cd isucon5/eventapp
% mysql -u root < sql/schema.sql

その DB に team, testset 格納します。teams.tsv を作成し、DB にセットします。 DB の接続先は team_load.rb に記述されていますので、必要な方は適宜変更してください。

% echo "'isucon-team'\t'isucon-password'\t'your@email.account'\t1" > teams.tsv
% bundle exec ruby team_load.rb teams.tsv testsets.json  

次に pid の置き場所を作成します。

% cd isucon5/eventapp
% mkdir -p /tmp/isucon/isucon5-qualify/eventapp
% sed -i -e 's/home/tmp/g' unicorn_config.rb

この web アプリは現在時刻から isucon 開催期間内でないとサービスに制限がかかりますのでそれを解除します。

diff --git a/eventapp/app.rb b/eventapp/app.rb
index a95ccf1..1f087f5 100644
--- a/eventapp/app.rb
+++ b/eventapp/app.rb
@@ -80,21 +80,11 @@ class Isucon5Portal::WebApp < Sinatra::Base
     end
 
     def in_game?(team)
-      now = Time.now
-      case team[:round]
-      when 1 then SATURDAY_GAMETIME.first < now && now < SATURDAY_GAMETIME.last
-      when 2 then SUNDAY_GAMETIME.first < now && now < SUNDAY_GAMETIME.last
-      when 0 then true
-      end
+      return true
     end
 
     def active_team?(team)
-      now = Time.now
-      case team[:round]
-      when 1 then SATURDAY.first < now && now < SATURDAY.last
-      when 2 then SUNDAY.first < now && now < SUNDAY.last
-      when 0 then true
-      end
+      return true
     end

web アプリを起動します。

% bundle exec unicorn -c ./unicorn_config.rb

最後にこの Web アプリでベンチマーク実行のキューを監視するワーカーを起動させます。

% bundle exec ruby update_scores.rb

動作を確認する

ブラウザでポータルサイトを開き、必要な設定を終えたら Request benchmark を submit すれば動作するはずです。デフォルトだとスコアが 75 とかになると思います。