JMeterを利用した負荷テストで役立った機能

# 概要
JMeterを利用してシステムの性能検証を実施する機会があったので、検証に役立った機能をまとめました。  

今回の検証ではApache JMeter 5.6.3を利用しています。  
JMeterのインストール方法については、公式サイトからダウンロードしたファイルを展開するだけのため割愛します。
https://jmeter.apache.org/download_jmeter.cgi

# 利用機能

## ① Ultimate Thread Group
JMeterのノーマルなThread Groupでは、負荷を調整するために以下のようなパラメータがあります。
- スレッド数：起動するスレッドの数
- Ramp-Up 期間（秒）：指定スレッド数に到達するまでの助走期間（秒）
- ループ回数：各スレッド毎のループ回数（無限ループ設定も有り）
- 持続時間（秒）：無限ループ設定時のループ持続時間（秒）
- 起動遅延（秒）：テスト実行～スレッド起動までの時間（秒）

![jmeter_001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/d45c4bae-a201-ac3b-80d3-29494ae802ef.jpeg)

ノーマルなThread Groupは一定の負荷で電文を送信することには適していますが、テスト中に負荷を変化させることは難しいです。  
そのため、時間経過とともに負荷を増減するようなテストシナリオを作成したい場合、Ultimate Thread Groupを利用します。  
Ultimate Thread Groupの場合、Threads Scheduleを設定してテスト実行中に起動するスレッド数を調整します。
- Start Threads Count：起動するスレッドの数
- Initial Delay,sec：テスト実行～スレッド起動までの時間（秒）
- Startup Time,sec：指定スレッド数に到達するまでの助走期間（秒）
- Hold Load For,sec：指定スレッド数でのループ持続時間（秒）
- Shutdown Time：ループ終了後、起動したスレッドを全て停止するまでの時間（秒）

![jmeter_002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/b712e2e1-9e16-6e0b-689d-498ae257f5b7.jpeg)

### 利用方法
Ultimate Thread GroupはJMeterのデフォルト機能ではないため、プラグインの追加が必要です。  
以下のサイトからjmeter-plugins-casutg-X.XX.jarをダウンロードし、JMeterを展開したディレクトリのlib/ext配下に配置します。  
https://jmeter-plugins.org/wiki/UltimateThreadGroup/

追加ファイルの読込のため、JMeterを再起動します。
再起動後、テスト計画を選択してコンテキストメニューから ```追加``` ＞ ```Threads(Users)``` を選択すると、```jp@gc - Ultimate Thread Group```が追加されていることが確認できます。

![jmeter_003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/8b0f22a3-8a63-0ff0-5998-c019eadaf54f.jpeg)

## ② 定数スループットタイマ
定数スループットタイマは、スレッド毎の単位時間あたりのリクエスト実行回数を制御します。  
タイマを利用しない場合、各スレッドの実行処理によっては負荷の偏りが出来てしまいます。  
一定間隔で負荷を掛ける場合、定数スループットタイマを利用します。  

### 利用方法
対象スレッドグループを選択してコンテキストメニューから ```追加``` ＞ ```タイマ``` ＞ ```定数スループットタイマ``` を選択します。

![jmeter_004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/8454e5bb-6ca3-33be-040a-ae001e5d1eff.jpeg)

定数スループットタイマの主な設定は以下の２つです。
- ターゲットスループット（サンプル数/分）：1分間あたりのリクエスト実行数
- Calculate Throughput based on：設定の適用範囲

![jmeter_005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/326f9ada-cdd7-b43e-3c6b-398c06df5dcb.jpeg)

例えばターゲットスループットを60と設定した場合、起動したスレッドは1分あたり60回のリクエストを一定間隔で実行することになります。  
１スレッド１TPS（TransactionPerSecond）となるため、スレッド数で負荷の調整がしやすくなります。

## ③ レポート出力
JMeterを利用してテストを行う場合、数電文程度の動作確認であればGUIからの実行でも問題ありませんが、  
数百～数千TPSといった高負荷なテストを実施する場合は基本的にCUIで行います。GUIがボトルネックとなって正確な性能が測定できない可能性があるためです。  
コマンドラインからJMeterを実行する際、結果を確認するのに便利なのがレポート出力オプションです。  

### 利用方法
レポートを出力するには、JMeter実行時に```e```オプションおよび```o```オプションを指定します。
```JMeter実行コマンド例
jmeter -n -t ./testPlan.jmx -l ./testLog.jtl -e -o testReport
```
テスト終了後、```o```オプションで指定したディレクトリ配下にレポートファイルを出力します。

![jmeter_006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/1ccf34ed-f753-7532-e3e9-a09f647611f2.jpeg)

レポートのデータ粒度はデフォルトでは1分のため、必要に応じてJMeterの設定ファイル```user.properties```のパラメータ```jmeter.reportgenerator.overall_granularity```をテスト実行前に変更してください。
```user.properties設定例
76c76
< jmeter.reportgenerator.overall_granularity=1000
---
> #jmeter.reportgenerator.overall_granularity=60000
```
出力されたレポートにはテスト実行結果サマリのほか、実行中の平均レスポンス時間やアクティブスレッド数などのグラフが含まれます。

![jmeter_007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/cbef8abb-746c-edb3-f2eb-65ce87bb5237.jpeg)
![jmeter_008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/ab507f49-8d9c-3a60-a5e4-ed6f51da2a39.jpeg)
![jmeter_009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/42ab5a22-eeae-b52e-1382-e436413d345c.jpeg)

# 参考
https://engineers.fenrir-inc.com/entry/2022/03/08/115602
https://qiita.com/tatesuke/items/827e6190753964e46814
https://designetwork.daichi703n.com/entry/2019/02/03/jmeter-graph-granularity