跳到主要内容

PFC 死锁

PFC 死锁怎么形成、如何预防与运维

核心要点

  • PFC 死锁是 RoCE 集群最痛点
  • 无故障 Clos 无环,故障重路由成环
  • 死锁自维持,触发源消失也不解
  • Tagger 打 tag、偏离降级可丢
  • Flattened Clos 拓扑级消除 CBD

前置阅读

PFC 死锁是怎么形成的?

PFC 的 pause 帧反向传播,在缓冲间制造循环依赖(CBD)后形成死锁。链条是:

  1. 某交换机缓冲超阈值,向上游发 pause
  2. 上游被暂停,自己的缓冲也堆积、超阈值,再向它的上游发 pause
  3. pause 沿链路逐跳反向传播
  4. 若被暂停的缓冲依赖关系首尾相接成环(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

无故障 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 死锁速查

参考资料

  1. 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
  2. Hu et al., Tagger: Practical PFC Deadlock Prevention in Data Center Networks, CoNEXT 2017. https://www.cse.ust.hk/~kaichen/papers/conext17-tagger.pdf
  3. 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
  4. 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
  5. 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
  6. Roundabout: Solving PFC Deadlocks with Distributed Detection and Resolution, ICNP 2024. https://liluyang.com.cn/uploads/2024/roundabout-icnp24.pdf

延伸阅读