ISUCONアプリをローカルで構築してみる
はじめに
VagrantでISUCONのアプリケーションをローカルに構築してみます。
パフォーマンスチューニングする環境を構築
下記のシステムパフォーマンス第2版を読んでる中で、実際に試してみる環境が欲しいと思い、ISUCONのアプリケーションを使ってみることにしました。
ISUCONのアプリケーション
ISUCON(Iikanjini Speed Up CONtest)は、Webアプリケーションのパフォーマンスチューニングコンテストで、過去の問題は下記のGithubで公開されています。
ISUCON
ISUCON has 35 repositories available. Follow their code on GitHub.
また、いくつか環境を再現する方法も公開されており、例えば下記のようにVagrantで構築するためのVagrantfileがあったりします。
GitHub - matsuu/vagrant-isucon: ISUCON過去問を構築するためのVagrantfile集
ISUCON過去問を構築するためのVagrantfile集. Contribute to matsuu/vagrant-isucon development by creating an account on GitHub.
Vagrantで構築
Vagrantで構築する場合の流れは下記の通りです。実装言語の切り替えとベンチマークの実行に関しては年によって異なるので、各年のマニュアルの参考にしてください。
- vagrant-isuconをclone
- VagrantでVM起動
1vagrant up
- VMにSSH
1vagrant ssh
- 実装言語の切り替え
- ベンチマークの実行
また、Vagrantで構築できるのは、下記のリポジトリにある年の問題になります。
GitHub - matsuu/vagrant-isucon: ISUCON過去問を構築するためのVagrantfile集
ISUCON過去問を構築するためのVagrantfile集. Contribute to matsuu/vagrant-isucon development by creating an account on GitHub.
ISUCON12予選問題を構築してみる
実際にISUCON12の予選問題をしてみます。
VMの構築
まずは、vagrant-isuconをcloneして、ISUCON12の予選問題のディレクトリに移動します。
1❯ git clone [email protected]:matsuu/vagrant-isucon.git
2
3❯ cd vagrant-isucon/isucon12-qualifier-standalone
vagrant up
で起動させます。
1❯ vagrant up
2Bringing machine 'default' up with 'virtualbox' provider...
3==> default: Importing base box 'generic/ubuntu2204'...
4==> default: Matching MAC address for NAT networking...
5==> default: Checking if box 'generic/ubuntu2204' version '4.2.16' is up to date...
6==> default: Setting the name of the VM: isucon12-qualifier-standalone_default_1686831099183_80289
7
8...
起動が完了したら、vagrant ssh
します。
1❯ vagrant ssh
2vagrant@ubuntu2204:~$
実装言語の切り替え
/etc/systemd/system/isuports.service
を編集して、アプリケーションの実装言語を切り替えます。
1vagrant@ubuntu2204:~$ sudo vim /etc/systemd/system/isuports.service
今回はデフォルトのGoからJavaに変えてみます。
1[Unit]
2Description=isucon12 qualify webapp
3After=network.target
4
5[Install]
6WantedBy=multi-user.target
7
8[Service]
9Type=simple
10User=isucon
11Group=isucon
12WorkingDirectory=/home/isucon/webapp
13ExecStart=docker compose -f docker-compose-java.yml up --build # 変更
14ExecStop=docker compose -f docker-compose-java.yml down # 変更
15Restart=always
isuports.service
を編集したら、、サービスを再起動します。
1vagrant@ubuntu2204:~$ sudo systemctl daemon-reload
2
3vagrant@ubuntu2204:~$ sudo systemctl restart isuports.service
ベンチマークの実行
下記でベンチマークを実行できます。
1vagrant@ubuntu2204:~$ sudo -i -u isucon
2isucon@ubuntu2204:~$ cd bench
3isucon@ubuntu2204:~/bench$ ./bench -target-addr 127.0.0.1:443
いきなり実行してみたら初期化に失敗したと出たので、データベースの初期化を実施しました。
1isucon@ubuntu2204:~/bench$ ./bench -target-addr 127.0.0.1:443
2[ADMIN] 12:38:08.605117 TargetURL: https://t.isucon.dev, TargetAddr: 127.0.0.1:443, RequestTimeout: 30s, InitializeRequestTimeout: 30s, StrictPrepare: true, ReproduceMode: false
3[ADMIN] 12:38:08.955425 POST /initialize 502 初期化
412:38:08.957228 error: 初期化 POST /initialize : expected([200]) != actual(502)
512:38:08.957672 初期化リクエストに失敗しました
1isucon@ubuntu2204:~$ ~isucon/webapp/sql/init.sh
以上で、パフォーマンスチューニングする準備の完了です。