2、RoCE网络基础:以太网流控机制(PFC)、ECN拥塞控制、DCB配置与无损网络构建
各位好,我们接着聊RoCE。上一章我们讲了RDMA的基本概念,说白了就是把数据从一台机器的内存,直接搬到另一台机器的内存里,不经过CPU折腾。但这里有个大问题——传统以太网是会丢包的。而RDMA最怕的就是丢包,一丢包性能直接崩盘。
为什么会这样?因为RDMA的传输层(比如InfiniBand或RoCE的RC服务)用的是Go-Back-N重传机制。丢一个包,后面所有的包都得重传。我当年在机房调一个存储集群,就因为网卡上有个小小的CRC错误,整个集群的IO延迟从100微秒飙到了5毫秒。嗯,从那以后,我对无损网络就有了执念。
所以,要跑RoCE,必须先搞定以太网的流控和拥塞控制。今天我们就来拆解这几个核心机制:PFC、ECN、DCB,以及如何把它们拼成一张无损网络。
2.1 以太网流控机制(PFC)
先说说PFC(Priority Flow Control,优先级流控)。传统以太网有个802.3x流控,但它是一刀切的——要停全停,要放全放。这在多业务混跑的场景下根本没法用。你想想看,存储流量和视频流量混在一起,总不能因为视频卡了,就把存储也掐了吧?
PFC解决了这个问题。它把网络流量分成8个优先级(802.1p),每个优先级可以独立做流控。具体怎么做的?靠一个叫PAUSE帧的东西。
当接收端的缓冲区快满了,它会发一个PAUSE帧给发送端,说:「兄弟,优先级3的流量先停一停,给我X纳秒的时间消化一下。」发送端收到后,就会暂停该优先级的发送。
我在项目中遇到过一个问题:PFC的PAUSE帧如果配置不当,会导致「死锁」——两个交换机互相发PAUSE,谁也不让谁,流量就卡死了。后来我养成了一个习惯:PFC的阈值一定要留够余量,别等到缓冲区快满了才发PAUSE。
2.2 ECN拥塞控制
PFC是治标的,ECN(Explicit Congestion Notification,显式拥塞通知)才是治本的。ECN不是靠停发流量来解决问题,而是提前告诉发送端:「哥们儿,前面有点堵了,你慢点发。」
ECN的工作原理其实很简单:
- 交换机检测到队列长度超过阈值,就在IP头里打一个标记(CE,Congestion Experienced)。
- 接收端收到带CE标记的包后,在ACK里把这个信息反馈给发送端。
- 发送端收到反馈,主动降低发送速率。
你看,这是端到端的闭环控制。相比PFC那种粗暴的「停-等」机制,ECN优雅得多。我个人习惯是把ECN和PFC配合使用:ECN做主动降速,PFC做最后一道防线。
这里有个关键参数:ECN的阈值。阈值设得太低,发送端频繁降速,带宽利用率上不去;设得太高,拥塞已经发生了才通知,延迟就上来了。我一般建议从队列深度的50%开始调,然后根据实际流量模式微调。
2.3 DCB(数据中心桥接)配置
DCB(Data Center Bridging)是一组IEEE标准的总称,目的是让以太网能承载多种类型的流量,并且保证每种流量都能拿到它需要的服务质量。说白了,就是给网络做「精细化管理」。
DCB主要包括以下几个组件:
| 组件 | 标准 | 作用 |
|---|---|---|
| PFC | 802.1Qbb | 优先级流控,防止丢包 |
| ETS | 802.1Qaz | 带宽分配,保证每个优先级拿到承诺的带宽 |
| DCBX | 802.1Qaz | 自动协商DCB参数,减少手工配置 |
| QCN | 802.1Qau | 拥塞通知(已被ECN取代) |
配置DCB的时候,我建议先做流量分类。把存储流量放到最高优先级(比如优先级3),管理流量放到最低优先级(优先级0)。然后给每个优先级分配带宽比例。比如:
# 示例:在Cisco Nexus交换机上配置DCB
class-map type qos match-all STORAGE
match cos 3
class-map type qos match-all MANAGEMENT
match cos 0
policy-map type qos DCB-POLICY
class STORAGE
set qos-group 3
bandwidth percent 60
class MANAGEMENT
set qos-group 0
bandwidth percent 10
class class-default
set qos-group 1
bandwidth percent 30
interface Ethernet1/1
service-policy type qos input DCB-POLICY
priority-flow-control mode on
2.4 无损网络构建
好了,前面讲了这么多,最终目标就是构建一张无损网络。什么叫无损?说白了就是零丢包。在RoCE的场景下,丢包率必须低于10^-12,否则RDMA的性能会急剧下降。
构建无损网络,我总结了一个「三步走」的方法:
- 第一步:启用PFC。在所有的交换机端口和网卡上,为RoCE流量启用PFC。注意,不要为所有流量都开PFC,只给需要无损的优先级开。
- 第二步:配置ECN。在交换机上设置合理的ECN阈值,让发送端能主动降速,避免触发PFC。
- 第三步:调优缓冲区。交换机的缓冲区大小直接影响PFC和ECN的效果。缓冲区太小,容易触发PFC;缓冲区太大,延迟会变高。
下面这张图展示了无损网络的核心逻辑:
最后,我想强调一点:无损网络不是一锤子买卖。部署完成后,一定要持续监控。我习惯用以下指标来评估无损网络的质量:
- PFC PAUSE帧计数:如果某个端口的PAUSE帧数量持续增长,说明ECN没调好,或者流量超过了网络容量。
- ECN标记率:正常情况下应该在1%以下。如果超过5%,说明拥塞比较严重了。
- RDMA重传率:这是最直接的指标。重传率超过0.1%,就要排查问题了。
好了,这一章的内容就到这里。无损网络是RoCE的基石,PFC、ECN、DCB这三板斧必须用好。下一章我们会深入RoCE的协议栈,看看数据是怎么在网卡和内存之间流转的。