跳到主要内容

流控与无损可丢

背压如何成为死锁的必要条件,以及无损与可丢的权衡

核心要点

  • 背压是网络死锁的必要条件
  • 可丢网络丢包即破坏「不可抢占」
  • credit 与 PFC 是两种无损背压
  • PFC 粗粒度暂停,credit 精确授额
  • UEC 弃严格无损,link 可靠 + transport 容丢

前置阅读

背压为什么是死锁的必要条件?

无损是因,死锁风险是果——无损靠背压实现,而背压正是制造 Coffman「占有并等待」与「循环等待」两条件的机制。

  • 无背压(可丢网络):缓冲满了直接丢包。丢包等于强制释放被占资源,破坏了 Coffman「不可抢占」条件,循环等待无法形成或维持。
  • 有背压(无损网络):缓冲满了反向暂停上游。上游报文占着自己的缓冲、等下游释放——「占有并等待」成立;若这种等待沿网络成环,「循环等待」成立,死锁条件齐备。

因此一个网络是否需要操心死锁,取决于它是否要求无损。这条因果决定了下文两类网络的根本分野,也解释了为什么可丢网络(如传统 TCP/IP)从不讨论网络死锁——它们用丢包持续破坏「不可抢占」条件(Coffman 框架见 02-死锁理论基础)。

无损背压有哪两种实现,差别在哪?

实现无损有两条技术路线,都靠背压,但粒度与代价不同。

credit-based 流控按缓冲额度精确授权:接收方向发送方授予 credit(缓冲额度),发送方有多少 credit 就发多少。Ultra Ethernet 的 CBFC(Credit-Based Flow Control) 用两个 20-bit 循环计数器分别跟踪已消耗与已释放的 credit,按虚拟通道(VC)维护、周期性同步。它精确——接收方只授予确有空间的额度,从不超发,因此不需要为在途帧预留额外缓冲。NVLink、InfiniBand、UALink 的 link 层均采用。

PFC 按优先级粗粒度暂停:PFC(IEEE 802.1Qbb)当某优先级队列缓冲超阈值,向上游发 pause 帧暂停该优先级[1]。相比早期 802.3x(暂停整条链路),PFC 可对 8 个优先级类分别暂停,pause 时长以 pause quanta(暂停时长单位)逐类编码。代价是 pause 帧发出后到对端响应前仍有在途帧,必须预留 **headroom(余量缓冲)**吸收,且 headroom 大小需按链路长度 per-link 调优。PFC 是 RoCEv2 实现无损的标准手段。

维度credit-based(CBFC)PFC(802.1Qbb)
粒度精确到接收方缓冲可容纳的额度8 个优先级类粗粒度暂停
触发方式接收方按 buffer 占用授予 credit缓冲超阈值发 pause 帧
在途帧处理credit 已预留,无需额外缓冲需 headroom 吸收 pause 在途帧
调优负担自动(按 buffer 占用)需 per-link headroom 调优
典型问题实现复杂度高victim flow、pause storm、HoL 阻塞
采用NVLink / IB / UALink / UEC link 层RoCEv2

@tbl-deadlock-flowctrl-credit-pfc credit-based 与 PFC 对比

两种背压的时序差异见 @fig-deadlock-credit-pfc:credit 按额度发送、从不溢出、无 pause 传播;PFC 缓冲超阈值发 pause、需 headroom、可反向传播。

credit-based 按 credit 额度发送无需暂停(左);PFC 缓冲超阈值发 pause、需 headroom 吸收在途帧、pause 反向传播(右)@fig-deadlock-credit-pfc

两者都是无损背压,原理上都有死锁风险。差别在于 PFC 的粗粒度 pause 沿链路级联传播,更易形成大范围循环依赖与 pause storm(暂停风暴,pause 帧级联导致大面积流量停滞),还会波及本身不拥塞的 victim flow(受害流)——这使 PFC 死锁成为最棘手的案例(成因与预防见 04-pfc死锁)。降低 PFC 触发频率的常用手段是叠加端到端拥塞控制 DCQCN:交换机在到 pause 阈值前先标记 ECN,接收方回 CNP,发送方据此降速[2](算法细节见 01-硬件互联/05-roce);但 DCQCN 只减少 pause,不消除死锁可能。

无损和可丢在死锁面上如何取舍?

无损与可丢是两种对待拥塞的哲学,其在死锁面上的差异是根本性的。

维度无损(lossless)可丢(lossy)
拥塞时背压暂停上游丢包
丢包恢复不丢,无需恢复重传(端到端或链路级)
死锁风险有(循环等待可成立)无(丢包=抢占,破坏不可抢占条件)
HoL 阻塞严重(pause 波及无辜流)
尾延迟pause storm 下恶化取决于重传开销
代表RoCEv2(PFC)、InfiniBand传统 TCP/IP、UEC transport

@tbl-deadlock-flowctrl-lossless-lossy 无损与可丢的取舍

这里的 HoL 阻塞(Head-of-Line Blocking)指队首报文受阻导致其后无关报文一并被堵。可丢网络以「丢包 + 重传」的恢复成本,换取了消除死锁面、避免 HoL 阻塞。在万卡 AI 集群、故障常态化的场景下,维持一个无死锁的无损网络(调好 headroom、防住 CBD、监控 pause storm)的运维代价极高——这正是业界路线转向的动因。

Ultra Ethernet 为什么放弃严格无损?

Ultra Ethernet(UEC)用分层手段在「可靠」与「容丢」之间取平衡,不再强依赖严格无损[3]

  • link 层 LLR(Link Level Retry):对 FEC 不可纠正的错误在链路本地重传——发送端把可重传帧存入 replay buffer 并编序号,收端确认后释放。这是 link 层的可靠机制,替代 PFC 提供链路可靠性,但不靠暂停上游。
  • link 层 CBFC(可选):作为 PFC 的现代替代,credit 精确授予避免丢包,按 VC 维护。
  • transport 层 lossy 传输:transport 层支持 best-effort(容忍丢包)运行以避免 HoL 阻塞,设计为能在可能丢包的网络上良好工作。
  • IP 层 packet trimming:拥塞时丢 payload 保 header,将 header 转发到目的端,目的端据此向发送方请求重传,给端点早期显式丢包信号,配合乱序投递做快速恢复。

关键区分(接 01-总览 的 fabric 导引):LLR 是 link 层的可靠重传,真正「容丢」发生在 transport / IP 层。UEC 不是整体可丢,而是 link 层保可靠、transport 层容丢的分层设计。其设计将无损要求从 transport 层移除,使系统无需严格 PFC 配置即可规模化部署,从而绕开 PFC 死锁。

三条流控路线如何定位?

路线无损死锁面主要代价代表
PFC 无损高(pause 成环)headroom 调优、pause storm、CBD 防护RoCEv2
credit 无损中(原理上有,粒度细)实现复杂、缓冲开销NVLink / IB / UALink
UEC 容丢link 可靠 / transport 容丢低(transport 容丢消解)重传 + 乱序重排开销Ultra Ethernet

@tbl-deadlock-flowctrl-routes 三条流控路线对比

开放问题

  • 调研 UEC transport 层 lossy 传输的实测尾延迟与重传开销
  • 量化 headroom 缓冲随链路长度 / 速率的缩放关系

Takeaway

问题结论
背压与死锁的因果无损背压制造「占有并等待」+「循环等待」,是死锁必要条件
可丢为何无死锁丢包=强制释放资源,破坏「不可抢占」条件
credit vs PFC同为无损背压;credit 精确无需 headroom,PFC 粗粒度需调优、易 pause storm
无损 vs 可丢无损有死锁风险 + HoL 阻塞;可丢以重传成本换无死锁
UEC 路线link 层 LLR 保可靠、transport 层容丢,绕开 PFC 死锁

@tbl-deadlock-flowctrl-takeaway 流控与无损可丢速查

参考资料

  1. IEEE 802.1Qbb, Priority-based Flow Control, IEEE 802.1. https://1.ieee802.org/dcb/802-1qbb/
  2. Zhu et al., Congestion Control for Large-Scale RDMA Deployments (DCQCN), SIGCOMM 2015. https://dl.acm.org/doi/10.1145/2785956.2787484
  3. Hoefler et al., Ultra Ethernet's Design Principles and Architectural Innovations, arXiv:2508.08906, 2025. https://arxiv.org/abs/2508.08906

延伸阅读