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

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

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

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

ローカルとサーバ(Master/Slaveサーバ全て)上にJMeterをDLする
↓
Master/Slaveサーバ上(全台)で設定を行う
↓
ローカル上でGUIでJMeterを起動してテスト計画ファイル(jmxファイル)を作成する
↓
作成したテスト計画ファイルをMasterサーバに送信する
↓
(データファイル(CSV等)をMaster/Slaveサーバ全てに送信する)
↓
Slaveサーバ上でコマンドでJMeterを起動した状態にしておく
↓
Masterサーバ上でコマンドでJMeterを起動して負荷試験を実行する
↓
終わったらテスト結果ファイル(jtlファイル)をローカルに持ってきてGUIで見る

<img width="991" alt="スクリーンショット 2019-05-29 16.41.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202810/4219b496-4fd1-6ca0-8464-39fb831fde7e.png">


# 導入
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オプション等の設定
以下の設定は必須ではないので、必要に応じて。
<b>Windowsは「jmeter.bat」、Linuxは「jmeter.sh」に設定</b>

```
set HEAP=-Xms512m -Xmx512m
```

# サーバ上に置くファイル
scpでテスト計画ファイル(jmxファイル)やデータファイル(CSVファイル)を送信して配置するが、以下の点に注意。
> ・テストシナリオ（jmxファイル）は各サーバにコピーする必要はなく、Masterが全てのサーバに送信してくれる。
> ・テストシナリオが外部ファイル（CSV等）を参照する場合、MasterはSlaveにそのデータを送信しないので、各サーバに配布する必要がある。

つまり

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

また、jmxファイルの設定でCSV Data Set ConfigのFilenameに<b>フルパス</b>で書くように注意。
(例：/opt/apache-jmeter-3.3/bin/hogehoge.csv)

(参考)
https://blog.pepese.com/category/JMeter
https://qiita.com/yoshi10321/items/a674ad9b4fbaadc52f38

# テスト計画ファイルの設定
RPSについて調べていたら以下のページがよく参照されていたので一応載せておきます
<img width="400" alt="rps.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202810/7949dd9b-672a-a232-1e34-d0d460c23596.png">
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/

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