Aeron MDC多播未达网络容量时发布性能随订阅者增多下降问题咨询
该现象并非Aeron本身的问题,绝大多数是MDC模式配置、使用方式不符合多订阅端场景要求导致的,具体分析和优化方案如下:
性能下降根因
- MDC模式选择问题:若你使用的是动态自适应MDC模式,发布端需要为每个订阅者单独维护发送窗口、NACK重传、流控状态,订阅者数量上升后,发布端的CPU、内存开销会线性增长。你当前150MB/s的发送速率下,很容易先触达发布端的CPU处理瓶颈,而非2GB/s的网络带宽瓶颈,进而触发反压。
- 反压触发维度不只有带宽:Aeron反压触发规则包含多维度阈值,除了网络带宽外,订阅端的接收窗口大小、Socket缓冲区大小、消费速度都会影响反压触发。只要任意一个订阅端消费不及时、接收缓冲区被占满,就会向发布端发送反压信号,拉低整体发送速率,和全局网络容量无关。
- 网卡处理瓶颈:单发布端所有流量从同一块网卡发出,即使总带宽远低于上限,网卡中断、数据包封装的开销也会随订阅者数量上升而增长,出现发送排队时也会触发反压。
多订阅端场景优化方案
- 切换静态MDC模式:如果订阅端IP固定,优先使用静态MDC模式,发布端仅需发送一份数据流,由交换机负责复制分发到各个订阅端,发布端处理开销不会随订阅者数量增长。配置时指定
aeron-mdc-static-endpoints参数填入所有订阅端的地址即可。 - 调整反压相关配置参数:
- 调大发布端
publication-term-buffer-length,建议最小不低于64MB,或设置为单条消息大小的1000倍以上 - 调大所有订阅端的
receiver-window-length和socket-rcvbuf参数,避免单个订阅端消费延迟拖慢全局发送速率 - 开启
aeron.spies.simulate.connection配置,降低本地订阅的连接开销
- 调大发布端
- 增加中转转发层:如果订阅端数量超过10个且IP不固定,可以部署1~2台独立的Aeron Archive节点作为流量中转,原业务发布端仅发送一份数据到中转节点,由中转节点负责向所有订阅端分发流量,避免业务发布端被多订阅端的处理开销拖累。
- 硬件层面优化:给发布端网卡开启多队列、RSS功能,将发布端的发送线程绑定到独立的CPU核心,减少上下文切换带来的性能损耗。
内容的提问来源于stack exchange,提问作者Chenxi Li
相关产品推荐
相关产品推荐

