运输基准的不同结果

Different results for transport benchmarks

我为我关于 Aeron 的演示做了一些基准测试,但我发现如果我对相同的传输使用不同的工具,我得到的结果会略有不同。

例如,如果我使用 HDR histograms,我得到的结果与维护人员在测试中获得的数字一致:

另外,我为 java 基准尝试了另一个很酷的库 - JLBH

但结果让我有点困惑...

首先,我得到了 2 个不同版本的基准测试:

似乎 JLBH 鼓励为侦听器使用另一个线程,至少这样一些设置(例如吞吐量)更有意义,并且初始预热会打印一些统计信息。但我可能错得很厉害,如果我错了,请纠正我。

但更重要的是,这些基准测试的结果完全不同,与我在 HDR 中看到的结果不一致:

我很有可能在某个地方搞砸了,但就目前而言,所有 3 个基准测试看起来或多或少与我相似,但使用了不同的工具集。

非常感谢!

P.S.

如果有人想自己尝试,您只需 运行 这个脚本 https://github.com/easy-logic/transport-benchmarks/blob/master/run-aeron.sh

选择你想要的版本 运行 在此处更改参数 mainClassNamehttps://github.com/easy-logic/transport-benchmarks/blob/master/aeron-ping/build.gradle#L6

有3个选项:

您看到不同的结果,因为基准测试衡量的不是同一件事。

AeronPingBenchmarkHdrHistogram 仅测量 理想情况 ,即正在发送一条消息,然后立即使用。由于发送方和接收方 运行 同步,因此没有排队效应。创建新消息时,它会获得此特定发送尝试的时间戳。但是,对于整个基准测试应该 运行 多长时间没有限制,因此无法定义 发送速率 。想象一下,其中一个发送需要长时间的 GC 暂停(例如 1 秒),那么只有这个发送结果会很糟糕,但其余的不会受到影响。

JLBH 基准测试不同,因为它们添加了时间概念。例如,在您的结果中,单个 运行 的持续时间为 5 秒,例如:

   Run time: 5.0s
   Correcting for co-ordinated:true
   Target throughput:10000/s = 1 message every 100us
   End to End: (50,000)       50/90 99/99.9 99.99 - worst was 14 / 16  20 / 1,660  3,770 - 4,010
   OS Jitter (5,853)          50/90 99/99.9 99.99 - worst was 1.8 / 7.0  30 / 181  3,770 - 3,770

这将基准从发送 50K 条消息更改为在 5 秒内发送 50K 条消息。在同一示例中,JLBH 确定目标速率为 10K/秒,它将使用此信息计算消息开始时间 (startTimeNS)。在这种情况下,1 秒的 GC 暂停会影响此事件之后的所有消息,因为至少有 10K 条消息不会按时发送,而且所有其他消息都会因此暂停而延迟。因此 JLBH 试图避免 Coordinated Omission Problem。它似乎也有一些逻辑来纠正 CO,并且它在您的基准测试中很活跃(例如 Correcting for co-ordinated:true),这也可能会扭曲结果。

最后,AeronPingBenchmarkJlbhSeparateThread 基准测试的结果更差,因为现在您看到了排队效应。发送方发送的速度比接收方可以消耗队列建立的速度快,所有 运行s 的最大容量和延迟都耗尽了。此外,您的 back-pressure 处理代码不正确,即您 不能 对两个线程使用相同的 IdleStrategy 实例。你需要有两个。

看看 real-logic/benchmarks project which contains send/receive-style benchmarks for Aeron, gRPC and Kafka. It has its own benchmarking harness LoadTestRig 的注意事项或预热、测量、直方图等。为其他系统添加基准测试是微不足道的。