13. リモートテスト

JMeter クライアント マシンがパフォーマンスの観点から、サーバーに負荷をかけるほど十分な数のユーザーをシミュレートできない場合、またはネットワーク レベルで制限されている場合、単一の JMeter クライアントから複数のリモート JMeter エンジンを制御するオプションがあります。JMeter をリモートで実行することにより、多くのローエンド コンピューターでテストを複製し、サーバーでより大きな負荷をシミュレートできます。JMeter クライアントの 1 つのインスタンスは、任意の数のリモート JMeter インスタンスを制御し、それらからすべてのデータを収集できます。これにより、次の機能が提供されます。

  • テスト サンプルのローカル マシンへの保存
  • 単一のマシンからの複数の JMeterEngine の管理
  • テスト計画を各サーバーにコピーする必要はありません - クライアントはそれをすべてのサーバーに送信します

注: すべてのサーバーで同じテスト計画が実行されます。JMeter はサーバー間で負荷を分散せず、それぞれが完全なテスト計画を実行します。したがって、1000 スレッドを設定し、6 つの JMeter サーバーがある場合、6000 スレッドを注入することになります。

ただし、リモート モードは、同じ数の CLI モード テストを個別に実行するよりも多くのリソースを使用します。多くのサーバー インスタンスが使用されている場合、クライアント ネットワーク接続と同様に、クライアント JMeter が過負荷になる可能性があります。これは Stripped モード (以下を参照) に切り替えることで改善されましたが、クライアントが過負荷になっていないことを常に確認する必要があります。

アプリケーション サーバーで JMeterEngine を実行できますが、アプリケーション サーバーで処理のオーバーヘッドが追加され、テスト結果が多少損なわれることに注意する必要があります。推奨されるアプローチは、JMeter エンジンを実行するように構成したアプリケーション サーバーと同じイーサネット セグメント上に 1 つ以上のマシンを配置することです。これにより、アプリケーション サーバー自体のパフォーマンスに影響を与えることなく、ネットワークがテスト結果に与える影響を最小限に抑えることができます。

ステップ 0: ノードを構成する

すべてのノード (クライアントとサーバー) が次のことを確認します。

  • まったく同じバージョンの JMeter を実行しています。
  • すべてのシステムで同じバージョンの Java を使用しています。異なるバージョンの Java を使用しても機能する場合がありますが、推奨されません。
  • RMI over SSL の有効なキーストアがあるか、SSL の使用を無効にしています。

テストでデータ ファイルを使用する場合、これらはクライアントによって送信されないことに注意してください。そのため、これらが各サーバーの適切なディレクトリで利用可能であることを確認してください。必要に応じて、各サーバーのuser.propertiesまたはsystem.properties ファイルを編集して、プロパティに異なる値を定義できます。これらのプロパティは、サーバーの起動時に取得され、テスト計画でその動作に影響を与えるために使用される場合があります (たとえば、別のリモート サーバーへの接続)。または、テストで使用されるデータファイルで異なるコンテンツを使用します (たとえば、各サーバーが一意の ID を使用する必要がある場合は、これらをデータ ファイル間で分割します)。

ステップ 1: サーバーを始動する

リモート ノードで JMeter を実行するには、 JMETER_HOME/bin/jmeter-server (unix) またはJMETER_HOME/bin/jmeter-server.bat (Windows) スクリプトを実行して、実行するすべてのマシンで JMeter サーバー コンポーネントを起動します。

異なる RMI ポートが使用されていない限り、各ノードには 1 つの JMeter サーバーしか存在できないことに注意してください。

JMeter サーバー アプリケーションは、RMI レジストリ自体を開始します。RMI レジストリを個別に起動する必要はありません。

デフォルトでは、RMI は JMeter サーバー エンジンに動的ポートを使用します。これにより、ファイアウォールで問題が発生する可能性があるため、JMeter プロパティserver.rmi.localportを定義して、このポート番号を制御できます。サーバー エンジンのローカル ポート番号として使用されます。

ステップ 2: サーバー IP をクライアントのプロパティ ファイルに追加する

制御 JMeter マシンでプロパティ ファイルを編集します。JMETER_HOME /bin/jmeter.propertiesで、「 remote_hosts 」という名前のプロパティを見つけて、実行中の JMeter サーバーの IP アドレスの値を追加します。このようなサーバーは、カンマ区切りで複数追加できます。

代わりに-R コマンド ライン オプションを使用して、使用 するリモート ホストを指定できることに注意してください。これは、 -rおよび-Jremote_hosts={serverlist}を使用するのと同じ効果があります。例えば

jmeter -Rhost1,127.0.0.1,host2

JMeter プロパティserver.exitaftertest=trueを定義すると、サーバーは単一のテストを実行した後に終了します。-Xフラグも参照してください(後述)。

ステップ 3a: GUI クライアントから JMeter クライアントを起動して構成を確認する

これで、制御 JMeter クライアントを開始する準備が整いました。MS-Windows の場合、スクリプト「bin/jmeter.bat」でクライアントを起動します。UNIX の場合、スクリプト「bin/jmeter」を使用します。[実行] メニューに、[リモート スタート] と [リモート ストップ] という 2 つの新しいサブメニューが含まれていることがわかります (図 1 を参照)。これらのメニューには、プロパティ ファイルで設定したクライアントが含まれています。通常の JMeter の開始および停止メニュー項目の代わりに、リモートの開始および停止を使用します。

図1 - 実行メニュー
図1 - 実行メニュー

ステップ 3b: CLI モード クライアントから JMeter を起動する

GUI モードはデバッグにのみ使用する必要があります。より良い代替手段として、CLI モード (コマンドライン) クライアントからリモート サーバーでテストを開始する必要があります。これを行うコマンドは次のとおりです。

jmeter -n -t script.jmx -r

また

jmeter -n -t script.jmx -R サーバー1、サーバー2、…

役に立つかもしれないその他のフラグ:

-G プロパティ = 値
すべてのサーバーでプロパティを定義します (複数回表示される場合があります)
-バツ
テストの最後にリモート サーバーを終了します。

最初の例では、JMeter プロパティremote_hostsで定義されているすべてのサーバーでテストを開始します。2 番目の例では、サーバーのリストからremote_hosts
を定義し、リモート サーバーでテストを開始します。 すべてのリモート サーバーが停止すると、コマンドライン クライアントは終了します。

13.1 SSLの設定

JMeter 4.0 以降、RMI のデフォルトのトランスポート メカニズムは SSL を使用します。SSL が機能するには、鍵と証明書が必要です。これらのキーは自分で作成する必要があります。

最も簡単なセットアップは、接続するすべての JMeter サーバーとクライアントに対して 1 つのキーと証明書のペアを使用することです。JMeter には、rmiという名前の 1 つのキー (およびそれに対応する証明書) を含むキーストアを生成するスクリプトが付属しています。スクリプトはbinディレクトリにあり、Windows システム ( bin/create-rmi-keystore.batと呼ばれます) および Unix 系システム ( bin/create-rmi-keystore.shと呼ばれます) で使用できます。7 日間有効なキー ペアが生成され、デフォルトのパスフレーズの値は ' changeit ' です。binディレクトリ 内から呼び出すことをお勧めします。

スクリプトを実行すると、証明書に埋め込む名前について質問されます。キーストア ツールがそれを受け入れる限り、好きなように入力できます。その値は、プロパティserver.rmi.ssl.keystore.aliasと一致する必要があり、デフォルトはrmiです。キーストアを作成するサンプル セッションを以下に示します。

$ cd jmeter/ビン
$ ./create-rmi-keystore.sh
あなたの姓名は何ですか?
  [不明]: rmi
組織単位の名前は何ですか?
  [不明]: 私のユニット名
あなたの組織の名前は何ですか?
  [不明]: 私の組織名
あなたの都市または地方の名前は何ですか?
  [不明]: あなたの街
あなたの州または県の名前は何ですか?
  [不明]: あなたの州
このユニットの 2 文字の国コードは?
  [不明]: XY
CN=rmi、OU=部隊名、O=組織名、L=あなたの市、ST=あなたの州、C=XY は正しいですか?
  [いいえはい

生成された rmi_keystore.jks を jmeter/bin フォルダーにコピーするか、プロパティ「server.rmi.ssl.keystore.file」で参照します。

RMI のデフォルト設定は、この設定で機能するはずです。ファイルbin/rmi_keystore.jksを、分散テストのセットアップに使用するすべての JMeter サーバーとクライアントにコピーします。

13.2 手動で行う

場合によっては、jmeter-server スクリプトが機能しないことがあります (JMeter 開発者が想定していない OS プラットフォームを使用している場合)。JMeter サーバー (上記の手順 1) をより手動のプロセスで起動する方法を次に示します。

ステップ 1a: RMI レジストリーを開始する

JMeter 2.3.1 以降、RMI レジストリは JMeter サーバーによって開始されるため、通常、このセクションは適用されません。以前の動作に戻すには、サーバー ホスト システムで JMeter プロパティserver.rmi.create=falseを定義し、以下の手順に従います。

JMeter は、リモート通信メカニズムとして Remote Method Invocation (RMI) を使用します。したがって、 JDK に付属し、「bin」ディレクトリにある RMI レジストリ アプリケーション (「 rmiregistry 」という名前) を実行する必要があります。rmir​​egistryを実行する前に、次の jar がシステムのクラスパスにあることを確認してください。

  • JMETER_HOME/lib/ext/ApacheJMeter_core.jar
  • JMETER_HOME/lib/jorphan.jar
  • JMETER_HOME/lib/logkit-2.0.jar
rmir​​egistry アプリケーションは、特定の JMeter クラスにアクセスする必要があります。パラメータを指定せずにrmiregistryを実行します。デフォルトでは、アプリケーションはポート1099をリッスンします。

ステップ 1b: JMeter サーバーを起動する

RMI レジストリ アプリケーションが実行されたら、JMeter サーバーを起動します。jmeter 起動スクリプト (「jmeter -s 」) で「-s 」オプションを使用します。

ステップ 2 と 3 は同じままです。

13.3 ヒント

JMeter/RMI では、クライアントからサーバーへの接続が必要です。これは、選択したポート (デフォルトは1099 ) を使用します。
JMeter/RMI では、サンプル結果をサーバーからクライアントに返すために逆接続も必要です。
これらは大きな番号のポートを使用します。これらのポートは、jmeter.properties内のclient.rmi.localportというjmeter
プロパティによって制御できます。 これがゼロ以外の場合、クライアント エンジンのローカル ポート番号のベースとして使用されます。現時点では、JMeter はclient.rmi.localportで定義されたポートから始まる最大 3 つのポートを開きます。
. JMeter クライアントとサーバーの間にファイアウォールやその他のネットワーク フィルターがある場合は、接続を許可するようにそれらが設定されていることを確認する必要があります。必要に応じて、監視ソフトウェアを使用して、生成されているトラフィックを表示します。

Suse Linux を実行している場合は、これらのヒントが役立つ場合があります。デフォルトのインストールでは、ファイアウォールが有効になっている場合があります。その場合、リモートテストは正しく機能しません。以下のヒントは Sergey Ten によって提供されました。

接続が拒否された場合は、次のオプションを渡してデバッグを有効にします。

rmir​​egistry -J-Dsun.rmi.log.debug=true \
     -J-Dsun.rmi.server.exceptionTrace=true \
     -J-Dsun.rmi.loader.logLevel=verbose \
     -J-Dsun.rmi.dgc.logLevel=verbose \
     -J-Dsun.rmi.transport.logLevel=verbose \
     -J-Dsun.rmi.transport.tcp.logLevel=verbose \

JMeter 2.3.1 以降、RMI レジストリはサーバーによって開始されます。ただし、JMeter コマンド ラインからオプションを渡すことはできます。例: " jmeter -s -Dsun.rmi.loader.logLevel=verbose " (つまり、-Jプレフィックスを省略します)。または、プロパティーをsystem.propertiesファイル で定義することもできます。

この問題の解決策は、ループバック127.0.0.1および127.0.0.2/etc/hostsから削除することです。127.0.0.2ループバックが利用できない場合、 jmeter -serverは rmiregistry に接続できません。問題を解決するには、次の設定を使用します。

交換

`dirname $0`/jmeter -s "$@"

HOST="-Djava.rmi.server.hostname=[コンピュータ名][コンピュータドメイン] \
      -Djava.security.policy=`dirname $0`/[policy_file]" \
`dirname $0`/jmeter $HOST -s "$@"

また、ポリシー ファイルを作成し、[computer_name][computer_domain]行を/etc/hostsに追加します。

リモート テストで使用される RMI 通信チャネルの SSH トンネリングをより適切にサポートするために、JMeter 2.6 以降:

  • RemoteSampleListenerImplが使用する RMI ポートを制御するために、新しいプロパティ「client.rmi.localport 」を設定できます。
  • ローカル マシンのポートを使用してリモート エンドポイントとして SSH トンネルを介した RMI トラフィックのトンネリングをサポートするために、Java システム プロパティの「java.rmi.server.hostname」パラメータを使用して直接指定されている場合は、ループバック インターフェイスを使用できるようになりました。 .

13.4 別のポートの使用

デフォルトでは、JMeter は標準の RMI ポート1099を使用します。これは変更可能です。これが正常に機能するには、次のすべてに同意する必要があります。

  • サーバーで、新しいポート番号を使用してrmiregistryを開始します
  • サーバーで、プロパティーserver_portを定義して JMeter を開始します。
  • クライアントで、remote_hostsプロパティを更新して、新しいリモートホスト: ポート設定を含めます。

JMeter 2.1.1 以降、jmeter-server スクリプトはポートの変更をサポートしています。たとえば、ポート1664を使用するとします(おそらく1099は既に使用されています)。

Windows 上 (DOS ボックス内)
C:\JMETER> SET SERVER_PORT=1664
C:\JMETER> JMETER-SERVER [その他のオプション]
Unix の場合:
$ SERVER_PORT=1664 jmeter-server [その他のオプション]
[環境変数には大文字を使用]

どちらの場合も、スクリプトは指定されたポートで rmiregistry を開始し、「server_port」プロパティを定義してサーバー モードで JMeter を開始します。

選択したポートは、サーバーのjmeter.logファイルに記録されます ( rmiregistryはログ ファイルを作成しません)。

13.5 別のサンプル送信者の使用

テスト計画のリスナーは、その結果をクライアント JMeter に送り返します。クライアント JMeter は、指定されたファイルに結果を書き込みます。デフォルトでは、サンプルは生成されると同期的に送り返されます。これは、サーバー テストの最大スループットに影響を与える可能性があります。スレッドを続行する前に、サンプル結果を送り返す必要があります。この動作を変更するために設定できる JMeter プロパティがいくつかあります。

モード
サンプル送信モード - 2.9 以降のデフォルトはStrippedBatchです。これは、クライアント ノードで設定する必要があります。
標準
サンプルが生成されるとすぐに同期的に送信する
所有
実行が終了するまでサンプルを配列に保持します。これはサーバーで多くのメモリを使用する可能性があるため、お勧めできません。
ディスクストア
実行が終了するまで、サンプルをディスク ファイル ( java.io.tempの下) に保存します。シリアル化されたデータ ファイルは、JVM の終了時に削除されます。
StrippedDiskStore
成功したサンプルから responseData を削除し、DiskStore 送信者を使用して送信します。
バッチ
カウント ( num_sample_threshold ) または時間 ( time_threshold ) がしきい値を超えたときに、保存されたサンプルを送信します。この時点で、サンプルは同期的に送信されます。しきい値は、次のプロパティを使用してサーバーで構成できます。
num_sample_threshold
蓄積するサンプル数、デフォルトは100
time_threshold
時間しきい値、デフォルト 60000 ミリ秒 = 60 秒
以下で説明する非同期モードも参照してください。
統計
カウントまたは時間がしきい値を超えたときに要約サンプルを送信します。サンプルは、スレッド グループ名とサンプル ラベル別にまとめられています。次のフィールドが蓄積されます。
  • 経過時間
  • レイテンシー
  • バイト
  • サンプル数
  • エラー数
サンプル間で異なるその他のフィールドは失われます。
剥ぎ取られた
成功したサンプルから responseData を削除する
StrippedBatch
成功したサンプルから responseData を削除し、バッチ送信者を使用して送信します。
非同期
サンプルは一時的にローカル キューに保存されます。別のワーカー スレッドがサンプルを送信します。これにより、結果がクライアントに返されるのを待たずに、テスト スレッドを続行できます。ただし、サンプルが送信されるよりも速く作成されている場合、キューは最終的にいっぱいになり、一部のサンプルがキューから排出されるまでサンプラー スレッドはブロックされます。このモードは、サンプル生成でピークを滑らかにするのに役立ちます。キューのサイズは 、サーバー ノードで JMeter プロパティasynch.batch.queue.size (デフォルト100 ) を設定することで調整できます。
StrippedAsync
成功したサンプルから responseData を削除し、非同期送信者を使用して送信します。
カスタム実装
mode パラメータをカスタム サンプル センダ クラス名に設定します。これは、インターフェースSampleSenderを実装し、型RemoteSampleListenerの単一パラメーターを取るコンストラクターを持たなければなりません。
Strippedモード ファミリはresponseDataを削除するため、以前のresponseDataが利用可能であることに依存する一部の要素は機能しません。
この機能を実装するより効率的な方法が常にあるため、これは実際には問題ではありません。

次のプロパティは、バッチモードと統計モードに適用されます。

num_sample_threshold
バッチ内のサンプル数 (デフォルト100 )
time_threshold
待機するミリ秒数 (デフォルトは 60 秒)

13.6 起動に失敗したノードの処理 ¶

大規模なテストでは、リモート サーバーの一部が利用できなくなったりダウンしたりする可能性があります。たとえば、自動化スクリプトを使用して多数のクラウド マシンを割り当て、それらをジェネレーターとして使用すると、クラウドの問題により、要求されたマシンの一部が起動に失敗する可能性があります。JMeter 2.13 以降、この動作を制御する新しいプロパティがあります。

最初に、失敗したノードが起動をわずかに遅らせることを期待して、初期化の試行を再試行することをお勧めします。再試行を有効にするには、client.triesプロパティを接続試行の合計回数に設定する必要があります。デフォルトでは、1 回だけ試行します。再試行の遅​​延を制御するには、client.retries_delayプロパティを試行間のスリープ時間 (ミリ秒) に設定します。

最後に、初期化に成功し、失敗したノードをスキップしたジェネレーターでテストを実行したい場合があります。これを有効にするには、client.continue_on_fail=trueプロパティを設定します。

13.7 security-manager の使用

分散環境で JMeter を実行する場合、JMeter は基本的にサーバー側とクライアント側の両方でリモート実行エージェントであることに注意する必要があります。JMeter クライアントまたはサーバーの 1 つが侵害されると、悪意のある人物がこれを使用してさらにアクセスする可能性があります。これを軽減するために、Java には、潜在的に危険なアクションが実行される前に JVM から要求されるセキュリティ マネージャの概念があります。これらのアクションには、ホスト名の解決、ファイルの作成または読み取り、OS でのコマンドの実行などがあります。

セキュリティ マネージャは、Java システム プロパティjava.security.managerおよびjava.security.policyを設定することで有効にできます。アプリケーションの制御のクイック ツアー を必ずご覧ください。

setenv.sh (またはWindows ではsetenv.bat )の新しいメカニズムを使用して、次のコード スニペットを${JMETER_HOME}/bin/setenv.shに追加することにより、セキュリティ マネージャーを有効にできます。

JVM_ARGS="\
   -Djava.security.manager \
   -Djava.security.policy=${JMETER_HOME}/bin/java.policy \
   -Djmeter.home=${JMETER_HOME} \
"

JVM は、ファイル${JMETER_HOME}/bin/java.policyで定義されたポリシーを、おそらくグローバルに定義されたポリシーに追加します。定義をポリシーの唯一のソースにする場合は、プロパティjava.security.policyを設定するときに、1 つではなく 2 つの等号を使用します。

ポリシーはユースケースに依存し、適切な制限されたアクションと許可されたアクションを見つけるのに時間がかかる場合があります。Java は、プロパティーjava.security.debugを使用して、必要なポリシーを見つけるのに役立ちます。accessに設定すると、許可を求められたすべてのアクセス許可がログに記録されます。次の行をsetenv.shに追加するだけです。

JVM_ARGS="${JVM_ARGS} -Djava.security.debug=access"

Java システム プロパティjmeter.homeを${JMETER_HOME}の値で定義するのは少し奇妙に見えるかもしれません。この変数は、例のjava.policyで使用され、ファイル システム アクセスを制限し、JMeters 構成とライブラリの読み取りのみを許可し、特定の場所への書き込みアクセスのみを制限します。

次のポリシー定義ファイルは、簡単なリモート テストに使用されています。より複雑なシナリオを実行する場合は、おそらくポリシーを微調整する必要があります。テスト計画は、ユーザーのホーム ディレクトリ内のjmeter-testplansというディレクトリの下に配置されます。サンプルのjava.policyは次のようになります。

grant codeBase "file:${jmeter.home}/bin/*" {
  アクセス権 java.security.AllPermission;
};

grant codeBase "file:${jmeter.home}/lib/jorphan.jar" {
  アクセス権 java.security.AllPermission;
};

grant codeBase "file:${jmeter.home}/lib/log4j-api-2.11.1.jar" {
  アクセス権 java.security.AllPermission;
};

grant codeBase "file:${jmeter.home}/lib/log4j-slf4j-impl-2.11.1.jar" {
  アクセス権 java.security.AllPermission;
};

grant codeBase "file:${jmeter.home}/lib/slf4j-api-1.7.25.jar" {
  アクセス権 java.security.AllPermission;
};

grant codeBase "file:${jmeter.home}/lib/log4j-core-2.11.1.jar" {
  アクセス権 java.security.AllPermission;
};

grant codeBase "file:${jmeter.home}/lib/ext/*" {
  アクセス権 java.security.AllPermission;
};

grant codeBase "file:${jmeter.home}/lib/httpclient-4.5.6.jar" {
  許可 java.net.SocketPermission "*", "接続、解決";
};

grant codeBase "file:${jmeter.home}/lib/darcula.jar" {
  許可 java.lang.RuntimePermission "modifyThreadGroup";
};

grant codeBase "file:${jmeter.home}/lib/xercesImpl-2.12.0.jar" {
  パーミッション java.io.FilePermission "${java.home}/lib/xerces.properties", "read";
};

grant codeBase "file:${jmeter.home}/lib/groovy-all-2.4.15.jar" {
  パーミッション groovy.security.GroovyCodeSourcePermission "/groovy/script";
  許可 java.lang.RuntimePermission "accessClassInPackage.sun.reflect";
  許可 java.lang.RuntimePermission "getProtectionDomain";
};

許す {
  パーミッション java.io.FilePermission "${jmeter.home}/backups", "read,write";
  許可 java.io.FilePermission "${jmeter.home}/backups/*", "読み取り、書き込み、削除";
  パーミッション java.io.FilePermission "${jmeter.home}/bin/upgrade.properties", "read";
  パーミッション java.io.FilePermission "${jmeter.home}/lib/ext/-", "read";
  パーミッション java.io.FilePermission "${jmeter.home}/lib/ext", "read";
  パーミッション java.io.FilePermission "${jmeter.home}/lib/-", "read";
  パーミッション java.io.FilePermission "${user.home}/jmeter-testplans/-", "read,write";
  許可 java.io.SerializablePermission "enableSubclassImplementation";
  許可 java.lang.reflect.ReflectPermission "suppressAccessChecks";
  許可 java.lang.RuntimePermission "accessClassInPackage.jdk.internal.dynalink.support";
  許可 java.lang.RuntimePermission "accessClassInPackage.sun.awt";
  許可 java.lang.RuntimePermission "accessClassInPackage.sun.misc";
  許可 java.lang.RuntimePermission "accessClassInPackage.sun.swing";
  許可 java.lang.RuntimePermission "accessDeclaredMembers";
  許可 java.lang.RuntimePermission "createClassLoader";
  許可 java.lang.RuntimePermission "createSecurityManager";
  許可 java.lang.RuntimePermission "getClassLoader";
  許可 java.lang.RuntimePermission "getenv.*";
  許可 java.lang.RuntimePermission "nashorn.createGlobal";
  パーミッション java.util.PropertyPermission "*", "read";
};
  
java.security.AllPermissionの使用は、テスト計画を機能させる簡単な方法ですが、セキュリティへの道のりで危険な近道になる可能性があります。
Go to top