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株式会社の商標または登録商標です。