Java 使用一个线程跨越多个连接,还是使用多个线程进行负载测试?

Java 使用一个线程跨越多个连接,还是使用多个线程进行负载测试?,java,multithreading,web-services,load,Java,Multithreading,Web Services,Load,上下文:我正在用Java编写一个应用程序来加载测试mooc Web服务。我知道其他工具已经存在,但我需要每个自定义场景的详细报告,从我自己的应用程序生成它们似乎更容易。简言之,每件事都是定时的,我正在绘制一些图表,比如:连接被接受之前的时间,或者响应时间,等等。我需要准确的数字(按照彼此的比例) 问题:我可以在一个新线程中启动每个连接,并为每个线程运行一个场景。缺点是我的机器上的线程数量有限。所以我需要一个更好的选择 问题:在不使用另一台机器的情况下,如何启动和运行超过允许线程数的连接 我的想法

上下文:我正在用Java编写一个应用程序来加载测试mooc Web服务。我知道其他工具已经存在,但我需要每个自定义场景的详细报告,从我自己的应用程序生成它们似乎更容易。简言之,每件事都是定时的,我正在绘制一些图表,比如:连接被接受之前的时间,或者响应时间,等等。我需要准确的数字(按照彼此的比例)

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

问题:在不使用另一台机器的情况下,如何启动和运行超过允许线程数的连接

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

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


我所拥有的代码:

// 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

正确衡量你提到的事情(连接被接受前的时间、响应时间等)不是一件容易的事情。您仍然应该考虑使用JMIT或任何其他类似的HTTP加载生成器,将它们与Web服务器的访问日志时间戳结合起来,以获得所需的时间。 无论如何,您都需要这样做(即,合并来自load generator和访问日志的结果),因为从load generator端,您只能看到代表组合排队、服务和网络往返时间的总往返时间

如果您仍然认为编写自己的load generator是最佳选择,那么让我们回到您的问题:

这种想法会不会导致同步成本过高而无法实现同步 正确的反应时间gaph

你得测量一下

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

无论如何,您需要仔细检查服务器的服务时间与网络往返时间以及load generator的响应时间之间的差异,以了解响应处理如何根据负载影响响应时间

如何启动和运行超出允许范围的连接 在不使用其他机器的情况下,我的机器上的线程数

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

请看一看netty,因为它提出了非阻塞IO的概念,可以用更少的线程处理数千个连接

另外,这篇文章值得一读,因为热身、计时和其他一些原则仍然适用于宏观层面