Aeron 可以处理的最大消息是什么?

Eri*_*ten 5 network-programming aeron

Aeron可以处理的最大消息真实逻辑的大小是多少?

我意识到 Aeron 适合处理小消息,但是我希望在我们的堆栈中有一个单一的协议,并且我们的一些消息很容易达到 100Mb 的大小。

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

Ale*_*kka 5

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

不仅不能超过页面大小,如果你看看Aeron 演示幻灯片52 到 54,这些是不推送大文件的主要原因:

  • 几乎可以保证页面错误,如果消息大小接近页面大小,它将使 Aeron 与下一页重复该序列,即主要减速
  • 缓存流失
  • 虚拟机压力

长话短说,如果你使用 IPC,将你的 100M 消息分成更小的块,最多 1/4 的页面大小减去标题;或者 MTU 的大小减去报头(最大传输单位),如果你通过 UDP。它将提高吞吐量,消除管道堵塞并解决其他问题。MTU 背后的逻辑是,有时 UDP 数据包会丢失,并且 Aeron 会从丢失的数据包开始重新发送所有内容。因此,为了提高性能,您希望块适合单个数据包。

为了获得最佳性能,在您的应用程序级协议中,我将创建第一个具有文件元数据和长度的数据包,然后接收方在给定长度的 HDD 上创建内存映射文件,并用传入的块填充它,其中每个块都包含偏移量和文件 ID(如果您想同时推送多个文件)。这样您就可以从 Aeron 缓冲区复制到 mmap 并完全避免垃圾收集。我希望这种文件传输的性能比大多数其他选项更快。

回答原始问题: 在默认设置下,最大消息大小为 16MB 减去 32 字节标头。要更改它,您可以在您的媒体驱动程序上尝试更改 aeron.term.buffer.lengthaeron.term.buffer.max.length系统属性(请参阅Aeron 配置选项)。在这里,术语缓冲区对应于文档其他部分中的“页面”,实际上,在某些方面与操作系统内存页面类似。而 term.buffer.max.length 配置轮换缓冲区/页面的数量。