Dmitri Tikhanski is a Contributing Writer to the BlazeMeter blog.

Learn JMeter in 5 Hours

Start Learning
Slack

Test Your Website Performance NOW!

Jul 05 2015
En

A Comprehensive Guide to Using JMeter Timers (JMeter タイマの使用に関する包括的なガイド)

タイマの概要

 

すべての「Timer」テスト要素の目的は、一定の時間、仮想ユーザを表す JMeter スレッドを一時停止させることです。タイマを使用する主な目的は、仮想ユーザの「思考時間」をシミュレートすることにあります。負荷テストの分野では、「思考時間」は、Web アプリケーションの操作中にユーザが待機するという実際のユーザの行動をシミュレートすることを意味します。

 

JMeter の動作の概要は以下のとおりです。

 

- テスト計画が開始されると、JMeter は仮想ユーザ単位でスレッドを起動します
- 各スレッドは、できるだけ速く
サンプラの実行を無秩序に(ロジック コントローラがあれば、それに従って)開始します - 実行するサンプラがなくなり、反復するループが終了すると、スレッドは停止します

 

全体的に大きな問題はありませんが、強調表示した部分は、現実とは何の共通点もありません。現実のユーザは、Web アプリケーションをノンストップで操作することはありません。表示されたコンテンツを消費する時間が必要であり、次のアクションについて「考える」時間も必要になります。この「思考時間」も正確にシミュレートすることが求められます。負荷テストの本来の目的は、現実のユーザの行動をできるだけ忠実にシミュレートすることです。この点を忘れないでください。

 

思考時間は一定ではありません。たとえば、ユーザが画像を見ている場合、アクション(次の画像を要求)を実行するまで数秒かかります。また、ユーザがフォーラムの投稿に返信する場合、(下書きを定期的に自動保存することで)ユーザの入力が最小限であるか、またはゼロであっても、返事や要求を作成するのに数分かかることがあります。

 

上記の事柄をすべて考慮すると、以下の 2 つの結論が得られます。

 

  1. タイマを使用する必要があります。
  2. 思考時間はアプリケーションごとに異なる可能性があるため、決まった「方法」や推奨される思考時間の値はありません。

 

この記事では、使用できるタイマをすべて紹介し、各タイマの動作について説明しているため、ユーザは最適なタイマを簡単に選べるようになります。

 

タイマのスコープと処理

 

JMeter アサーションと同様に、JMeter タイマにもスコープがありますが、アサーション タイマと違い、各サンプラの前にタイマ自体のスコープ内で実行されます。スコープ内に複数のタイマがある場合、サンプラの実行前にすべてのタイマが処理されます。また、タイマの実行時間は記録されないため、タイマでスレッドを 1 秒間一時停止し、サンプラの実行時間が 3 秒の場合、サンプラの実行時間として 3 秒が記録されます。タイマの実行時間も記録する必要がある場合は、Transaction Controller を使用する必要があります。

 

以下の図に示す状況を考えてみましょう。
 

 

- タイマ A: サンプラ A のみに適用可能
- タイマ B: サンプラ A とサンプラ B に適用可能
- タイマ C: サンプラ A、サンプラ B、およびサンプラ C に適用可能
- タイマは、サンプラより先に実行されます
- タイマの実行時間は、サンプラの実行時間には追加されません

 

サンプラの後に遅延を挿入する必要がある場合は、Test Action サンプラを使用できます。Test Action サンプラの動作は以下のとおりです。

 

- サンプル結果を生成しません(負荷のレポートやグラフには表示されません)
- 静的またはランダム(__Random() 関数を参照)な時間、スレッドを一時停止できます
- 必要な遅延ロジックが静的またはランダムな思考時間よりも複雑な場合、JMeter タイマの親サンプラとして使用できます

 

 

タイマの説明

 

現在のバージョンの Apache JMeter (2.13)では、以下の Timer テスト要素を使用できます。

 

- Constant Timer
- Uniform Random Timer
- Gaussian Random Timer
- Poisson Random Timer
- Constant Throughput Timer
- Synchronizing Timer
- BeanShell Timer
- BSF Timer
- JSR223 Timer

 

 

個人的には、最初の 2 つのタイマ(Constant Timer と Uniform Random Timer)でテスト状況の 99% に対応できると考えているので、これらのタイマをスクリプトで使用することをお勧めします。ただし、思考時間のシミュレーション要件が、さらに複雑な数学的および統計的分布に基づいている場合は、その他のタイマについても十分に理解しておくと良いでしょう。

 

Constant Timer

 

Constant Timer を使用すると、要求の間に各スレッドを同じ「思考時間」だけ一時停止できます。

 

 

上の図の設定では、Constant Timer のスコープ内にある各サンプラの実行前に 5 秒間の遅延が追加されます。

 

また、「Thread Delay」の入力に JMeter 関数変数を使用することもできます。その場合、タイマは「Constant (一定)」ではなくなります。

 

 

Uniform Random Timer

 

 

Uniform Random Timer は、スレッドを以下の時間だけ一時停止します。

 

- 範囲が 0.0 以上 1.0 未満の次の一様分布擬似乱数値
- 「Random Delay Maximum」で乗算
- さらに「Constant Delay Offset」を加算

 

デフォルト設定は以下のとおりです。

 

- Random Delay Maximum: 100
- Constant Delay Offset: 0

 

式は |0.X * 100 + 0| のようになるため(X は 0 ~ 9 の数字)、影響を受けるサンプラは 0 〜 99 の範囲の乱数のミリ秒単位だけ一時停止します。

 

Gaussian Random Timer

 

 

Gaussian Random Timer は、Uniform Random Timer と同様の手法でスレッドの遅延時間を計算しますが、式の最初の引数として、0.0 ~ 0.9 の範囲の一様分布擬似乱数値の代わりに正規分布(別名: ガウス分布)が使用されています。

 

正規分布値を生成するには、いくつかのアルゴリズムがありますが、JMeter では Marsaglia の極座標法が使用されます。この手法では、S = U2 + V2 > 1 の条件を満たすまで、-1 ~ 1 の範囲で次の 2 つのランダム値 U および V を取ります。S が定義されると、以下の式で使用され、

 

 

次の擬似乱数ガウス(「正規」)分布値が返されます。最初にメソッドが呼び出されると X が返され、2 回目に Y が返され、3 回目に最初からやり直して新しい X が返されます(以下同様)。

 

Gaussian Random Timer のデフォルト設定は以下のとおりです。

 

- Deviation: 100
- Constant Delay Offset: 300

 

「スリープ」の値は |X (or Y) * 100 + 300| なので、スレッドは 1 ~ 600 ミリ秒の期間で一時停止します。

 

Poisson Random Timer

 

 

Poisson Random Timer では、ポアソン分布から次の乱数を取得するため、ユーザ定義の λ パラメータ(「Lambda」(ミリ秒単位))に「Constant Delay Offset」を加えて使用します。

 

ポアソン乱数生成に興味がある場合は、上記の Wikipedia の記事と、John D. Cook 氏による「Generating Poisson random values (ポアソン乱数の生成)」を読んで、遅延値の計算方法について学ぶと良いでしょう。また、JMeter はオープンソース ソフトウェアであるため、使用する JMeter のバージョンに対応したソース コード配布物をいつでもダウンロードして、さまざまなテスト要素の実装方法を確認することができます(最新バージョンには、最新の拡張機能、バグ修正、パフォーマンス向上、新しいテスト要素など が含まれるため、できれば最新バージョンの JMeter を使用することをお勧めします。テスト構成を改善する方法の詳細については、Philippe Mouawad 氏によるガイド「JMeter Performance and Tuning Tips (JMeter のパフォーマンスとチューニングのヒント)」を参照してください)。Poisson Random Timer クラスのソースは、http://svn.apache.org/repos/asf/jmeter/trunk/src/components/org/apache/jmeter/timers/PoissonRandomTimer.java SVN URL にあります。

 

デフォルト パラメータ(Lambda は 100 ms、Constant Delay Offset は 300 ms)を使用する場合、Poisson Random Timer は 375 ~ 425 ミリ秒の範囲の遅延を生成します。

 

このように、Poisson Random Timer で生成される乱数分布(JMeter のデフォルト値を指定した場合)は、Uniform Random Timer や Gaussian Random Timer よりも狭くなっています。

 

Synchronizing Timer
 

 

Synchronizing Timer については、「Using the JMeter Synchronizing Timer (JMeter Synchronizing Timer の使用)」の記事で詳しく説明しています。簡単に言うと、スレッド数が「Number of Simulated Users to Group by」の入力で指定された数以上でない限り、スコープ内のすべてのスレッドを一時停止します。前回の記事からの唯一の変更点は、JMeter 2.12 のリリース以降、Synchronizing Timer のタイムアウトを設定できるようになったことです。この変更の理由は、何らかの理由で「Number of Simulated Users to Group by」に達しない場合、テストが一時停止されたままになってしまうためです。そのため、JMeter 2.12 以降では、タイムアウト値を設定して、開始に必要なスレッド数に達しない場合でもテストを続行できるようになりました。

 

Constant Throughput Timer

 

 

Constant Throughput Timer では、目標指向のシナリオを実装するためにスレッドを一時停止できます。目標指向のシナリオとは、X 人の同時ユーザをシミュレートするのではなく、1 秒あたり X 件の要求をシミュレートすることを目的とした負荷テスト タイプです。Constant Throughput Timer は正確に「分」レベルで動作するため、テストが十分な時間(1 分以上)継続するようにし、適切な増加時間を設定して負荷の急激な上昇を避けるようにしてください(何らかのストレス テストを実施している場合を除く)。

 

このタイマの詳しい使用方法については、「How to use JMeter's Throughput Constant Timer (JMeter の Throughput Constant Timer の使用法)」の記事を参照してください。

 

Beanshell Timer、BSF Timer、および JSR223 Timer

 

この記事で紹介する最後の 3 つのタイマは、スクリプトベースのタイマです。つまり、サポートされているいずれかのスクリプト言語を使用して、スレッド遅延ロジックを実装する必要があります。通常は必要ありませんが、JMeter が現在提供していない独自のアルゴリズムに基づいて思考時間を定義する場合は、これらのタイマのいずれかを使用して独自のアルゴリズム実装を作成できます。JMeter は標準で Beanshell、JavaScript、および JEXL 言語をサポートしています。関連する jar を追加すると、他の言語のサポートを有効にすることができます。

 

まとめると、スクリプトベースのタイマを使用するには、以下のことが必要になります。

 

- 独自のアルゴリズムを使用して遅延の計算を実行します
- return ステートメントを使用して、計算した時間だけスレッドをスリープし、計算した値を返します(タイマで直接「スリープ」を実行することもできますが、あまりお勧めしません)

 

タイマ/言語の選択

 

スクリプトには、JSR223 テスト要素と、言語に Groovy を使用することをお勧めします。適切に構成された Groovy スクリプトを JSR223 で使用すると、サンプラは、Java と同じくらい高速に動作します。一方、Beanshell と JavaScript では実行時に逐次解釈が必要になるので、パフォーマンス上のオーバーヘッドが発生します。「groovy」スクリプト エンジンのサポートを JMeter に追加する方法と、Beanshell 対 JSR223+groovy のベンチマークについては、「Beanshell vs JSR223 vs Java JMeter Scripting: The Performance-Off You've Been Waiting For! (Beanshell、JSR223、Java による JMeter スクリプト: 待望のパフォーマンス比較)」を参照してください。

 

JMeter の事前定義済み変数

 

スクリプトベースのタイマには、以下の事前定義済みの変数があります。

 

- vars
- props
- log
- prev
- ctx

 

これらのエンティティ(および、いくつかのスクリプト例)については、「How to use BeanShell: JMeter's favorite built-in component (BeanShell の使用方法: JMeter の便利な内蔵コンポーネント)」のガイドで詳しく説明しています。

 

最後に

 

この記事では、テストを現実のユーザの行動に近づけるほとんどの方法について説明してきました。Web ブラウザの観点からテストを現実的な内容にするための詳細な推奨事項については、「How to make JMeter behave more like a real browser (JMeter の動作を実際のブラウザに近づける方法)」を参照してください。

 

経験豊富な JMeter ユーザは、オンデマンドの Web キャスト「How to Create Advanced Load Testing Scenarios with JMeter (JMeter による高度な負荷テスト シナリオの作成方法)」をご覧ください。

 

いつものように、JMeter Timer の使用に関する質問やコメント、またはアドバイスがある場合は、この記事の下にあるディスカッション フォームにメッセージを残していただければ、すみやかに回答します。
 

一対一のデモセッションを予約いただくと、BlazeMeter の機能について説明を受けることができます。

     
arrow Please enter a valid URL

You might also find these useful:

Interested in writing for our Blog?Send us a pitch!

We're working on starting your first test

Testing 20 Virtual Users

Starting your test in around 2-4 minutes. Your report will appear once we've gathered the data.

0

Status: Preparing Your Test

Your email is required to complete the test. If you proceed, your test will be aborted.