Aeron 可以处理的最大消息是多少?

What is the largest message Aeron can process?

real-logic's Aeron 可以处理的最大消息大小是多少?

我知道 Aeron 适合小消息,但我希望在整个堆栈中使用单一协议,并且我们的一些消息很容易达到 100Mb 的大小。

文档不清楚哪些设置会影响此问题的答案。我担心的是默认缓冲区设置不允许这种大小的消息。还是缓冲区设置对最大应用程序消息大小没有影响?

我们在最近与 Aeron 的主要贡献者 Martin Thompson 的会议上讨论了这个问题。

不仅不能超过页面的大小,如果你看看Aeron presentation slides52到54,这些是不推送大文件的主要原因:

  • 如果消息大小接近 页面大小,它会让 Aeron 重复下一个序列 页面,即主要减速
  • 缓存流失
  • 虚拟机压力

长话短说,如果您使用 IPC,请将您的 100M 消息分成更小的块,最多为页面大小减去 header 的 1/4;或者 MTU 的大小减去 header(最大传输单元),如果你通过 UDP。它将提高吞吐量、消除管道堵塞并解决其他问题。 MTU 背后的逻辑是,偶尔 UDP 数据包会丢失,Aeron 从丢失的数据包开始一切都是 re-sent。所以,你想让你的块适合单个数据包以提高性能。

为了获得最佳性能,在您的 application-level 协议中,我会创建一个包含文件元数据和长度的第一个数据包,然后接收端在给定长度的硬盘上创建 memory-mapped 文件并填充它对于传入的块,其中每个块都包含偏移量和文件 ID(如果您想同时推送多个文件)。这样你就可以从 Aeron 缓冲区复制到 mmap 并完全避免垃圾collection。我希望这种文件传输的性能比大多数其他选项更快。

回答原题: 使用默认设置,最大邮件大小为 16MB 减去 32 字节 header。 要更改它,请在您的媒体 driver 上尝试更改 aeron.term.buffer.lengthaeron.term.buffer.max.length 系统属性(参见 Aeron Configuration Options)。在这里,术语缓冲区对应于文档其他部分中的 "page",实际上,在某些方面类似于 OS 内存页。而 term.buffer.max.length 则配置了 buffers/pages 轮换的数量。