JMeter 負荷レベルの設定と具体的な動作イメージ
JMeterで負荷テストを実施するにあたり、指標を定めた後は、実現するための設定を考える必要があります。
例えば、
特定のページに対して、分間600アクセス耐えられるかどうか調べたい
という場合、どのような負荷を実現させれば良いかを考えてみてください。
その場合は、以下の図1のように1秒に10アクセスづつさせても良いですし、図2のように10秒に60アクセスづつさせても良いかと思います。
どちらの動きでも実現は可能ですが、その設定はどうやってやれば良いのでしょうか。
答えは負荷レベルの調整です。
そもそも「負荷レベルって何?」という方もいると思うので、本日はJMeterの負荷レベルの設定と、その具体的な動作イメージ(いつ、どのくらいの時間間隔で、処理されるのか)について、考え方と合わせて紹介したいと思います。
設定名の確認
JMeterの動作は、負荷レベルの設定次第で変化します。
ただ、具体的な話を進めていく前に、負荷レベルの設定に必要な設定名がわかりづらいので、まずはそちらの説明からしていきます。
最低限、理解しなければならないのは負荷レベルを調整する「スレッド数」、「Ramp-Up期間」、「ループ回数」という3つの設定と、総アクセス数(総リクエスト数)の算出方法になります。
それぞれが何を指しているのかについて見ていきましょう。
スレッド数
JMeterが生成するクライアント数のことです。
アクセスするユーザの数 = スレッド数 とイメージしてもらえば良いです。
Ramp-Up期間
設定したスレッド数に対して、それを何秒以内に処理するかを指定します。
指定したスレッド数を生成する時間(秒)で、全てのスレッドが起動するまでの時間(秒)を指定します。
なお、0を指定すると、スレッド数を同時に実行します。
ループ回数
ループ回数は、1スレッド(1ユーザ)が1つのテストケースを何回繰り返すか設定できます。各スレッド(ユーザ)が実行シナリオを指定した回数分繰り返して実行してくれます。
また、無限ループを設定することも出来ます。
総アクセス数(総リクエスト数)
負荷レベルを説明する上で、忘れていけないのは、総アクセス数です。
JMeterは、Ramp-Upで指定した時間内に、スレッド数に対して、ループ回数分のアクセスが発生します。
つまり、
総アクセス数 = スレッド数 × ループ回数
となります。
設定名については、知っているかどうかだけの問題なので、ここまでは大丈夫かと思います。
以下、簡単な実施例と合わせて具体的な設定の説明に参りたいと思います。
簡単な設定例とその実行イメージ
例えば、600ユーザが、60秒間にアクセスするという負荷テストを実施する場合、
- スレッド数:600
- Ramp-Up期間:60
- ループ回数:1
とすれば設定は完了です。
次に、この例においてJMeterが実際にどういう動きをするのかを説明します。
言葉にすると、
Ramp-Up期間を、スレッド数で均等に割った時間でアクセス
となります。
つまり、「Ramp-Up期間:60」を「スレッド数:600」で割ると 0.1秒/スレッド なので、0.1秒に1ユーザがアクセスするという動きになります。
理解しやすくするために、時間の単位を秒にすると、
100ミリ秒に1ユーザのアクセス = 1秒に10ユーザのアクセス
となります。
実際に、Jmeterを動かしてみた結果をキャプチャしておきました。
100ミリ秒で1アクセス(1秒に10アクセス)されていることが確認できると思います。
なお、Ramp-Up期間をスレッド数で割った数が1秒以上になる場合、例えば
- スレッド数:6
- Ramp-Up期間:60
- ループ回数:1
という設定であれば、「Ramp-Up:60」を「スレッド数:6」で割ると 10秒/スレッド なので、10秒に1アクセスすることになります。
こちらの実行結果もキャプチャしておきます。
ここまでの例は、ループ回数を1としているのでイメージしやすいかと思います。
次にループ回数を2以上で設定した場合のアクセスのイメージについて説明します。
ループ回数を調整した負荷レベルの設定
ループ回数は先ほどの説明のとおり、設定したスレッド数をRamp-Up期間内に何回繰り返させるか、の指定になります。
説明しやすくするために、先ほどの「特定のページに対して、分間600アクセス」に、
ユーザは100人とする
という条件を加えた例で話を進めていきます。
まずは条件を設定に落とし込みましょう。
「スレッド数 = ユーザ数」なのでスレッドは100です。総アクセス数は、スレッド数 × ループ回数なので、逆算すると、ループ回数は6になります。
まとめると、
- スレッド数:100
- Ramp-Up期間:60
- ループ回数:6
こうなりますね。
実行結果もキャプチャしておきます。
なお、100スレッドが6回繰り返されているかどうかの確認方法についても触れておきます。
Thread Name名称の末尾に「100人が60秒に6回 1-XX」という番号が振られていますが、これはスレッド(ユーザ)に対してユニークで振られている番号です(上記キャプチャの青枠)
今回の例では、1-1~1-100という100スレッドが存在し、それぞれループ回数分の6回処理がなされています。
では、JMeterの動作について確認してみましょう。
実行結果のキャプチャのThread Nameの末尾の番号を見るとわかりますが、1スレッドが6回ループがされる前に次のスレッドが実行されています。
ここでは、1-50の6回の処理開始がいつなのかを調べてみました。
このとおり、27秒で1処理、28秒で3処理、29秒で2処理されています。
さらに28秒台の1-50以外のスレッドは、1-48が2スレッド、1-49が3スレッド、1-51が2スレッド。(合計10スレッド)
なぜ、このようなバラつきがあるかというと、ループ回数を1以上にした場合は、
1スレッドの処理が完了したら次の処理を実行
という動作をするためなのです。
さらにこの動作は、複数のユーザが同時にアクセスをしている状態であると言えます。
(正確には、ミリ秒単位ではズレてアクセスしていますが、、、)
【注意】初心者にありがちなミスとして、ループ回数を含めた設定をすると、「スレッド数・Ramp-Up期間の両方を繰り返して動く」という勘違いをしてしまいがちです。Ramp-Up期間は他に依存して変更されることはありません。そのため、ループ回数Ramp-Up期間で設定した時間の中で、アクセスが実行されることになります。総アクセス数は意図した数値になるので誤認しやすいかもしれませんが、テスト結果から、実行時間を確認すればすぐわかるのですが、最初のうちは意図したテストが実施できているかを必ず確認するようにしましょう。
JMeterの動作の違いについて
説明した通り、ループ回数を1に設定した場合と、そうでない場合ではJMeterのアクセス生成タイミングが異なります。
おさらいを兼ねて、以下比較できるよう実行結果を並べてみます。
まず、ループ回数が1の場合、
- スレッド数:600
- Ramp-Up期間:60
- ループ回数:1
JMeterは「Ramp-UP期間を、スレッド数で均等に割った時間」で処理を実行します。
次に、ループ回数6の場合、
- スレッド数:60
- Ramp-Up期間:60
- ループ回数:10
JMeterは「ユーザの処理が完了したら次を実行」 しています。
この違いは非常に重要なので、例をあげて説明します。
多くの 負荷テストのテストケースは、ユーザの動作を想定し、それに対して問題ないかどうかを確認することを目的としています。
一般的に、ユーザはサービス提供側の想定している動作だけをしてくれる保証などはなく、実にさまざまな動きをします。
例えば、「ECサイトで商品を購入する」という場合であれば、ある人が複数商品を閲覧している最中に、別の人がその商品を購入する。その人が購入完了したタイミングで50人が同時にサイトのトップにアクセスしたり、、、などなど
そのため、ECサイトのようにゴールまでの導線が複数存在するようなテストシナリオの場合は、ループ回数を含めた負荷レベル調整をすることで実ユーザの動きに近づけることが可能です。
最後に
負荷レベルの設定次第で、JMeterの動作タイミングが変化することは理解いただけたかと思います。
ですが、実はJMeterはもっと複雑な処理をさせることも可能です!
具体的には、スタートからゴールまでの間に複数のページが存在する場合、ランダムにページを選択して実行する方法なのですが、ちょっとボリュームが多くなりそうなので、別の機会に紹介したいと思います。
2015.12.31追記
JMeterで複数のページにランダムにアクセスする方法についての記事を書きました。
コチラを参照ください。
コメント一覧
コメントはありません