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



上下文:我正在用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 负载生成器,将它们与来自 Web 服务器的访问日志时间戳相结合,以获得您需要的时间。

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

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

这个想法是否会导致同步成本太高而无法具有 适当的响应时间 GAPH?

你必须衡量这一点。

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

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

我该怎么做才能启动和运行超过允许的连接数 我的机器上的线程数不使用另一台机器?

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

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

附言帖子 如何在 Java 中编写正确的微基准测试? 值得一读,因为大多数原则,如热身、定时和其他一些原则仍然适用于宏观层面。

相关内容

  • 没有找到相关文章

最新更新