Apache JMeterはWebシステム等のシナリオ試験、性能試験、負荷試験等で広く使用されている。テスト結果からレポート・ダッシュボードを生成することもでき、結果報告書等にも利用できる。
標準で出力されるグラフは1分単位で詳細が把握できないため、グラフの粒度(granularity)を変更して詳細を確認できるようにする。
機能概要についてはドキュメントの通り。
テスト実行からダッシュボード・レポート生成
Apache JMeterのインストール方法は割愛する。今回の試験環境はMacでオフィシャルからtgzをダウンロードし解凍したものを使用している。(brew install jmeter
ではなく)
テスト対象はシンプルなWeb+APサーバで、PHPでやや負荷がかかるようにしている。
テストケース
今回は単純にスループット(TPS)を増加させていったときの遅延の増加を測定する。
スループットの調整方法は各種紹介されているが、今回はループ回数無制限で一定時間実行するようにし、また各ループの間に1秒の定数タイマーを設定し、スレッド数≒リクエスト/秒となるようにする。限界測定の観点では上限は十分に多ければ問題なく、明確なターゲットスループットがある場合は定数スループットタイマーを使用した方が良い。
JMXファイルは以下の通り。
<?xml version="1.0" encoding="UTF-8"?> <jmeterTestPlan version="1.2" properties="5.0" jmeter="5.0 r1840935"> <hashTree> <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Simple Latency" enabled="true"> <stringProp name="TestPlan.comments"></stringProp> <boolProp name="TestPlan.functional_mode">false</boolProp> <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp> <boolProp name="TestPlan.serialize_threadgroups">false</boolProp> <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="ユーザー定義変数" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="TestPlan.user_define_classpath"></stringProp> </TestPlan> <hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true"> <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="ループコントローラ" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <intProp name="LoopController.loops">-1</intProp> </elementProp> <stringProp name="ThreadGroup.num_threads">100</stringProp> <stringProp name="ThreadGroup.ramp_time">180</stringProp> <boolProp name="ThreadGroup.scheduler">true</boolProp> <stringProp name="ThreadGroup.duration">300</stringProp> <stringProp name="ThreadGroup.delay"></stringProp> </ThreadGroup> <hashTree> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="HTTPSampler.domain">hello.designet.local</stringProp> <stringProp name="HTTPSampler.port"></stringProp> <stringProp name="HTTPSampler.protocol">http</stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path"></stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> <stringProp name="HTTPSampler.connect_timeout">1000</stringProp> <stringProp name="HTTPSampler.response_timeout">1000</stringProp> </HTTPSamplerProxy> <hashTree/> <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true"> <stringProp name="ConstantTimer.delay">1000</stringProp> </ConstantTimer> <hashTree/> </hashTree> </hashTree> </hashTree> </jmeterTestPlan>
テスト実行・レポート生成
ダッシュボード・レポートを生成するためには、GUIではなく、CLIからJMeterを実行する必要がある。
$ apache-jmeter-5.0/bin/jmeter -n -t Simple-latency.jmx -l log.jtl
ダッシュボード・レポートを生成する。
$ apache-jmeter-5.0/bin/jmeter -g log.jtl -o dashboard
ダッシュボードを参照する。
$ open dashboard/index.html
グラフの粒度(granularity)を変更する
デフォルトだと、レポートで生成されるグラフは以下のように、1分間隔となっている。Over Time > Active Threads Over Time
を例とする。
一見すると、時間の経過(スレッド数・TPSの増加)に伴い遅延(Latency)が単純増加するように見えるが、これは1分間隔で丸められていることによる誤差である。
グラフの粒度を10秒間隔に変更して再度ダッシュボードを生成する。粒度はJMeterのuser.properties
でjmeter.reportgenerator.overall_granularity
を変更することによる調整できる。
$ vi apache-jmeter-5.0/bin/user.properties --- #jmeter.reportgenerator.overall_granularity=60000 ↓ jmeter.reportgenerator.overall_granularity=10000
パラメータ変更後は改めてダッシュボードを生成する。log.jtl
はそのままでOK。集計時点でパラメータが適用される。
$ apache-jmeter-5.0/bin/jmeter -g log.jtl -o dashboard_10s
グラフの粒度・分解能が上がって細かくなり、Over Time > Active Threads Over Time
と並べるとどこから遅延が大きくなってくるかが分かる。スケールも変わっている。
調整可能なパラメータはこちらの通り。
https://jmeter.apache.org/usermanual/generating-dashboard.html
まとめ - JMeter Dashboard Report グラフの粒度を変更する
JMeterのuser.properties
でjmeter.reportgenerator.overall_granularity
を変更することによって、Dashboard Report グラフの粒度を変更できた。
$ vi apache-jmeter-5.0/bin/user.properties --- #jmeter.reportgenerator.overall_granularity=60000 ↓ jmeter.reportgenerator.overall_granularity=10000