无损网络架构:无损网络定义、PFC与ECN协同机制

4.1 无损网络的定义与适用边界

无损网络(Lossless Network)并非指网络在物理上永不丢包,而是指在拥塞窗口内,通过链路级流量控制与端到端拥塞控制,将报文丢失率控制在“对上层应用无感知”的水平。在RoCE(RDMA over Converged Ethernet)场景中,无损网络的核心目标是保证RDMA报文在交换机队列中不因缓冲区溢出而被丢弃,因为RDMA协议栈依赖硬件重传,一旦丢包,重传代价远高于TCP。

需要特别澄清的是,无损网络是一个逐跳(hop-by-hop)的链路层属性,而非全局属性。它依赖两个关键机制:

  • PFC(Priority-based Flow Control,基于优先级的流控):作用于链路层,防止某条物理链路上特定优先级的队列溢出。
  • ECN(Explicit Congestion Notification,显式拥塞通知):作用于网络层/传输层,将拥塞状态反馈给发送端,使其主动降速。

下图展示了无损网络在数据中心中的典型部署位置与协同关系。图中左侧为服务器A(发送端),右侧为服务器B(接收端),中间经过两台交换机。PFC作用于每一条物理链路(服务器-交换机、交换机-交换机),而ECN标记发生在交换机队列深度超过阈值时,最终由接收端将拥塞信息反馈给发送端。

RoCE无损网络:PFC与ECN协同机制 服务器A 发送端 RoCE网卡 优先级队列 3 ECN速率控制 ← 收到CNP后降速 交换机1 入向队列 队列深度 80% ECN标记阈值 Kmin=60% Kmax=90% PFC反压阈值 XOFF=95% XON=85% 交换机2 入向队列 队列深度 65% ECN标记阈值 Kmin=60% Kmax=90% PFC反压阈值 XOFF=95% XON=85% 服务器B 接收端 RoCE网卡 检测CE标记 生成CNP报文 数据报文 数据报文 数据报文 ECN置CE标记 ECN置CE标记 CNP(拥塞通知报文)反馈路径:接收端 → 发送端 PFC XOFF PFC XOFF 图例: 数据报文(RoCE v2) CNP反馈 PFC反压帧 ECN标记区域

4.2 PFC工作原理与配置要点

PFC(IEEE 802.1Qbb)将物理链路划分为8个优先级队列,每个队列独立进行流控。当某队列的缓冲区占用超过XOFF阈值时,交换机向对端发送PFC暂停帧,请求对端在指定时间内停止发送该优先级的报文;当队列深度回落到XON阈值以下时,交换机发送恢复帧,对端继续发送。

PFC的关键参数包括:

  • XOFF阈值:触发反压的队列深度上限,通常设置为端口缓冲区大小的80%~95%。
  • XON阈值:解除反压的队列深度下限,通常比XOFF低10%~15%,避免频繁抖动。
  • PFC优先级映射:RoCE流量通常映射到优先级3(或5),与普通TCP流量隔离。
配置建议:在华为CE系列交换机上,可通过以下命令配置PFC优先级映射与阈值:
# 将RoCE流量映射到优先级3
interface 10GE1/0/1
  priority-flow-control enable
  priority-flow-control priority 3 enable

# 设置XOFF/XON阈值(以百分比表示)
qos buffer pool 0
  buffer-policy default
  qos queue 3 buffer-size 80%  # XOFF
  qos queue 3 buffer-size 65%  # XON

4.3 ECN工作原理与协同机制

ECN(RFC 3168)在IP层提供拥塞标记能力。RoCE v2使用IP头中的ECT(ECN-Capable Transport)和CE(Congestion Experienced)两位编码。当交换机队列深度超过Kmin时,开始对报文打CE标记;超过Kmax时,所有报文都被标记。接收端收到CE标记后,生成CNP(Congestion Notification Packet)报文反馈给发送端,发送端据此降低发送速率。

PFC与ECN的协同关系可以概括为:

  1. ECN先行:当队列深度超过Kmin时,ECN先介入,通过端到端反馈让发送端主动降速,避免队列继续增长。
  2. PFC兜底:如果ECN反馈不及时或降速不足,队列深度继续增长至XOFF阈值时,PFC启动逐跳反压,防止丢包。
  3. 优先级隔离:PFC只作用于RoCE优先级队列,不影响其他优先级(如TCP)的流量。

下表对比了PFC与ECN的核心差异:

维度 PFC ECN
作用层级 链路层(L2) 网络层/传输层(L3/L4)
控制粒度 逐跳(每段链路独立) 端到端(发送端-接收端)
触发条件 队列深度 > XOFF 队列深度 > Kmin
反馈方式 PFC暂停帧(硬件自动) CNP报文(接收端生成)
响应速度 微秒级(硬件) 百微秒级(需软件处理)
副作用 可能引发队头阻塞 需要发送端配合降速

4.4 典型场景:PFC与ECN协同处理瞬时拥塞

考虑一个典型的分布式存储场景:服务器A向服务器B发起RDMA写操作,突发流量达到10 Gbps,而链路带宽为25 Gbps,瞬时拥塞发生在交换机1的出向端口。

时间线分析:

  1. T0时刻:交换机1队列深度达到Kmin(60%),开始对RoCE报文打CE标记。
  2. T0+50μs:服务器B收到带CE标记的报文,生成CNP并发送给服务器A。
  3. T0+100μs:服务器A收到CNP,将发送速率从10 Gbps降至5 Gbps(按DCQCN算法)。
  4. T0+150μs:若队列深度仍增长至XOFF(95%),交换机1向服务器A发送PFC暂停帧,强制暂停发送。
  5. T0+200μs:队列深度回落至XON(85%),交换机1发送恢复帧,服务器A恢复发送。
关键结论:ECN负责“软降速”,PFC负责“硬保护”。在正常拥塞下,ECN应能有效控制队列深度,PFC仅在极端突发或ECN失效时才触发。如果PFC频繁触发,说明ECN参数(Kmin/Kmax)设置过松,或发送端降速响应过慢。

4.5 常见误区与调优复盘

误区一:PFC阈值设置过高

将XOFF设置为98%以上,虽然减少了PFC触发频率,但一旦触发,队列中已堆积大量报文,可能导致PFC风暴(head-of-line blocking)。建议XOFF不超过95%,并配合ECN的Kmax设置,使PFC触发时队列深度仍有缓冲余量。

误区二:ECN与PFC阈值不匹配

如果Kmax(ECN最大标记阈值)高于XOFF(PFC反压阈值),则ECN尚未完全标记,PFC就已触发,导致ECN失去意义。正确做法是保证:

Kmin < Kmax < XOFF(建议Kmax比XOFF低10%~15%)

误区三:忽略PFC死锁风险

当多跳网络中每台交换机都触发PFC时,可能形成环路等待,导致吞吐量归零。需启用PFC看门狗(deadlock detection)功能,并合理规划拓扑避免环路。

调优复盘建议:在部署RoCE无损网络后,应持续监控以下指标:PFC触发次数/秒、ECN标记报文比例、队列深度分布、CNP报文速率。若PFC触发频率高于每秒100次,或ECN标记比例超过5%,需重新评估阈值配置。

无损网络的核心在于PFC与ECN的“远近结合”——ECN从端到端视角平滑降速,PFC从链路视角兜底防丢包。两者阈值必须联动设计,并依据实际流量模型反复调优,才能实现RoCE网络的高吞吐与低时延。