JMeterのMaster-Slave構成で目標スループットから負荷設定値を決める

2016.03.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

アプリケーションに対する負荷試験を行う場合には、あらかじめどの程度の負荷に耐えられるか(耐えて欲しいか)という目標値が設けられている場合があります。
この目標値を達成することを前提に、Apache JMeterのMaster-Slave構成を利用して負荷を掛けるための覚書です。

スループット目標値から負荷設定値を決定する

JMeterからかける負荷を決定する際に変数となるのは、主に下記の5項目です。

項目名 概要
目標リクエスト毎秒(RPS) 負荷試験の目標とするスループット値
スレーブ台数(Slaves) スレーブの台数
スレッド数(Threads) 各スレーブ毎に生成されるスレッドの総数
ループ回数(Loop) 各スレッド毎にシナリオが実行される回数
Ramp-Up期間(RampUp) 全てのスレッドを生成するまでの秒数(負荷をかける秒数)

目標リクエスト毎秒は 発行するリクエスト総数/総秒数 です。よって、JMeterのMaster-Slave構成の負荷試験においては、これらの変数の関連を次のように表現できます。

[latex] RPS = \frac{Slaves \cdot Threads \cdot Loop}{RampUp} [/latex]

このうち、目標リクエスト毎秒(RPS)は今回の前提で固定値になります。また、ほとんどのケースではスレーブ台数(Slaves)とRamp-Up期間(RampUp)があらかじめ決まっていると思います。 その場合には、未知数がスレッド数(Threads)とループ回数(Loop)のみになります。これらの値は次の式で表現できます。

[latex] Threads = RPS \cdot \frac{RampUp}{Slaves \cdot Loop} [/latex]

[latex] Loop = RPS \cdot \frac{RampUp}{Slaves \cdot Threads} [/latex]

このケースでは、ThreadsとLoopいずれかを定めれば全体の設定値を決定可能です。
普段私たちが使っている方法例として、ここでは Threads を先に決定する方法をご紹介します。

[latex] Threads \leq 800 \cdot Slaves [/latex]

Threadsの上限値を一つのJavaプロセスが効率的に処理できるスレッド数とします。ここでは800としていますが、より正確するためにはスレーブノードの性能やJVMオプションと相談して下さい。
この制約の上で取りうる最高の値をThreadsの値として設定します。ThreadsもLoopも整数値しかとれませんので、RPSを詳細に制御するためにはこの二値をフレキシブルに設定する必要があります。

例えばRPS・Slaves・RampUpが次の値を取る場合

名称
RPS 600
Slaves 6
RampUp 60

Threadsの最大値は4800です。

[latex] Threads \leq 4800 [/latex]

このThreadsが最大値を取る場合のLoopは次のとおりです。

[latex] Loop = 600 \cdot \frac{60}{6 \cdot 4800} = \frac{5}{4} [/latex]

Loopは正数しかとれません。なので切り上げして2として扱います。
そして、Loopを2とした場合のThreadsを再度算出します。

[latex] Threads = 600 \cdot \frac{60}{6 \cdot 2} = 3000 [/latex]

これによって、全ての設定値が求まりました。

名称
RPS 600
Slaves 6
RampUp 60
Threads 3000
Loop 2

まとめ

目標RPSは、実際に目指すRPSよりも少し高めに設定するとよい結果が得られることが多いです。
今回はJMeterのMaster-Slave構成による負荷テストにおける、負荷設定値を決定する方法の一例をご紹介しました。ではまた!