5

私は負荷テスト ソリューションをセットアップしています。JMeter のドキュメントを読んでいると、テスト計画に多数のプロパティを設定できることがわかりました。テストはすでに正常に実行され、結果やグラフなどを生成していますが、JMeter や結果の精度などについてより深く理解しようとしたときに、以下の宣伝文句に出くわしました。

JMeter のドキュメントから、次のことを読みました。

# Whether to use System.nanoTime() - otherwise only use System.currentTimeMillis()
sampleresult.useNanoTime=true

# Use a background thread to calculate the nanoTime offset
# Set this to <= 0 to disable the background thread
sampleresult.nanoThreadSleep=5000

nanotimeこれで、固定されているが任意の原点時間に基づいていることを理解していますcurrenttimeinmillisが、システム時間 (つまり、壁時計) に基づいています。そして、それがより正確になることを知っているので、nanotime私はそれを使用することに興味があります.負荷テストを行っており、応答時間の測定を可能な限り正確かつ正確にする必要があります.

しかし、私が抱えている問題は、使用方法を理解することnanoThreadSleepです。ナノタイムオフセットとは正確には何ですか? ナノタイム オフセットを計算するバックグラウンド スレッドが必要な理由、または必要でない理由を教えてください。nanotime を使用して JMeter を実行できるようにし、nanoThreadSleep設定を明示的に使用しないとどうなりますか?

StackOverflow と Google で何らかの説明を検索しましたが、ここに貼り付けた小さな宣伝文句で JMeter のドキュメントに記載されている以外の説明を見つけることができません。これを理解し、それを正しく効果的に使用する方法について、他の人が助けてくれますか?

4

1 に答える 1

1

JMeter コードを調べたところ、以下のセクションが興味深いものであることがわかりました。つまり、基本的にバックグラウンド スレッドはNANOTHREAD_SLEEPミリ秒スリープし、起動時に時間を要求するスレッドです。

この値は、サンプリングに多くのオーバーヘッドを追加しないようにできるだけ高く維持する必要がありますが、十分な精度を提供するにはできるだけ低く維持する必要があります。

ナノスレッドを使用しない場合、すべての時間は System.nanoTime() を使用して計算され、精度が向上する場合とされない場合があります。一般に、高精度カウンタは、周波数変動 (たとえば、省電力モードによる) の影響を大きく受けます。私の意見では、 System.nanoTime() の使用について心配する必要はありません。ナノ秒レベルの精度でテストの再現性を得ることができないためです。ミリ秒でさえ、そのための非常に狭い間隔のようです。

時間を計算するためにバックグラウンド スレッドを使用するのはなぜですか? これは、スレッドが時間のみを測定する場合、実行中にいつでも現在の時刻を尋ねることができるためだと思います。バックグラウンド スレッドを使用しない場合、時刻はサンプリングの時点でのみ更新されると思います。スレッドを有効にすると、時間がより頻繁に更新されると思います (NANOTHREAD_SLEEP十分に考慮されている場合)。私は JMeter を書いたことはありませんが、これが時間スレッドの背後にある哲学だと思います。

これは役に立ちますか?おそらくそれは余分な精度を絞ることができます。ただし、JMeter は、ネットワークの遅延やリソースの使用などにより再現性が低いWeb アプリケーションのパフォーマンスのテストに使用されます。ナノ秒を測定したとしても、人々は秒とミリ秒の部分にもっと興味を持ち、テストが再現可能であることに関心があります。

コード:

private static class NanoOffset extends Thread {

    private static volatile long nanoOffset; 

    static long getNanoOffset() {
        return nanoOffset;
    }

    @Override
    public void run() {
        // Wait longer than a clock pulse (generally 10-15ms)
        getOffset(30L); // Catch an early clock pulse to reduce slop.
        while(true) {
            getOffset(NANOTHREAD_SLEEP); // Can now afford to wait a bit longer between checks
        }
    }

    private void getOffset(long wait) {
        try {
            TimeUnit.MILLISECONDS.sleep(wait);
            long clock = System.currentTimeMillis();
            long nano = SampleResult.sampleNsClockInMs();
            nanoOffset = clock - nano;
        } catch (InterruptedException ignore) {
            // ignored
        }
    }        
}
于 2015-03-22T15:21:15.430 に答える