2、RoCE网络架构:无损网络概念、PFC流控机制、ECN拥塞通知、DCQCN拥塞控制

好,咱们直接切入正题。RoCE 网络,说白了就是让 RDMA 跑在以太网上。但以太网天生是“尽力而为”的,会丢包。RDMA 这玩意儿对丢包零容忍,一丢包性能就崩。所以,我们得把以太网改造成“无损”的。怎么改?靠的就是 PFC、ECN 和 DCQCN 这三板斧。

2.1 无损网络:到底是个什么概念?

无损网络,不是真的不丢包。而是通过一系列机制,把丢包率降到极低,低到 RDMA 可以忽略不计。我个人习惯把无损网络比作一条“全封闭的高速公路”。

  • 没有红绿灯:数据流一路绿灯,不会被交换机随意丢弃。
  • 有应急车道:当某个出口堵车时,有专门的机制让车流暂停,而不是直接撞车。
  • 有导航预警:前方拥堵,提前通知后面的车减速,避免连环追尾。

嗯,这里要注意,无损网络的核心目标只有一个:消除因缓冲区溢出导致的丢包。我在项目中遇到过,有些同事以为只要买了支持 PFC 的交换机就是无损了,结果配置不对,丢包更严重。说白了,无损是调出来的,不是买出来的。

2.2 PFC流控机制:以太网的“暂停帧”

PFC(Priority-based Flow Control),基于优先级的流量控制。它是无损网络的基石。你想想看,传统以太网交换机缓冲区满了怎么办?直接丢包。PFC 说:别急,我给你发个“暂停帧”,你先别发了,等我消化一下。

PFC 的工作原理:

  1. 交换机检测到某个优先级队列的缓冲区超过阈值(比如 XOFF 阈值)。
  2. 交换机向发送端发送一个 PFC 暂停帧,里面包含了要暂停的优先级和暂停时长。
  3. 发送端收到暂停帧后,停止发送该优先级的数据。
  4. 交换机缓冲区水位下降,低于 XON 阈值后,发送恢复帧。
  5. 发送端恢复发送。

关键点:PFC 是逐跳(hop-by-hop)的。也就是说,它只在相邻的两个设备之间起作用。比如服务器和交换机之间,或者交换机和交换机之间。

我曾经踩过一个坑:PFC 的暂停帧如果配置不当,或者线缆质量不好导致帧丢失,就会引发“PFC 风暴”。发送端一直等恢复帧,接收端以为还在暂停,整个链路就卡死了。所以,我建议在生产环境中一定要监控 PFC 计数器的增长情况。

2.3 ECN拥塞通知:让端到端“感知”拥堵

PFC 是本地急救,ECN(Explicit Congestion Notification)则是全局预警。ECN 让交换机在缓冲区快满时,不是直接丢包,而是在 IP 头里打一个标记(CE 码点)。接收端看到这个标记,就知道“路上堵了”,然后通知发送端减速。

ECN 的工作流程:

  • ECT 标记:发送端在 IP 头中设置 ECT(ECN Capable Transport),表示“我支持 ECN”。
  • CE 标记:交换机检测到拥塞,将 IP 头中的 ECT 改为 CE(Congestion Experienced)。
  • 反馈:接收端收到 CE 标记后,通过 ACK 或 NACK 告知发送端。
  • 减速:发送端根据反馈,降低发送速率。

小技巧:ECN 需要端到端支持。也就是说,从发送端到接收端,中间所有的交换机都必须开启 ECN 功能。否则,标记会被中间设备抹掉,白费功夫。

我记得有一次排查性能问题,发现 ECN 标记在某个交换机上被清零了。查了半天,原来是那台交换机的 ECN 配置没同步。你想想看,一个环节断了,整个链路就失去了拥塞感知能力。

2.4 DCQCN拥塞控制:RoCEv2 的“大脑”

DCQCN(Data Center Quantized Congestion Notification)是微软和 Mellanox 联合推出的拥塞控制算法,专门为 RoCEv2 设计。它结合了 PFC 的本地快速响应和 ECN 的全局反馈,是目前最主流的方案。

DCQCN 的核心逻辑:

  1. 速率计算:发送端维护一个速率(Rate),初始值可以很大。
  2. ECN 反馈:接收端收到 CE 标记后,生成 CNP(Congestion Notification Packet)发回给发送端。
  3. 速率调整:发送端收到 CNP 后,按比例降低速率(比如乘以 0.875)。
  4. 速率恢复:如果一段时间内没有收到 CNP,发送端会尝试增加速率(比如加一个小步长)。
  5. PFC 兜底:如果速率调整不及时,缓冲区还是满了,PFC 会触发暂停帧,防止丢包。

警告:DCQCN 的参数调优非常敏感。比如 CNP 的生成频率、速率恢复的步长、ECN 的阈值等。调得不好,要么拥塞控制太激进(性能低下),要么太保守(丢包)。我建议先用默认参数跑通,再根据实际流量模式微调。

2.5 知识体系总览:一张图看懂

下面这张图,我把 PFC、ECN、DCQCN 的关系画出来了。你一看就明白。

RoCE无损网络核心机制关系图 发送端 (服务器/网卡) 交换机 (缓冲区管理) 接收端 (服务器/网卡) ECN标记(CE) CNP拥塞通知包 PFC暂停帧 图例说明: 数据流(正常转发) ECN标记 / PFC暂停帧(控制信号) CNP拥塞通知(端到端反馈) 核心逻辑:发送端发送数据 → 交换机检测拥塞 → ECN标记数据包 → 接收端生成CNP → 发送端降速 兜底机制:如果降速不及时,交换机发送PFC暂停帧,强制发送端停止发送

2.6 实战中的避坑指南

说了这么多理论,来点实际的。我在部署 RoCE 网络时,总结了几条血泪教训:

问题 现象 根因 解决方案
PFC 死锁 链路吞吐量骤降为 0 PFC 暂停帧丢失或环路 启用 PFC watchdog,监控暂停帧计数
ECN 无效 拥塞时仍丢包 中间交换机未开启 ECN 逐跳检查 ECN 配置,确保端到端生效
DCQCN 震荡 速率忽高忽低 CNP 生成频率过高或过低 调整 CNP 生成间隔,建议 50-100μs
缓冲区不足 PFC 频繁触发 交换机缓冲区太小 增加缓冲区或优化流量整形

我的建议:刚开始调优时,不要一上来就动参数。先用默认配置跑通,然后用 iperf3 或 ib_write_bw 打流,观察 PFC 和 ECN 计数器的变化。我曾经花了一周时间调参数,最后发现是网卡固件版本不对。嗯,先确认基础环境,再谈优化。

好了,这一章的内容就到这里。PFC 是保底,ECN 是预警,DCQCN 是决策。三者配合,才能构建一个真正无损的 RoCE 网络。下一章我们会深入聊聊如何用工具抓包分析这些机制是否正常工作。


专注资料整理