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

Use ONE thread to span multiple connections or use MULTIPLE threads to loadtest?

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

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

问题:在不使用另一台机器的情况下,我可以做什么来启动和运行比我机器上允许的线程数更多的连接数?

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

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


我拥有的代码:

// 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 服务器的访问日志时间戳相结合,以获得您需要的时间。

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

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

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 的想法,可以用更少的线程处理数千个连接。

P.S。 post How do I write a correct micro-benchmark in Java? 值得一读,因为大多数原则(如热身、时机和其他一些原则)仍然适用于宏观层面。