RoCE基础回顾:RoCEv1/v2协议栈、拥塞控制机制、无损网络与PFC
RoCE(RDMA over Converged Ethernet)的核心思想,是让RDMA能力跑在以太网物理层之上,从而复用成熟的以太网生态与运维体系。但以太网原本是“尽力而为”的网络,而RDMA对丢包极其敏感——一个微小的丢包就可能让吞吐率断崖式下降。因此,理解RoCE必须从协议栈分层、拥塞控制、无损网络三个维度入手。
2.1 RoCEv1与RoCEv2协议栈:从二层到三层的演进
RoCEv1是最早的版本,它将RDMA数据封装在以太网二层帧中,协议类型字段为0x8915。这意味着RoCEv1只能在同一个二层广播域内通信,无法跨VLAN或子网。RoCEv2则引入了UDP封装(目的端口4791),将RDMA载荷放入UDP数据报中,从而可以借助标准IP路由跨三层传输。两者对比如下:
| 维度 | RoCEv1 | RoCEv2 |
|---|---|---|
| 封装位置 | 以太网二层直接承载 | UDP/IP(L3/L4)承载 |
| 协议标识 | EtherType 0x8915 | UDP目的端口4791 |
| 路由能力 | 仅限二层广播域 | 支持三层路由与跨子网 |
| 拥塞信号 | 依赖ECN(L2 DSCP映射) | 依赖ECN + CNP(RoCEv2新增) |
| 适用场景 | 单集群低延迟 | 大规模数据中心组网 |
RoCEv2的报文结构从外到内依次为:以太网头 → IP头 → UDP头(目的端口4791) → IB BTH(Base Transport Header) → 载荷。其中BTH中的OpCode决定了报文类型(如SEND、WRITE、READ、ATOMIC),而PSN(Packet Sequence Number)用于可靠连接的乱序重组与重传判断。
2.2 拥塞控制机制:从ECN到CNP的闭环
RoCEv2的拥塞控制并非端到端TCP式的滑动窗口,而是依赖交换机ECN标记 + 接收端CNP反馈的闭环机制。其核心流程如下:
- 发送端以当前速率发送数据包,IP头中的ECT(ECN-Capable Transport)位被置1,表示该流支持ECN。
- 交换机检测到队列深度超过阈值时,将CE(Congestion Experienced)位置1,但不会丢包。
- 接收端收到CE标记的报文后,生成一个CNP(Congestion Notification Packet)报文,反向发送给发送端。
- 发送端收到CNP后,按照DCQCN算法将发送速率降低(通常乘以0.5的因子),并进入恢复阶段,逐步增加速率。
α:速率降低因子,默认0.5,每次收到CNP时执行rate = rate × (1 - α/2)RPT(Rate Increase Period):无CNP时每经过RPT时间,速率增加约5%NP(Notification Point):交换机ECN阈值,通常设置为队列长度超过缓存30%时标记
值得注意的是,RoCEv1没有CNP机制,它只能依赖发送端的超时重传和交换机端口的PFC暂停帧来间接控制拥塞。而RoCEv2的CNP报文本身也需要PFC通道来保证不丢失——如果CNP丢了,发送端将无法感知拥塞,速率不会下降,最终导致队列溢出丢包。
2.3 无损网络与PFC:构建零丢包以太网
PFC(Priority-based Flow Control,IEEE 802.1Qbb)是构建无损网络的核心机制。它将物理链路划分为最多8个优先级队列,每个队列独立进行流控。当某个队列的缓存占用超过阈值时,接收端向发送端发送暂停帧(Pause Frame),请求发送端暂停该优先级队列的发送,直到缓存恢复。
PFC的工作流程如下:
发送端交换机端口A ──数据帧──▶ 接收端交换机端口B
│
│ 端口B队列深度 > XOFF阈值
▼
端口B发送PFC暂停帧(携带优先级位图)
│
▼
端口A收到暂停帧,停止发送该优先级流量
│
│ 端口B队列深度 < XON阈值
▼
端口B发送恢复帧(或等待超时),端口A恢复发送
PFC的配置涉及两个关键阈值:XOFF(触发暂停的队列深度)和XON(恢复发送的队列深度)。合理的阈值设置需要权衡:XOFF设置过小会导致频繁暂停,降低链路利用率;设置过大会增加延迟,且可能造成缓冲区溢出。
2.4 案例:RoCEv2集群中的PFC风暴复盘
某金融数据中心部署了RoCEv2集群,用于分布式存储的副本同步。某次版本升级后,业务反馈存储延迟从平均200μs飙升至5ms,且伴随大量TCP重传。
排查过程:
- 检查交换机计数器,发现所有端口上PFC暂停帧数量急剧增加,每秒超过10万帧。
- 使用
ethtool -S eth0 | grep pfc查看服务器网卡PFC计数,确认是优先级3队列触发暂停。 - 进一步分析流量,发现存储同步流量被标记为优先级3,而另一条备份流量也被错误标记为优先级3。
- 两条流量汇聚到同一交换机端口时,瞬时突发导致队列溢出,触发PFC暂停,而暂停又导致TCP超时重传,形成恶性循环。
根因与修复:备份流量不应使用无损优先级。将备份流量重新标记为优先级1(尽力而为),并调整交换机ECN阈值从30%降至20%,使拥塞信号更早触发。修复后PFC暂停帧下降99%,延迟恢复至正常水平。
- PFC是“最后一道防线”,不应作为常规拥塞控制手段;优先依赖ECN+CNP的端到端拥塞控制。
- 不同优先级队列必须对应不同的流量类型,严禁将无损流量与尽力而为流量混用同一优先级。
- 部署监控时,不仅要看端口流量,还要监控PFC暂停帧计数和ECN标记计数,这两个指标是判断无损网络健康度的关键。
2.5 常见误区与设计建议
| 误区 | 后果 | 正确做法 |
|---|---|---|
| 认为RoCEv2有UDP头就具备拥塞控制 | UDP不提供可靠传输,拥塞控制完全依赖ECN+CNP | 必须部署支持ECN的交换机并启用DCQCN |
| PFC阈值设置过大 | 延迟增加,且可能引发PFC死锁 | XOFF设为缓存30%,XON设为缓存10% |
| 所有流量都走无损队列 | TCP流量被PFC阻塞,造成协议间干扰 | 仅RDMA流量使用无损队列,TCP使用尽力而为队列 |
| 忽略CNP报文的丢失 | 拥塞无法反馈,最终丢包 | 确保CNP使用高优先级队列,且该队列也受PFC保护 |
在实际部署中,建议遵循以下设计原则:
- RoCEv2网络必须启用ECN,并将DSCP值映射到交换机队列,确保端到端QoS策略一致。
- PFC只配置在无损优先级队列上,通常为优先级3或4,其他队列保持尽力而为。
- 服务器网卡开启DCQCN算法,并设置合理的速率恢复时间(RPT),避免速率振荡。
- 监控系统需采集PFC暂停帧计数、ECN标记计数、CNP计数三个指标,任何一项异常都预示着网络健康度下降。