Skip to content

ISUCON7 予選問題の参照実装とベンチマーカー

License

Notifications You must be signed in to change notification settings

shigaichi/isucon7-qualify

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ISUCON7 予選問題

予選マニュアル

感想戦用、1VMでの動かし方

ディレクトリ構成

db      - データベーススキーマ等
bench   - ベンチマーカー、初期データ生成器
webapp  - 各種言語実装
files   - 各種設定ファイル

環境構築

Ubuntu 16.04 のものをなるべくデフォルトで使います。

まずは isucon ユーザーを作り、そのホームディレクトリ配下の isubata ディレクトリに リポジトリをチェックアウトします。

$ sudo apt install git
$ git clone https://github.com/isucon/isucon7-qualify.git isubata

nginx と MySQL は Ubuntu の標準のものを使います。

$ sudo apt install mysql-server nginx

各言語は xbuild で最新安定版をインストールします。まず xbuild が必要とするライブラリをインストールします。

$ sudo apt install -y git curl libreadline-dev pkg-config autoconf automake build-essential libmysqlclient-dev \
	libssl-dev python3 python3-dev python3-venv openjdk-8-jdk-headless libxml2-dev libcurl4-openssl-dev \
        libxslt1-dev re2c bison libbz2-dev libreadline-dev libssl-dev gettext libgettextpo-dev libicu-dev \
	libmhash-dev libmcrypt-dev libgd-dev libtidy-dev

xbuildで言語をインストールします。ベンチマーカーのために、Goは必ずインストールしてください。 他の言語は使わないのであればスキップしても問題ないと思います。

cd
git clone https://github.com/tagomoris/xbuild.git

mkdir local
xbuild/ruby-install   -f 2.4.2   /home/isucon/local/ruby
xbuild/perl-install   -f 5.26.1  /home/isucon/local/perl
xbuild/node-install   -f v6.11.4 /home/isucon/local/node
xbuild/go-install     -f 1.9     /home/isucon/local/go
xbuild/python-install -f 3.6.2   /home/isucon/local/python
xbuild/php-install    -f 7.1.9   /home/isucon/local/php -- --disable-phar --with-pcre-regex --with-zlib --enable-fpm --enable-pdo --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl --with-pcre-regex --with-pcre-dir --with-libxml-dir --enable-opcache --enable-bcmath --with-bz2 --enable-calendar --enable-cli --enable-shmop --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-mbregex --enable-mbstring --with-mcrypt --enable-pcntl --enable-sockets --with-curl --enable-zip --with-pearAA

ベンチマーカーの準備

Goを使うのでこれだけは最初に環境変数を設定しておく

export PATH=$HOME/local/go/bin:$HOME/go/bin:$PATH

ビルド

go get github.com/constabulary/gb/...   # 初回のみ
cd ~/isubata/bench
gb vendor restore
make

初期データ生成

cd ~/isubata/bench
./bin/gen-initial-dataset   #isucon7q-initial-dataset.sql.gz ができる

データベース初期化

データベース初期化、アプリが動くのに最低限必要なデータ投入

$ sudo ./db/init.sh
$ sudo mysql
mysql> CREATE USER isucon@'%' IDENTIFIED BY 'isucon';
mysql> GRANT ALL on *.* TO isucon@'%';
mysql> CREATE USER isucon@'localhost' IDENTIFIED BY 'isucon';
mysql> GRANT ALL on *.* TO isucon@'localhost';

初期データ投入

zcat ~/isubata/bench/isucon7q-initial-dataset.sql.gz | sudo mysql isubata

デフォルトだとTCPが127.0.0.1しかbindしてないので、複数台構成に対応するには /etc/mysql/mysql.conf.d/mysqld.cnfbind-address = 127.0.0.1 になっている 場所を bind-address = 0.0.0.0 に書き換える。

nginx

$ sudo cp ~/isubata/files/app/nginx.* /etc/nginx/sites-available
$ cd /etc/nginx/sites-enabled
$ sudo unlink default
$ sudo ln -s ../sites-available/nginx.conf  # php の場合は nginx.php.conf
$ sudo systemctl restart nginx

参考実装(python)を動かす

初回のみ

$ cd ~/isubata/webapp/python
$ ./setup.sh

起動

export ISUBATA_DB_HOST=127.0.0.1
export ISUBATA_DB_USER=isucon
export ISUBATA_DB_PASSWORD=isucon
./venv/bin/gunicorn --workers=10 -b '127.0.0.1:5000' app:app

予選本番では、 /etc/hosts に各ホスト名を書いて、環境変数は systemd から env.sh ファイルを読み込んでいました。 この辺は適当に使いやすいように設定してください。

ベンチマーク実行

$ cd bench
$ ./bin/bench -h # ヘルプ確認
$ ./bin/bench -remotes=127.0.0.1 -output result.json
$ # or
$ ./bin/bench -remotes=127.0.0.1 -output ~/(date "+%Y%m%d-%H%M%S").json

結果を見るには sudo apt install jq で jq をインストールしてから、

$ jq . < result.json

備考

systemd に置く設定ファイルなどは files/ ディレクトリから探してください。

使用データの取得元

実行方法修正後メモ

AWS EC2で練習するに当たり、実行方法を変更した。

実際の予選時は

1コア、1GBメモリ、20GBディスク

だったらしいが、これに近いスペックのインスタンスはなく、また、あまりに小さいインスタンスでは起動できなかった。c5.largeなら起動できた。

アプリケーション起動方法

再現用AMIにはgoが入っていないためインストールする。ドキュメントに従い、次のコマンドをrootで実行

wget https://go.dev/dl/go1.22.4.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.4.linux-amd64.tar.gz

次の行を.profileに追加する

PATH=$PATH:/usr/local/go/bin

これでgoが実行できるので、アプリケーションをビルドする

cd ~/isubata/webapp/go/src/isubata
make

statusで編集するべきファイルがわかるので、それを編集する

sudo systemctl status isubata.golang.service

その後起動アプリケーションをGoに変える

sudo systemctl stop    isubata.python.service
sudo systemctl disable isubata.python.service
sudo systemctl start  isubata.golang.service
sudo systemctl enable isubata.golang.service

ベンチマーク実行方法

sudo -i -u isucon
cd isubata/bench
bin/bench -remotes=127.0.0.1 -output $(date '+%Y%m%d_%H%M%S').json

About

ISUCON7 予選問題の参照実装とベンチマーカー

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 52.6%
  • HTML 12.8%
  • JavaScript 7.2%
  • PHP 6.5%
  • Perl 5.5%
  • Python 5.1%
  • Other 10.3%