5

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

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

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

4

1 回答 1

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.length要更改它,您可以在您的媒体驱动程序上尝试更改 aeron.term.buffer.max.length系统属性(请参阅Aeron 配置选项)。在这里,术语缓冲区对应于文档其他部分中的“页面”,实际上在某些方面类似于操作系统内存页面。而 term.buffer.max.length 配置轮换的缓冲区/页面数。

于 2017-06-21T12:20:29.707 回答