リモート サーバーに多くの呼び出しを発行するストレス テストを作成しています。テスト後に次の統計を収集したいと考えています。
- リモート呼び出しの待ち時間 (ミリ秒単位)。
- リモート サーバーが処理できる 1 秒あたりの操作数。
(2) はうまく取得できますが、(1) に問題があります。私の現在の実装は、この他のSOの質問に示されているものと非常に似ています。そして、その質問で説明されているのと同じ問題がSystem.currentTimeMillis()
あります。複数のスレッドでテストを実行すると、 using によって報告されるレイテンシが予想よりも長くなります。
私は問題を分析しましたが、問題はスレッドのインターリーブに起因していると確信しています (詳細については、上記でリンクした他の質問への回答を参照してください) System.currentTimeMillis()
。これは、この問題を解決する方法ではありません。
を使用してそれを実行できるはずですjava.lang.management
。これには、次のようないくつかの興味深い方法があります。
ThreadMXBean.getCurrentThreadCpuTime()
ThreadMXBean.getCurrentThreadUserTime()
ThreadInfo.getWaitedTime()
ThreadInfo.getBlockedTime()
私の問題は、API を読んだにもかかわらず、これらのメソッドのどれが私が望むものを提供してくれるのかまだはっきりしていないことです。私がリンクした他のSOの質問のコンテキストでは、これが必要なものです:
long start_time = **rightMethodToCall()**;
result = restTemplate.getForObject("Some URL",String.class);
long difference = (**rightMethodToCall()** - start_time);
そのためdifference
、マルチスレッド環境であっても、リモート呼び出しにかかった時間の非常に適切な概算が得られます。
制限: コードのブロックをブロックで保護することは避けたいと思いますsynchronized
。私のプログラムには、実行を継続できるようにしたい他のスレッドがあるからです。
編集: 詳細情報を提供します。:
問題は次のとおりです。リモート呼び出しの時間を計りたいのですが、リモート呼び出しだけです。System.currentTimeMillis
orを使用しSystem.nanoTime()
、コアよりも多くのスレッドがある場合、このスレッドをインターリーブすることができます。
- スレッド 1: 長い start_time ...
- スレッド 1: 結果 = ...
- スレッド 2: 長い start_time ...
- スレッド 2: 結果 = ...
- スレッド 2: 長い違い ...
- スレッド 1: 長い違い ...
その場合、Thread2 によって計算された差は正しいのですが、Thread1 によって計算された差は正しくありません (必要以上に大きくなります)。つまり、Thread1 の差の測定では、4 行目と 5 行目の時間を除外したいのですが、この時間はスレッドが待機していたのでしょうか。
他の人がそれをよりよく理解するのに役立つ場合に備えて、別の方法で質問を要約します (この引用は、@ jason-c が彼のコメントでどのように述べているかです):
[私は] リモート呼び出しの時間を計ろうとしていますが、テストの量を増やすためだけに複数のスレッドでテストを実行しています。