JMeterで負荷試験をやって詰まったところ


本記事はJMeter環境構築のやり方や使い方を全て載せてるわけではないので、他の記事やページと合わせて参考程度に。

色々調べていてJMeterの環境構築のやり方とかJMeterの使い方は結構書いてあったのですが、詰まりやすい点とかがまとまって載ってるやつがあまりないなーと感じたので、詰まりそうなところや苦労したところを思い出しながら記事を書きます(備忘録)。

JMeterで負荷試験をやるときの大まかな流れ

そもそも負荷試験自体をやったことなく、JMeterも使用したことがなかったので何をどうすれば当初わかりませんでした。
なので、以下に大まかな流れをまとめてみます。

ローカルとサーバ(Master/Slaveサーバ全て)上にJMeterをDLする

Master/Slaveサーバ上(全台)で設定を行う

ローカル上でGUIでJMeterを起動してテスト計画ファイル(jmxファイル)を作成する

作成したテスト計画ファイルをMasterサーバに送信する

(データファイル(CSV等)をMaster/Slaveサーバ全てに送信する)

Slaveサーバ上でコマンドでJMeterを起動した状態にしておく

Masterサーバ上でコマンドでJMeterを起動して負荷試験を実行する

終わったらテスト結果ファイル(jtlファイル)をローカルに持ってきてGUIで見る

導入

4系はSSLの設定が面倒なのでJmeterバージョンは3.3が良いとのこと(要確認)

ローカル

以下のページからDLして、解凍します。配置場所は任意。
https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-3.3.tgz

Master/Slaveサーバ共通

gitとかでバージョン指定してDLしても良いが、私はローカルにtgzファイルをDLした後、scpで対象サーバに送信し、サーバ上で解凍しました。

ローカル上

scp apache-jmeter-3.3.tgz (対象サーバ):~

サーバ上

tar -xzvf apache-jmeter-3.3.tgz

サーバ上の設定

Slaveサーバの設定

# ipアドレスの設定
$ ifconfig | grep inet
$ sudo vim /opt/apache-jmeter-3.3/bin/jmeter-server
# RMI_HOST_DEF= に自ホストのipを記載する
RMI_HOST_DEF=-Djava.rmi.server.hostname=192.xxx.xxx.xxx

Masterサーバの設定

$ sudo vim /opt/apache-jmeter-3.3/bin/jmeter.properties
#リモートホストの設定 remote_hostsにスレーブのドメインを記載する。
remote_hosts=hogehoge.slave01.co.jp,hogehoge.slave02.co.jp

Master/Slaveサーバ共通

JVMオプション等の設定

以下の設定は必須ではないので、必要に応じて。
Windowsは「jmeter.bat」、Linuxは「jmeter.sh」に設定

set HEAP=-Xms512m -Xmx512m

サーバ上に置くファイル

scpでテスト計画ファイル(jmxファイル)やデータファイル(CSVファイル)を送信して配置するが、以下の点に注意。

・テストシナリオ(jmxファイル)は各サーバにコピーする必要はなく、Masterが全てのサーバに送信してくれる。
・テストシナリオが外部ファイル(CSV等)を参照する場合、MasterはSlaveにそのデータを送信しないので、各サーバに配布する必要がある。

つまり

・テスト計画ファイル(jmxファイル)はMasterサーバのみに送信して配置する
・外部ファイル(CSV等)は全サーバに送信して配置する

また、jmxファイルの設定でCSV Data Set ConfigのFilenameにフルパスで書くように注意。
(例:/opt/apache-jmeter-3.3/bin/hogehoge.csv)
https://qiita.com/takarin0711/items/a065b60d3374e00d3977

テスト計画ファイルの設定

RPSについて調べていたら以下のページがよく参照されていたので一応載せておきます

https://dev.classmethod.jp/server-side/jmeter-master-slave-settings-by-rps/

Delay Thread creation until needed

このオプションを付けると、スレッドが必要になったときに立てられるので、負荷をかける側の負担を軽くすることが可能になります
https://qiita.com/aidy91614/items/d96ca0261665abc54f7d

アサーションを設定

アサーション入れると、レスポンスの内容までチェックしてOKとするかNGとするか判定することが可能になります。
https://www.techscore.com/tech/Java/ApacheJakarta/JMeter/5/

負荷試験を実行

Slaveサーバ上でJMeterがうまく起動しない

以前動かしたときのプロセスが生きてないか確認

$ ps ax | grep jmeter

Materサーバ上でJMeterがうまく起動しない

・Slaveサーバ(全台)上でJMeterが起動しているかどうかチェック
・Masterサーバ上で正しく設定がされているかチェック
・Slaveサーバ上で正しく設定がされているかチェック

スループットが増えない

スレッド数を増やしてもスループットが増えないとき、以下を試してみると良いかもしれません。
・スレッド数を減らしてループを増やす
・Slaveサーバの台数を増やしてみる

負荷試験実行してみたがなんかうまくいかないなーと思ったら、以下のページも参考になると思います。
https://www.infiniteloop.co.jp/blog/2016/10/jmeter-stress-test/

最後に

負荷試験には正解がないので、何度失敗しても繰り返す根気と、常にこれで大丈夫か?という疑問を持って進めることが大事だと思います。これから負荷試験をやる人にとって参考になれば幸いです。