我正在编写一个压力测试,它将向远程服务器发出许多调用。我想在测试后收集以下统计数据:
- 远程调用的延迟(以毫秒为单位)。
- 远程服务器每秒可以处理的操作数。
我可以成功获得(2),但我遇到了(1)的问题。我当前的实现与另一个 SO question中显示的非常相似。我在那个问题中描述了同样的问题:System.currentTimeMillis()
当使用多个线程运行测试时,使用报告的延迟比预期的要长。
我分析了这个问题,我很肯定问题来自线程交错(有关详细信息,请参阅我对上面链接的另一个问题的回答),这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()
,并且如果我的线程数多于内核数,那么我可以让这个线程交错:
- Thread1: 长 start_time ...
- 线程1:结果= ...
- Thread2: 长 start_time ...
- 线程2:结果= ...
- Thread2:长差...
- Thread1:长差...
如果发生这种情况,那么 Thread2 计算的差异是正确的,但 Thread1 计算的差异是不正确的(它会大于应有的值)。也就是说,为了测量Thread1的差异,我想排除第4行和第5行的时间。这个时间是线程WAITING吗?
以不同的方式总结问题,以帮助其他人更好地理解它(这句话是@jason-c 在他的评论中所说的。):
[我] 尝试为远程调用计时,但使用多个线程运行测试只是为了增加测试量。