目的
この記事では、1つのコントローラーノードと、複数のワーカーノードを使って、1つのサービスに対してJMeterベースの負荷テストを実行する手順をまとめてあります。なお、本稿はAWS EC2でJMeterを実行しようで説明したEC2を使ったJMeterによる負荷テストを、分散ノードでの実行に拡張したものです。
JMeterによる分散テストの概要
JMeterで分散テストを実行する際は、WorkerとContorollerの2種類のノードを用意する必要があります。ContorollerノードでJMeterのテスト内容を設定・開始し、実際のリクエストはWorkerノードが実行します。
JMeterを使用した分散テストでは、コントローラーノードとすべてのワーカーノードが同じサブネット内にある必要があります(プロキシを使用しない限り)。
設定
ノードの準備
まずは、テストで使用するコントローラーノードとワーカーノードを準備します。前述のとおり、すべて同一のサブネット内に置いておく必要があります。今回は、AWS EC2で以下のようにノードを準備しました。
(余談)当初、t2.microで実行しようとしたところ、メモリ要件を満たさないとのことだったのでc5.xlargeを使用しています。メモリ要件については公式ドキュメントにも言及がなくやや謎です。
ワーカーノード構成の設定
テストに使用するワーカーノードの構成はコントローラーノードに配置するjmeter.propertiesファイル内で設定できます。使用するワーカーノードを指定するために、jmeter.properties内の
remote_hosts=127.0.0.1
と書いてある部分を、実際に使用するリモートホストのプライベートIPアドレスに書き換えます。例えばワーカーノードのIPアドレスが(192.168.0.3, 192.168.0.4)である場合は、
remote_hosts=192.168.0.3,192.168.0.4
のように、カンマ区切りで入力します。
テスト内容の設定(jmxファイルの作成)
JMeterのテスト内容はjmxファイルで設定します。GUIが使えるホストの場合、JMeterのGUIからjmxファイルを作成できます。GUI経由でのjmxファイルの作り方は
こちらに詳しく記載があります。
作成したjmxファイルは、コントローラーノードに配置します。コマンドラインから使用するjmxファイルのパスを指定できるため、コントローラーノード内のどこに配置しても大丈夫です。今回はローカルホストで作ったjmxファイルをscpでコントローラーノードに送信しました。
scp -i (秘密鍵) /path/to/jmx_file/jmx_file.jmx ubuntu@(IPアドレス):/home/ubuntu
コントローラーノードがUbuntuではない場合、ホスト名や配置先ディレクトリは適宜変更してください。
各ノードの設定
JMeterを実行するすべてのノードでJMeterがインストールされている必要があります。コントローラーノードとすべてのワーカーノードで以下のコマンドを実行します。
# aptのアップデート
$ sudo apt update
# JDKのインストール
$ sudo apt install openjdk-17-jre-headless
# JMeterプロジェクトの取得と解凍
$ wget https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.tgz
$ tar vxzf apache-jmeter-5.6.3.tgz
また、JMeterの分散テストでは、ノードごとの通信プロトコルにRMI(Remort Method Invocation)が使われるため、RMIのためのSSLを設定する必要があります。
cd jmeter/bin
./create-rmi-keystore.sh
(https://jmeter.apache.org/usermanual/remote-test.html#setup_ssl)
jmeter/bin/create-rim-keystore.shを実行すると、上記のように対話的に設定できます。
負荷テストの実行
ワーカーノードのサービス開始
まずは各ワーカーノードでJMeterサービスを開始します。以下のコマンドを使用する各ワーカーノード実行することでサービスが開始され、待機状態になります。
cd jmeter/bin
./jmeter-server
リクエストの開始
コントローラーノードからリクエストを開始します。以下のコマンドを実行すると、jmeter.propetiesで設定したリモートホストのそれぞれで、jmxファイルで指定したプロファイルのテストが実行されます。
cd jmeter/bin
# ログを記録しない場合
./jmeter -n -t /your/jmx_file_path/your_jmx_file.jmx -r
# ログを記録する場合
./jmeter -n -t /your/jmx_file_path/your_jmx_file.jmx -r -l /path/to/results.jtl
以下が実際に実行したときのコンソール画面です。
Contoroller: 172.31.34.117
Wokerer: 172.31.32.231, 172.31.38.73
という構成になっています。
JMeterの制限
JMeterは非常に優れた負荷テストツールですが、いくつか制限があります。
- すべてのノードが同じサブネット内にある必要がある
- 開始時刻を正確に設定することはできない
- ノードごとに異なるテストケースを設定できない(つまり、すべてのワーカーノードは同じjmxファイルに従ったテストを行うことになる)
- 各ノードはマニュアルで起動・設定しておく必要がある
- ノード間の通信がRMIなので、オーバーヘッドが比較的大きい
参考