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 的工作原理:
- 交换机检测到某个优先级队列的缓冲区超过阈值(比如 XOFF 阈值)。
- 交换机向发送端发送一个 PFC 暂停帧,里面包含了要暂停的优先级和暂停时长。
- 发送端收到暂停帧后,停止发送该优先级的数据。
- 交换机缓冲区水位下降,低于 XON 阈值后,发送恢复帧。
- 发送端恢复发送。
关键点: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 的核心逻辑:
- 速率计算:发送端维护一个速率(Rate),初始值可以很大。
- ECN 反馈:接收端收到 CE 标记后,生成 CNP(Congestion Notification Packet)发回给发送端。
- 速率调整:发送端收到 CNP 后,按比例降低速率(比如乘以 0.875)。
- 速率恢复:如果一段时间内没有收到 CNP,发送端会尝试增加速率(比如加一个小步长)。
- PFC 兜底:如果速率调整不及时,缓冲区还是满了,PFC 会触发暂停帧,防止丢包。
警告:DCQCN 的参数调优非常敏感。比如 CNP 的生成频率、速率恢复的步长、ECN 的阈值等。调得不好,要么拥塞控制太激进(性能低下),要么太保守(丢包)。我建议先用默认参数跑通,再根据实际流量模式微调。
2.5 知识体系总览:一张图看懂
下面这张图,我把 PFC、ECN、DCQCN 的关系画出来了。你一看就明白。
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 网络。下一章我们会深入聊聊如何用工具抓包分析这些机制是否正常工作。