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

标签 java multithreading web-services load

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

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

问题:如何在不使用另一台计算机的情况下启动和运行超出我的计算机上允许的线程数的连接?

我的想法:我可以从单个线程启动并运行每个连接。该线程将有一个要执行的操作队列,每次方法调用从 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

最佳答案

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

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

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

Would this idea induce a synchronization cost too high to have a proper response-time gaph?

你必须衡量这一点。

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

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

What can I do to start and run more connections than the allowed number of threads on my machine without using another machine ?

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

看看 netty,因为它解决了非阻塞 IO 的概念,用更少的线程处理数千个连接。

附注帖子How do I write a correct micro-benchmark in Java?值得一读,因为大多数原则(如热身、计时和其他一些原则)在宏观层面上仍然适用。

关于java - 使用一个线程跨越多个连接还是使用多个线程进行负载测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43063533/

相关文章:

wcf - 一段时间后 IIS 服务是否关闭?

java - 用 Java 从文件中完全读取对象流的最佳方法是什么?

java - 如何将已实现的 Interface 对象传递给其实现的类中的方法?

java - Neodatis 对象 DB/DataNucleus - 如何定义索引?

c++ - 成员变量在另一个线程中没有改变?

java - 工作 SOAP 客户端示例

c# - .Net WebServices 和 out/ref WebMethod 参数

java - 避免java中大量的if-else语句

java - Servlet 架构是否比 CGI 更快,因为它使用线程而不是进程?

c++ - 为什么程序在仅加入 1 个线程但有 5 个线程时可以正常工作