使用一个线程跨越多个连接或使用MULTIPLE线程进行加载测试?

时间:2017-03-28 07:45:22

标签: java multithreading web-services load

上下文:我正在用Java编写应用程序以加载测试mooc webservice。我知道其他工具已经存在,但我需要为每个自定义方案提供详细的报告,从我自己的应用程序生成它们似乎更容易。简而言之,每件事都是定时的,我正在绘制图形,例如:接受连接的时间,或响应时间等。我需要数字准确(相互之间的比例)。

问题:我可以在新线程中启动每个连接并为每个线程运行一个场景。缺点是我的机器上的线程数量有限。所以我需要一个更好的选择。

问题:如果不使用其他计算机,我可以做什么来启动和运行比我机器上允许的线程数更多的连接?

我的想法:我可以从单个线程启动并运行每个连接。该线程将有一个要执行的操作队列,每次从Web服务返回一个方法调用时,该回调将在事件队列中推送一个新事件。请参阅下面的伪代码。

问题:这个想法是否会导致同步成本太高而无法获得适当的响应时间间隔?

我所拥有的代码:

// simplified app code (omitting time measurement)
for each scenario
    start a new thread to run the scenario

// simplified scenario code (omitting time measurement)
repeat    
    start a method call
    wait until method response

// simplified callback code (omitting time measurement)
on response:
    notify scenario

我的想法代码:

// simpified app code (omitting time measurement)
repeat
    wait if actionQueue it empty
    otherwise pop first action   
    execute first action //could be a method call

// simplified callback code (omitting time measurement)
on response:
    given id of scenario that called the method
    push next action for this scenario into actionQueue

1 个答案:

答案 0 :(得分:1)

正确地衡量你提到的事物(接受连接的时间,响应时间等)并不容易。您仍然应该考虑使用Jmeter或任何其他类似的HTTP负载生成器,将它们与Web服务器的访问日志时间戳相结合,以获得所需的时间。

无论如何,您需要这样做(即合并来自负载生成器和访问日志的结果),因为从负载生成器端您只能看到表示组合排队,服务和网络往返时间的总往返时间。

如果您仍然认为编写自己的负载生成器是最佳选择,请回答您的问题:

  

这个想法会导致同步成本太高而无法获得   适当的响应时间间隔?

你必须衡量它。

最大的时间成本来自同时获得的响应数量和处理它们的时间,而不是来自同步。 有多个线程隐藏了上下文切换的成本,但它仍然存在。 根据您需要处理的响应速率,每个连接具有专用线程将更快并且比每个线程具有多个连接的成本更低。如果您需要在一台机器上处理数千个连接 - 而不是您从您的想法中受益。

无论如何,您需要仔细检查服务器的服务时间与网络往返时间之间的差异以及负载生成器的响应时间,以了解响应处理如何影响响​​应时间,具体取决于负载。

  

我可以做什么来启动和运行比允许的连接更多的连接   不使用其他机器的机器上的线程数?

您可以使用NIO运行比线程更多的连接。它将为您节省等待响应的空闲时间。虽然同时处理多个响应仍然需要多个线程。

看一下netty,因为它解决了非阻塞IO的想法,可以用更少的线程处理成千上万的连接。

P.S。帖子How do I write a correct micro-benchmark in Java?值得一读,因为热身,时间和其他一些原则在宏观层面上仍然适用。