PFC 死锁
PFC 死锁怎么形成、如何预防与运维
核心要点:
- PFC 死锁是 RoCE 集群最痛点
- 无故障 Clos 无环,故障重路由成环
- 死锁自维持,触发源消失也不解
- Tagger 打 tag、偏离降级可丢
- Flattened Clos 拓扑级消除 CBD
前置阅读:
- PFC / pause / headroom / CBD / 无损 名词 → 11.1 互联通信死锁与流控总览 名词定义
- PFC 背压机制、无损 vs 可丢取舍 → 11.3 流控与无损可丢
- CBD / 循环等待的形式化判据 → 11.2 死锁理论基础
PFC 死锁是怎么形成的?
PFC 的 pause 帧反向传播,在缓冲间制造循环依赖(CBD)后形成死锁。链条是:
- 某交换机缓冲超阈值,向上游发 pause
- 上游被暂停,自己的缓冲也堆积、超阈值,再向它的上游发 pause
- pause 沿链路逐跳反向传播
- 若被暂停的缓冲依赖关系首尾相接成环(CBD),环上每个缓冲都在等下游释放,无人能前进——死锁
这正是 02-死锁理论基础 中「循环等待」条件在 PFC 网络的具体表现:pause 把「占有并等待」沿网络串成环。一个重要区分:单条环路流量会制造 CBD,但未必立即死锁;通常是多条流叠加、或持续的 pause 事件才把 CBD 推成真正的死锁[1]。
为什么无环的 Clos 也会 PFC 死锁?
Clos / fat-tree 用 up-down 路由,无故障时无路由环、不产生 CBD;问题出在故障态[1]:
- 链路 / 节点故障、端口抖动使报文偏离预期路径
- 偏离引入临时路由环(转发路径成环),进而产生流量环(实际流量沿环传输)和 CBD
- 重路由后是否成 CBD,取决于拓扑层级与端口朝向
也就是说,PFC 死锁不是稳态拓扑的问题,而是故障态的问题。在万卡 AI 集群、故障常态化的环境下,「无故障」假设不成立——这是 PFC 死锁难缠的根源。无故障 Clos 无环与故障重路由闭合 CBD 的对比见 @fig-deadlock-clos-cbd。

更糟的是自维持性:死锁一旦形成,即使最初的触发源(例如一条恒定高速流)消失,环上的 pause 仍互相维持,死锁不会自动解除,必须外部干预(丢弃 / 复位)才能打破。
怎么预防 PFC 死锁?
预防分两条路线——在路由层补救,或在拓扑层从源头消除。
Tagger 在路由层打 tag,偏离预期路径即降级可丢[2]。核心洞察:给定一组 expected lossless route(预期无损路径),用一套打 tag 方案就能保证任何故障下都不死锁。机制:tag 是嵌入报文的小整数,交换机按 tag 把报文分类进不同入口队列、每个 tag 映射一个优先级;沿预期路径逐跳单调升高 tag(优先级),报文越接近目的优先级越高,保证依赖图无环;若报文偏离预期路径(故障导致),tag 不再匹配,被降级进入 lossy queue(可丢队列)——偏离流量不再享受无损,于是不可能形成无损 CBD。优点是不改路由协议、缓冲需求适中、商用硬件可实现,本质是把偏离流量牺牲为可丢换取预期路径永不死锁。
Flattened Clos 在拓扑层协同设计消除 CBD[3]。既有 expander 网络的拓扑与路由本身可能含 CBD,与其在路由层补救,不如在拓扑设计期消除:把每个 ToR 交换机逻辑上拆成 k 个虚拟层,只在相邻虚拟层之间建立连接生成虚拟 up-down 路径,再用图收缩把虚拟多层网络压平成物理拓扑。结果是拓扑与路由协同、结构上无 CBD,适合新建集群。
| 路线 | 介入层 | 核心手段 | 代价 | 适用 |
|---|---|---|---|---|
| Tagger | 路由 / 转发 | 打 tag 逐跳升优先级,偏离即降级可丢 | 牺牲偏离流量、占用优先级队列 | 既有网络改造 |
| Flattened Clos | 拓扑 | 虚拟层 + 图收缩消除 CBD | 拓扑设计约束 | 新建集群 |
@tbl-deadlock-pfc-prevention 两条 PFC 死锁预防路线对比
两者互补:Tagger 在不动拓扑的前提下兜住故障态,Flattened Clos 从源头降低 CBD 概率。
生产集群如何兜底 PFC 死锁?
预防方案之外,生产集群还需运行时兜底。Meta 在万卡 RoCE 集群的实践给出几条关键经验[4]:
- PFC watchdog 是最后一道防线:检测异常长时 pause(如 >200ms),判定为死锁或坏 NIC,丢弃 / 禁用该队列打破僵局。
- global PFC 是最危险的误配:暂停所有流量类会引发级联 pause storm、大面积放大尾延迟。PFC 必须按流量类精细配置,绝不能全局启用。
- 接收端准入:协同设计集合通信库与 RoCE transport,由接收端驱动流量准入,减少拥塞与 pause。
- DCQCN 降触发:端到端拥塞控制让队列尽量不到 pause 阈值,减少 PFC 触发频率(算法细节见 01-硬件互联/05-roce),但不消除死锁可能。
此外有一类数据面检测-解决方案:在交换机数据面探测死锁并就地解除,如 ITSY[5] 与 Roundabout[6],属运行时检测路线(与通用检测恢复一并见 08-检测与恢复)。
PFC 死锁处理可分几层?
| 层次 | 手段 | 目标 | 局限 |
|---|---|---|---|
| 预防 | Tagger、Flattened Clos | 结构上不产生死锁 | Tagger 牺牲偏离流量;Flattened Clos 约束拓扑 |
| 缓解 | DCQCN、接收端准入 | 降低 pause 触发频率 | 不消除死锁可能 |
| 检测 / 兜底 | PFC watchdog、ITSY、Roundabout | 形成后快速打破 | 已造成短时流量损失 |
@tbl-deadlock-pfc-layers PFC 死锁处理三层定位
根本上,PFC 死锁源于「无损 + 故障态重路由」的组合。这也是 Ultra Ethernet 选择弱化无损(见 03-流控与无损可丢)的根本动因——从源头取消无损,PFC 死锁问题随之消失。
开放问题
- 调研 ITSY / Roundabout 数据面检测的探测准确率与误判率
- 对比国产 RoCE 交换机(如华为智能无损)的 PFC 死锁处理方案
Takeaway
| 问题 | 结论 |
|---|---|
| 死锁如何形成 | pause 反向传播,缓冲依赖成环(CBD)→ 循环等待 |
| Clos 是否免疫 | 无故障免疫;故障重路由成环后不免疫 |
| 为何难解 | 死锁自维持,触发源消失仍不解,需外部干预 |
| Tagger | 打 tag 逐跳升优先级,偏离预期路径即降级可丢,不改路由 |
| Flattened Clos | 虚拟层 + 图收缩,拓扑级消除 CBD |
| 运维兜底 | PFC watchdog 抓 >200ms pause;禁用 global PFC;DCQCN 降触发 |
@tbl-deadlock-pfc-takeaway PFC 死锁速查
参考资料
- Hu et al., Deadlocks in Datacenter Networks: Why Do They Form, and How to Avoid Them, HotNets 2016. https://www.microsoft.com/en-us/research/wp-content/uploads/2016/11/rdmahotnets16.pdf
- Hu et al., Tagger: Practical PFC Deadlock Prevention in Data Center Networks, CoNEXT 2017. https://www.cse.ust.hk/~kaichen/papers/conext17-tagger.pdf
- Zhao et al., Flattened Clos: Designing High-performance Deadlock-free Expander Data Center Networks Using Graph Contraction, NSDI 2023. https://www.usenix.org/system/files/nsdi23-zhao-shizhen.pdf
- Gangidi et al., RDMA over Ethernet for Distributed AI Training at Meta Scale, SIGCOMM 2024. https://cs.stanford.edu/~keithw/sigcomm2024/sigcomm24-final246-acmpaginated.pdf
- Wang et al., Detecting and Resolving PFC Deadlocks with ITSY Entirely in the Data Plane, INFOCOM 2022. https://www.cs.rice.edu/~eugeneng/papers/INFOCOM22.pdf
- Roundabout: Solving PFC Deadlocks with Distributed Detection and Resolution, ICNP 2024. https://liluyang.com.cn/uploads/2024/roundabout-icnp24.pdf
延伸阅读
- 1.5 RoCE (RDMA over Converged Ethernet) — RoCE 协议栈与 DCQCN 拥塞控制
- 11.8 死锁检测与恢复 — 通用死锁检测与恢复