ISUCONアプリをローカルで構築してみる

2023.06.15
2024.03.24
パフォーマンスチューニング
GoISUCONJavaVagrant

本ページはAmazonアフィリエイトのリンクを含みます。

はじめに

VagrantでISUCONのアプリケーションをローカルに構築してみます。

パフォーマンスチューニングする環境を構築

下記のシステムパフォーマンス第2版を読んでる中で、実際に試してみる環境が欲しいと思い、ISUCONのアプリケーションを使ってみることにしました。

ISUCONのアプリケーション

ISUCON(Iikanjini Speed Up CONtest)は、Webアプリケーションのパフォーマンスチューニングコンテストで、過去の問題は下記のGithubで公開されています。

ISUCON

ISUCON

ISUCON has 35 repositories available. Follow their code on GitHub.

また、いくつか環境を再現する方法も公開されており、例えば下記のようにVagrantで構築するためのVagrantfileがあったりします。

GitHub - matsuu/vagrant-isucon: ISUCON過去問を構築するためのVagrantfile集

GitHub - matsuu/vagrant-isucon: ISUCON過去問を構築するためのVagrantfile集

ISUCON過去問を構築するためのVagrantfile集. Contribute to matsuu/vagrant-isucon development by creating an account on GitHub.

Vagrantで構築

Vagrantで構築する場合の流れは下記の通りです。実装言語の切り替えとベンチマークの実行に関しては年によって異なるので、各年のマニュアルの参考にしてください。

  1. vagrant-isuconをclone
  2. VagrantでVM起動
1vagrant up
  1. VMにSSH
1vagrant ssh
  1. 実装言語の切り替え
  2. ベンチマークの実行

また、Vagrantで構築できるのは、下記のリポジトリにある年の問題になります。

GitHub - matsuu/vagrant-isucon: ISUCON過去問を構築するためのVagrantfile集

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の予選問題のディレクトリに移動します。

1git clone [email protected]:matsuu/vagrant-isucon.git
2
3cd 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

以上で、パフォーマンスチューニングする準備の完了です。

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee