ISUCON過去問題の環境を「さくらのクラウド」で構築する
はじめに
「さくらのクラウド」で過去のISUCONで出題された問題の環境を構築する方法を紹介します。ISUCONに参加する際の練習環境として、ISUCONの問題を利用してWebアプリケーションのパフォーマンスチューニングについて学ぶために利用できます。
本記事で紹介する環境構築には、 @matsuu さんが公開しております「ISUCON過去問環境を構築するためのcloud-config集」を使用しております。
https://github.com/matsuu/cloud-init-isucon
また、さくらのクラウドのcloud-init対応機能を使っています。
https://manual.sakura.ad.jp/cloud/server/cloud-init.html
cloud-initで構築可能なISUCON過去問題の環境
以下の環境が構築できます。
- ISUCON10 予選
- ISUCON11 予選
また、ISUCONの予選・本選の問題ではありませんが、以下の環境も作成できます。
この中から、ISUCON11 予選および、catatsuy/private-isu の環境構築方法を紹介します。
ISUCON11 予選問題の環境構築
今回は、さくらのクラウドのコントロールパネルより、仮想サーバを作成していきます。
まず、さくらのクラウドにログインするとホーム画面に移動します。ホーム画面より、「さくらのクラウド(IaaS)」を選択します。
次に左上の「サーバ」を選択します。一台も仮想サーバが作られていないときは次のような表示になります。
サーバを作成するので、右上の「追加」ボタンをクリックします。
作成するサーバのプラン選択
まずサーバのプランを選択します。今回は仮想コア数4、メモリ4GBのプランを選択しました。
ISUCONの環境を構築するためにはメモリ 2GB以上をお勧めします。CPUのコア数も多めの方が構築が早くおわります。プランはあとから変更が可能です。
ディスクの選択
cloud-initでサーバを設定するため、cloud-initに対応したイメージからサーバを作成します。
cloudimg と書かれた Ubuntu Server 20.04.2 LTS 64bit (cloudimg) を選択してください。(catatsuy/private-isu はソフトウェアが更新されたため、Ubuntu Server 22.04.02 LTS 64bit (cloudimg) を選択してください)
ディスクサイズは20GBあれば構築ができます。
ネットワークの設定
サーバはインターネットに接続できる環境に作成する必要があります。100Mbps(Outbound)の帯域でグローバルIPアドレスがついた共有セグメントを選択できます。
共有セグメントやネットワークについてはこちらのマニュアルから確認できます。
インターネットからアクセス可能な状態でサーバを起動すると、意図しないアクセスなどがくることがあります。必要に応じてパケットフィルタの設定をしてください。
サーバ、cloud-initの設定
次に、サーバに設置するSSHの公開鍵、ホスト名を設定します。SSHの公開鍵は GitHubに登録してある公開鍵を取得して自動で設定することも可能です。
追加ユーザデータに、matsuu/cloud-init-isucon の内容をコピーアンドペーストして設定します。
今回は、iscucon11予選の環境となるので、以下の設定を入力します。
https://github.com/matsuu/cloud-init-isucon/blob/main/isucon11q/isucon11q.cfg
サーバの作成と確認
あとは、名前等を入力して右下の「作成」ボタンをクリックします。
サーバの作成が開始されて、
仮想サーバ一覧に作成したサーバが表示されるようになります。
サーバが起動して、少し待つとSSHでログイン可能になります。
SSHは ubuntu ユーザを利用します。
$ ssh ubuntu@202.0.113.112
初回起動時は、cloud-initが実行されます。cloud-initの進行状況は /var/log/cloud-init-output.log
のファイルをみることで確認できます。
~$ tail -20 /var/log/cloud-init-output.log
contestant : roles/contestant/tasks/mariadb: Install Package ----------- 36.16s
langs.rust : roles/langs.rust/tasks/main: Install Rust ----------------- 26.60s
contestant : roles/contestant/tasks/nginx: Install package ------------- 23.44s
langs.rust : roles/langs.rust/tasks/main: Update to 1.54.0 ------------- 23.35s
bench : roles/bench/tasks/bench: Build Web Application Go -------------- 17.94s
contestant : roles/contestant/tasks/isucondition-ruby: Build Web Application ruby -- 17.18s
common : roles/common/tasks/package: Purge Package (snapd) ------------- 16.63s
contestant : roles/contestant/tasks/isucondition-nodejs: Build Web Application Node -- 16.04s
bench : roles//tasks/package: Install Package -------------------------- 15.67s
contestant : roles/contestant/tasks/isucondition-python: Build Web Application Python -- 14.09s
langs.nodejs : roles/langs.nodejs/tasks/main: Install Node.js v14.17.4 from xbuild -- 12.58s
contestant : roles/contestant/tasks/isucondition-go: Build Web Application Go -- 10.22s
langs.go : roles/langs.go/tasks/main: Install Go 1.16.5 from xbuild ----- 8.72s
Created symlink /etc/systemd/system/multi-user.target.wants/isucondition.go.service → /etc/systemd/system/isucondition.go.service.
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
Cloud-init v. 21.2-3-g899bfaa9-0ubuntu2~20.04.1 running 'modules:final' at Tue, 31 May 2022 07:33:58 +0000. Up 28.61 seconds.
Cloud-init v. 21.2-3-g899bfaa9-0ubuntu2~20.04.1 finished at Tue, 31 May 2022 08:08:00 +0000. Datasource DataSourceNoCloud [seed=/dev/fd0][dsmode=net]. Up 2070.21 seconds
35分弱でセットアップが完了しました。
ブラウザでも ISUCONDITION のページがみることができました。
ベンチマークの実行
SSH でサーバにログインし、isuconユーザに変更し、コマンドを実行します
ubuntu@isucon11q:~$ sudo su - isucon
isucon@isucon11q:~$ cd bench
isucon@isucon11q:~/bench$ ./bench -all-addresses 127.0.0.11 -target 127.0.0.11:443 -tls -jia-service-url http://127.0.0.1:4999
... 省略 ...
15:32:09.551284 score: 4794(4798 - 4) : pass
15:32:09.551290 deduction: 0 / timeout: 48
15:32:09.551307 <=== sendResult finish
catatsuy/private-isu による社内ISUCON環境の構築
ISUCON11予選と同様にcatatsuy/private-isuによる社内ISUCON環境を構築していきます。
さくらのクラウドのサーバ作成は、ISUCON11予選環境の構築と同様に行います。catatsuy/private-isuの場合、アプリケーションサーバとベンチマークを実行するサーバを分けて2台構築します。
推奨されるサーバプラン
- アプリケーションサーバ
仮想CPUコア 2コア メモリ 4GB - ベンチマークサーバ
仮想CPUコア 4コア メモリ 8GB
OSは同じく Ubuntu Server 20.04.2 LTS 64bit (cloudimg) を指定します。ディスクサイズは20GBあれば構築可能です。
cloud-initは matsuu/cloud-init-isucon の private-isu 以下に含まれるファイルを利用します。
アプリケーション用には app.cfg 、ベンチマークサーバには benchmarker.cfg を使います。
ネットワーク構成について
2台のサーバを共有セグメントに接続した場合のネットワークは次のようになります。
2台はそれぞれ100Mbps(Outbound)の帯域制限がついたネットワークにつながっています。アプリケーションのチューニングが進み、スコアが上がることでネットワークがボトルネックになることがあります。
そこで、仮想スイッチを一つ作成し、プライベートネットワークを接続することで、1Gbps以上の帯域を得ることができます。
詳しくはさくらのクラウドのネットワークのマニュアルを参照してください。
スイッチの作成と接続
まず、コントロールパネルから仮想スイッチを作成していきます。左側メニューの「ネットワーク」から「スイッチ」を選択します。
新規にスイッチを作るので、右上の「追加」ボタンをクリックします。
今回のスイッチはルータ機能やグローバルIPアドレスが必要ないので、ルータは「いいえ」を選択し、名前を入力し、右下の作成ボタンを押してスイッチを作成します。
次は、サーバにネットワークインターフェイスを追加します。サーバが起動状態ではネットワークインターフェイスを追加削除することはできないので、一度停止します。
サーバの一覧から、サーバ詳細画面に移動し、上部メニューより、シャットダウンを行います。(SSHでサーバに入りshutdownすることもできます)
サーバが停止したら、 NIC タブを開き、右下の追加ボタンを押します。
リストが更新され、ネットワークへの接続がされていないインターフェイスが追加されます。
このネットワークインターフェイスを先ほど作成した「isucon」スイッチへ接続するため、新しいネットワークインターフェイスの一番右の「▼」メニューから「接続を編集」を選択します。
編集画面が開くので、「NIC」を「スイッチに接続」を選択し、「スイッチに接続」として先程の「isucon」スイッチを選び、更新ボタンを押します。
スイッチへの接続後、サーバを起動します。
OS上のネットワーク設定
ubuntuでは、netplanを利用してネットワークの設定を行います。 sudo vim /etc/netplan/01-netcfg.yaml
にて eth1
の設定を行います。
ここでは、IPアドレスとして、 192.168.0.41
を指定しました。
network:
ethernets:
eth0:
addresses:
- 203.0.113.14/24
dhcp4: 'no'
dhcp6: 'no'
gateway4: 203.0.113.1
nameservers:
addresses:
- 203.0.113.10
- 203.0.113.11
search:
- localdomain
eth1:
addresses:
- 192.168.0.41/16
dhcp4: 'no'
dhcp6: 'no'
renderer: networkd
version: 2
編集が終わったら、netplan apply
で反映します。
~$ sudo netplan apply
アプリケーションサーバ、ベンチマークサーバの両方で設定してください。
ベンチマークの実行
ベンチマークサーバにSSHでログインし、ベンチマークのコマンドを実行します。
cd /home/isucon/private_isu.git/benchmarker
./bin/benchmarker -u ./userdata -t http://{競技用インスタンスのIPアドレス}/
これで、さくらのクラウドを利用してのISUCON過去問題の環境構築ができました。ISUCONに参加する際の練習環境として、ISUCONの問題を利用してWebアプリケーションのパフォーマンスチューニングについて学ぶためにご利用ください。
※「ISUCON」はLINE株式会社の商標または登録商標です。