lil*_*s27 5 performance benchmarking jmeter nanotime jmeter-plugins
我正在设置一个负载测试解决方案,正如我一直在阅读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
Run Code Online (Sandbox Code Playgroud)
现在,我明白这nanotime将基于一个固定的,但任意的原始时间,而currenttimeinmillis基于系统时间(即挂钟).而且我知道这nanotime会更精确,这就是我对使用它感兴趣的原因:我正在进行负载测试,并且需要响应时间测量尽可能准确和精确.
但我遇到的问题是了解如何使用nanoThreadSleep.纳米级偏移究竟是什么?为什么我想要或不想要后台线程来计算纳米级偏移?如果我启用JMeter使用纳米时间运行会发生什么,但是不要nanoThreadSleep明确使用该设置?
我已经搜索了StackOverflow和Google的某些解释,但除了JMeter的文档在我粘贴的那个小小的模糊中找不到它之外,我找不到其他的.其他人可以帮助我理解这个以及如何正确有效地使用它吗?
查看 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
}
}
}
Run Code Online (Sandbox Code Playgroud)