我为我关于aeron的演讲做了一些基准测试,但是我发现如果我对同一个交通工具使用不同的工具,我得到的结果会略有不同。
例如,如果我使用hdr直方图,我得到的结果与维护人员在测试中得到的数字一致:
我的代码https://github.com/easy-logic/transport-benchmarks/blob/master/aeron-ping/src/main/java/io/easylogic/benchmarks/aeronpingbenchmarkhdrhistogram.java
结果https://github.com/easy-logic/transport-benchmarks/blob/master/results/aeron-docker-hdr.txt
另外,我还尝试了另一个很酷的java基准库——jlbh
但结果让我有点困惑。。。
首先,我得到了两个不同版本的基准测试:
单螺纹https://github.com/easy-logic/transport-benchmarks/blob/master/aeron-ping/src/main/java/io/easylogic/benchmarks/aeronpingbenchmarkjlbhsinglethread.java
1线程发布器/1线程接收器https://github.com/easy-logic/transport-benchmarks/blob/master/aeron-ping/src/main/java/io/easylogic/benchmarks/aeronpingbenchmarkjlbhseparatethread.java
似乎jlbh鼓励为侦听器使用另一个线程,至少在这种情况下,某些设置(如吞吐量)更有意义,并且初始预热打印一些统计数据。但我可能大错特错,如果我错了,请纠正我。
但更重要的是,这些基准的结果完全不同,与我在hdr中看到的不一致:
单螺纹https://github.com/easy-logic/transport-benchmarks/blob/master/results/aeron-docker-jlbh-sigle-thread.txt
1线程发布器/1线程接收器https://github.com/easy-logic/transport-benchmarks/blob/master/results/aeron-docker-jlbh-separate-threads.txt
我很有可能在某个地方搞砸了,但就目前而言,所有3个基准测试看起来或多或少与我相似,但使用的工具集不同。
非常感谢!
附笔
如果有人想自己尝试这个,你只需要运行这个脚本https://github.com/easy-logic/transport-benchmarks/blob/master/run-aeron.sh
要选择要运行的版本,请更改参数 mainClassName
在这里:https://github.com/easy-logic/transport-benchmarks/blob/master/aeron-ping/build.gradle#l6
有3个选项:
io.easylogic.benchmarks.aeronpingbenchmarkjlbhsinglethread(默认值)
io.easylogic.benchmarks.aeronpingbenchmarkjlbhseparatethread
io.easylogic.benchmarks.aeronpingbenchmarkhdrhistogram版本
1条答案
按热度按时间u4vypkhs1#
你会看到不同的结果,因为这些基准衡量的不是同一件事。
AeronPingBenchmarkHdhrhistogram仅测量理想情况,即一条消息正在发送,然后立即被消耗。由于发送方和接收方在lockstep中运行,因此没有排队效果。创建新消息时,它将获取此特定发送尝试的时间戳。但是,对于整个基准测试应该运行多长时间没有限制,因此不能定义发送速率。假设其中一个发送需要很长的gc暂停(例如1秒),那么只有这个发送结果是不好的,而其余的则不受影响。
jlbh基准是不同的,因为它们添加了时间的概念。例如,在您的结果中,一次跑步的持续时间为5秒,例如:
这将基准从发送50k消息更改为在5秒内发送50k消息。在同一个示例中,jlbh确定目标速率为10k/sec,它将使用此信息来计算消息开始时间(
startTimeNS
). 在这种情况下,gc暂停1秒将影响此事件之后的所有消息,因为至少10k消息不会按时发送,但所有其他消息也会因此暂停而延迟。因此,jlbh试图避免协调遗漏问题。它似乎也有一些逻辑来修正co,并且它在您的基准测试中是活跃的(例如。Correcting for co-ordinated:true
)这也可能会扭曲结果。最后,aeronpingbenchmarkjlbhseparatethread基准测试的结果更糟糕,因为现在您看到了排队效应。发送方的发送速度快于接收方的速度,因为队列越长,所有东西都以最大容量运行,延迟就越慢。此外,您的背压处理代码不正确,即您不能使用相同的代码
IdleStrategy
两个线程的示例。你需要两个。看看真正的逻辑/基准测试项目,它包含了针对aeron、grpc和kafka的发送/接收风格的基准测试。它有自己的基准测试工具loadtestrig,负责处理或预热、测量、直方图等,为其他系统添加基准测试是很简单的。