2、RoCE网络基础:无损网络概念、PFC流控机制、ECN拥塞通知、DCQCN拥塞控制算法

各位同学,今天咱们聊聊RoCE网络的根基——无损网络。说实话,很多人一上来就调参数、配流控,结果网络还是丢包。为什么?因为没搞懂底层这几个核心机制是怎么配合的。

我个人习惯,讲技术之前先画个图。你看下面这张图,就是RoCE无损网络的四根柱子:

RoCE无损网络核心机制 RoCE 无损网络 ① 无损网络概念 ② PFC 流控机制 ③ ECN 拥塞通知 Explicit Congestion Notification ④ DCQCN 拥塞控制 Data Center Quantized Congestion Notification 四者协同工作,构建零丢包、低延迟的RDMA网络

这四个东西不是孤立的,它们是一条链上的四个环节。我当年刚接触RoCE时,也以为只要开了PFC就万事大吉,结果线上出了大问题——后面我会讲到这个坑。

2.1 无损网络概念

什么叫无损网络?说白了,就是网络里不允许丢包。你可能会问:TCP不是也会重传吗?丢几个包怕什么?

嗯,这里要注意:RDMA和TCP完全不同。TCP丢包了可以重传,顶多慢一点。但RDMA一旦丢包,性能直接断崖式下跌。我在项目中遇到过,某个存储集群因为偶尔丢包,IOPS从100万掉到20万,业务方直接炸了。

为什么会这样?因为RDMA的传输模式是"直通"的——数据直接从网卡到应用内存,中间不经过操作系统。一旦丢包,网卡要等超时重传,这个等待时间对高速网络来说是致命的。

所以,无损网络的核心目标就一个:零丢包。为了实现这个目标,我们需要三样东西:

  • 流控机制——防止发送方太快,把接收方撑爆
  • 拥塞通知——告诉发送方"路上堵了,慢点"
  • 拥塞控制——发送方收到通知后,怎么调整速率

下面我一个一个讲。

2.2 PFC流控机制

PFC,全称Priority Flow Control,优先级流控。它是IEEE 802.1Qbb标准定义的。

你可以把PFC想象成一个"红绿灯系统"。每个数据帧都带有一个优先级标签(0-7),PFC为每个优先级独立做流控。

工作原理是这样的:

  1. 接收方的缓冲区快满了,就发一个PFC暂停帧给发送方
  2. 暂停帧里写着:"优先级3的流量,请停X微秒"
  3. 发送方收到后,乖乖暂停对应优先级的发送
  4. 等缓冲区有空了,接收方再发一个恢复帧(或者等暂停时间到)

关键点:PFC是逐跳(hop-by-hop)的流控,不是端到端的。也就是说,每个交换机都会参与流控决策。

我曾经踩过一个坑:有次部署RoCE网络,PFC配置不当,导致一个优先级暂停了,结果其他优先级也受影响。后来发现是交换机队列共享缓冲区的问题——一个队列堵了,其他队列也拿不到缓冲区。这就是所谓的"PFC死锁"。

⚠️ 避坑指南:PFC不是万能的。过度依赖PFC会导致拥塞扩散(Congestion Spread),一个端口堵了,上游所有端口都跟着堵。我建议PFC只作为最后一道防线,不要让它频繁触发。

2.3 ECN拥塞通知

ECN,Explicit Congestion Notification,显式拥塞通知。它定义在RFC 3168中。

PFC是"事后"的——已经快满了才通知。ECN是"事前"的——交换机检测到队列深度超过阈值,就在IP头里打一个标记(CE码点),告诉接收方"要堵了"。

ECN的工作流程:

  • 发送方发数据包,IP头里ECT位设为1(表示支持ECN)
  • 交换机检测到拥塞,把ECT改为CE(Congestion Experienced)
  • 接收方收到CE标记的包,生成一个带ECN回显的ACK
  • 发送方收到回显,就知道"路上堵了",主动降速

你想想看,ECN比PFC高明在哪?它让发送方主动降速,而不是被动暂停。这样就不会出现"一停全停"的连锁反应。

💡 个人经验:ECN阈值设置很关键。设得太低,频繁触发降速,带宽利用率上不去;设得太高,等触发时已经堵死了。我一般建议从队列深度的50%开始调,然后根据实际流量微调。

2.4 DCQCN拥塞控制算法

DCQCN,全称Data Center Quantized Congestion Notification。它是微软和Mellanox联合提出的,专门为RoCEv2设计的拥塞控制算法。

DCQCN把ECN和速率控制结合起来了。它的核心思想是:

  1. 发送方维护一个速率,初始值可以很高
  2. 收到ECN标记后,速率乘以一个系数(比如0.8)降下来
  3. 没收到ECN标记时,速率慢慢往上加
  4. 加和减的幅度都是量化的(Quantized),所以叫DCQCN

DCQCN有几个关键参数:

参数 含义 典型值
α (Alpha) 拥塞因子,决定降速幅度 0.8 ~ 0.9
G 速率增加步长 5 ~ 10 Mbps
Kmin / Kmax ECN标记的队列阈值 Kmin=5KB, Kmax=50KB
Time Reset 速率恢复时间 55 μs

我记得有一次调DCQCN参数,业务方说带宽上不去。我一看,α设成了0.5,降速太猛了。每次收到ECN标记,速率直接砍半,恢复又慢,带宽自然上不去。后来改成0.85,问题解决了。

核心要点:DCQCN的精髓在于"快降慢升"——遇到拥塞快速降速,拥塞解除后缓慢恢复。这个策略保证了网络的稳定性。

2.5 四者如何协同

最后,我总结一下这四个机制怎么配合:

  • DCQCN是大脑,负责决策——什么时候降速、降多少
  • ECN是眼睛,负责感知——告诉大脑"路上堵了"
  • PFC是手脚,负责执行——当大脑来不及反应时,先物理上停住
  • 无损网络是目标——所有机制都是为了实现零丢包

实际部署时,我建议的优先级是:先调好DCQCN参数,让ECN在拥塞初期就起作用。PFC作为兜底,不要让它频繁触发。如果发现PFC计数器一直在涨,说明DCQCN没调好,或者ECN阈值设得太高了。

好了,这一章的内容就到这里。无损网络是RoCE的基石,搞懂了这些,后面的多路径和负载均衡才能玩得转。