はじめに
JMeterの複数VMを利用してClient、そして複数のServerを利用する際の設定についてまとめています。
ぐぐってもトップにヒットする情報(※)ではまともに動かなかった人(自分)向けです。
※Dockerを使った例では、ほとんどが1ホスト内で動かすものです。複数のサーバーを使った場合にハマりやすいです。
結論
Serverの実行
sudo docker run -it --rm \
-p20000:20000 \
justb4/jmeter:latest \
-s -n -j /dev/stdout \
-Dserver_port=20000 -Dserver.rmi.localport=20000 \
-Dserver.rmi.ssl.disable=true \
-Djava.rmi.server.hostname=$(host $(hostname)| awk '{print $4}') \
-Jmode=Statistical
-
server_port
,server.rmi.localport
で使うポートを指定して、-p20000:20000
でポートを空ける。 -
server.rmi.ssl.disable=true
はSSLは利用しないので、無効化。 -
java.rmi.server.hostname
ではClientからはホストのIPでつけつけるので、ホストのIPを$(host $(hostname)| awk '{print $4}')
で埋め込み。 - Cleint<->Server間の通信が多い(数千qps以上)ので、Statisticalで通信量削減します。
Clientの起動
sudo docker run -it --rm \
-v $(pwd):/script -p20001:20001 -p20002:20002 -p20003:20003 \
justb4/jmeter:latest \
-Dserver.rmi.ssl.disable=true \
-Djava.rmi.server.hostname=$(host $(hostname)| awk '{print $4}') \
-Dclient.rmi.localport=20001 \
-Jremote_hosts=server-1:20000,server-2:20000,.... -Jmode=Statistical \
-t /script/1.jmx -n -l /script/test.jtl -e -r -X
-
client.rmi.localport=20001
でポート番号を固定化。最大3つ使われるので、-p20001:20001 -p20002:20002 -p20003:20003
でポートを空ける。 -
server.rmi.ssl.disable=true
はSSLは利用しないので、無効化。 -
java.rmi.server.hostname
ではClientからはホストのIPでつけつけるので、ホストのIPを$(host $(hostname)| awk '{print $4}')
で埋め込み。 -
remote_hosts
でリモートサーバー指定。 -
-t
でスクリプトファイル、-l
で結果ファイルを指定します。
ハマりどころ
Server -> Clientにデータ送信時にエラーが発生する
2020-12-21 12:04:39,730 ERROR o.a.j.t.RemoteThreadsListenerWrapper: Exception invoking listener on threadStarted.
java.rmi.ConnectException: Connection refused to host: xxx.xxx.xxx.xxx; nested exception is:
java.net.ConnectException: Connection refused (Connection refused)
At the moment JMeter will open up to three ports beginning with the port defined in client.rmi.localport. If there are any firewalls or other network filters between JMeter client and server, you will need to make sure that they are set up to allow the connections through.
https://jmeter.apache.org/usermanual/remote-test.html#tips
client.rmi.localport
を使ってポート番号固定化することは多々あると思います。
ただ、使われるポートは、3つのポートが最大使われます。 (この例だと20001~20003 )
これがあまり書かれている記事がなくてハマります…。
動機
どうしてJMeter+Dockerで動かそうとしたのかという話です。
弊社でもJMeter,Gatling,WRK,Vegentaなど色々なストレスツールを使っています。
古いものだと、JMeterでストレステスト用のシナリオが存在します。
Gatlingなど、別のツールでまた書くのがめんどくさい。でも、JMeterの実行環境がそもそも存在しない。そしてとある事情により、サーバーは別部署が担当しており、Javaのインストールを依頼するのがめんどくさい。
Dockerでサクっと動かしたいというのが動機です。
「あれ?これ前もやってはまったな・・・」
となったので自分のためにも記録しておきました。