当前位置: 首页 > 知识库问答 >
问题:

运输基准的不同结果

蔚弘量
2023-03-14

我为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

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

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

  • 单线程https://github.com/easy-logic/transport-benchmarks/blob/master/aeron-ping/src/main/java/html" target="_blank">io/easylogic/benchmarks/aeronpingbenchmarkjlbhsinglethread.java
  • 线程发布者/线程接收者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
  • 线程发布者/线程接收者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

  • io.easyLogic.benchmarks.AeronPingBenchmarkJLBHSingleThread(默认)
  • IO.EasyLogic.Benchmarks.AeronPingBenchmarkJLBHSeparateThread
  • IO.EasyLogic.Benchmarks.AeronPingBenchmarkHDR直方图

共有1个答案

后树
2023-03-14

您会看到不同的结果,因为基准并不是在测量相同的东西。

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消息将无法按时发送,而且所有其他消息也将因该暂停而延迟。因此,联合联络小组正在努力避免协调疏漏问题。它似乎也有一些逻辑来纠正CO并且它在您的基准测试中是活跃的(例如corretoring for co-ordinated:true),这也可能会扭曲结果。

最后,AeronPingBenchmarkJlbhSeparateThread基准测试的结果更糟,因为现在您看到了队列效应。发送方发送的速度更快,然后接收方就可以消耗建立起来的队列,所有的事情都以最大容量运行,延迟也就白费了。此外,您的背压处理代码也不正确,即您不能对两个线程使用相同的idleStrategy实例。你需要有两个。

看看Real-Logic/benchmarks项目,它包含Aeron、gRPC和Kafka的发送/接收样式的基准测试。它有自己的基准测试工具LoadTestRig,用于照顾或预热、测量、直方图等,为其他系统添加基准测试是很简单的。

 类似资料:
  • 我通过JMH进行了一些基准测试 假设我在一个Java文件中列出了三个基准测试 每种方法都对服务于相同目的的不同算法进行基准测试。当我一起运行所有基准测试时,与逐个运行基准测试相比,结果会有所不同。 例如,在Java文件上仅使用onw基准执行JMH运行。 如果只运行此方法,此方法的结果会更好,但是如果使用更多基准,结果会更差。 假设基于结果的基准测试 我还尝试改变基准的顺序(按字典顺序执行),结果是

  • 我使用JMH对DOM解析器进行基准测试。我得到了非常奇怪的结果,因为第一次迭代实际上比后面的迭代运行得更快 有人能解释为什么会这样吗?此外,百分位数和所有数字意味着什么?为什么在第三次迭代后它开始变得稳定?一次迭代是否意味着整个基准测试方法的一次迭代?下面是我正在运行的方法

  • 当我跑的时候。使用CPLEX的NET 4应用程序,我在不同的机器上得到不同的输出。在我的开发机器上,CPLEX输出一个结果(异常并卡在某个大值上),在所有其他机器上,结果都可以。 首先,我认为它与操作系统有关,因为我的开发机器上同时有视窗7 x64和视窗8 x64,所以我尝试在两个系统上运行应用程序。结果是一样的——有缺陷。 然后我试着在两台不同的台式机上运行,效果很好。我甚至在虚拟机内部进行了尝

  • 我正在使用JMH对自定义集合实现进行性能测试。 我想模仿一个场景,其中读取次数比写入次数大10倍。 我使用了这个非对称基准测试示例,并创建了一个包含10个读取线程和1个写入线程的组: 我使用参数运行测试。在报告中,变量对所有基准测试都是相同的: 这是否意味着实验中的读取次数等于写入次数?如果有,如何正确实施?更一般的问题是:我在这个设置中遗漏了什么吗?

  • 问题内容: 我有一个奇怪的问题,如果可以解决,那就太好了。出于调试目的(以及其他一些目的),我在标准输出上编写了控制台Java应用程序的日志。在标准输出上写一些内容,在标准错误上打印一些错误,例如错误。问题是这两个没有完全同步,因此打印线的顺序并不总是正确的。我猜这是因为打印了很多东西,并且碰巧一个输出的缓冲区已满,所以其他输出在第一个输出刷新其缓冲区之前就已打印出来。 例如,我想这样写: 有时打

  • 只是所有的估计日期都不一样… 我的问题是,我似乎无法针对特定的实例。我只能选择整个方法(固定费率),我检查了我的方法实例ID,因为它们是唯一的: 但只有当我把作为php开关方法的一个例子时,它才起作用。2,3,4,5,7不工作。 这是我的代码: 代码显然会对我所有的运输方法产生所有相同的估计。 谢谢! 我在用这个: 大小写'flat_rate':$标签。='Lieferzeit: 2-3标签平';