ARTICLE · 1150214
AI智算网络05、一条光模块告警引发的全网暂停PFC/ECN/CN 三件套,一张时序图讲清
🌐 AI智算网络系列 · 第05篇 · 免费篇技术王牌
🛣️ 一条光模块告警引发的全网暂停PFC/ECN/CN 三件套,一张时序图讲清
智算网络的"零丢包"不是天生的,是这三件套硬撑出来的文末带走:三件套协作速查卡 + 系列最完整的一张拥塞时序图
📅 2026年更新 · ⏱️ 阅读约21分钟 · 🎯 适合传统网工转型 · 🆓 免费
👆 封面:把智算网络想成高速公路——主路满载(交换机队列),匝道信号灯(PFC)亮起拦停上游,路牌提示(ECN)让司机提前减速,两种保路方式同框
📑 目录导航
1一次PFC风暴——"保护机制"如何变成"故障放大器"
2为什么不能丢包——RDMA的"重传账单"比TCP贵百倍
3PFC——匝道信号灯:逐跳反压,只停该停的
4ECN+CN——路牌与电台:不拦车,让司机自己减速
5DCQCN——三件套合体:降速→探速→恢复全时序
6三道防线接力:谁在替你扛 + 同框判读表
7三件套协作速查卡 + 今晚就能试(带走物)
1一次PFC风暴——"保护机制"如何变成"故障放大器"
🔹 第03篇讲了"慢40%"的故事,这次是它的续集,更凶。某客户集群上线第三周,某天下午训练吞吐整体断崖到15%——不是慢,是接近停摆。网络组查了个遍:链路全UP、无丢包计数、CPU正常。
最后的现场让人哭笑不得:一台接入交换机下挂的某台服务器网卡故障,持续"吞"包不报错。交换机队列满了,忠实地执行无损承诺——发PAUSE给上游;上游也满了,继续向上PAUSE。一台坏卡的"坑",被PFC的"零丢包承诺"放大成了半个集群的"全网暂停"。这就是传说中的 PFC 风暴(pause storm):保护机制本身,成了故障放大器。
处置很粗暴也很有效:隔离那台坏卡,全网秒恢复。但复盘提出了一个必须回答的问题——PFC到底该怎么配、怎么跟ECN分工,才能既保住"零丢包",又不让一台坏卡拖死全场?这篇就是答案。三件套(PFC/ECN/CN)逐个拆开,最后用一张时序图看它们怎么协同。
⚠️ 先说结论(性急版)
三件套的分工哲学:ECN管"轻拥塞"——打标提醒,端点主动降速,代价小;PFC管"重拥塞"——水线告警,逐跳反压,最后防线。顺序反了或者只用PFC,就是"小病吃药、大病开刀"变成"逢病就开刀"——风暴就是这么来的。
👆 图解:三道防线各管一段:ECN 绿灯贴条轻减速、PFC 栏杆排队重刹车、超时槽丢弃清账——上方的缓冲水位三刻度线决定了谁先触发
2为什么不能丢包——RDMA的"重传账单"比TCP贵百倍
🔹 第01篇说过"RDMA对丢包容忍度极低",这里把账单算清楚。TCP丢包:接收端回个重复ACK,发送端慢启动重来,应用层几乎无感——因为TCP的设计前提就是"网络不可靠,我来兜底",兜底成本摊在毫秒级延迟里,人感觉不到。
RDMA丢包呢?RC连接下丢一个包,接收端会持续回NAK,发送端重传——而这个连接上后面的数据全在排队等。更要命的是它等的不是一条流:AllReduce里任何一条QP卡住,整个集合通信的 barrier 就过不去,几千张卡陪着等。这就是为什么智算网络的丢包指标要从"0.1%可接受"改成"0.001%以下、最好为零"。
但以太网交换机的工作方式是 store-and-forward + tail drop:队列满了就丢,简单高效,互联网因此繁荣。要让这个"天生会丢包"的网络服务RDMA,就得给它打三个补丁——PFC、ECN、CN。逐个看。
3PFC——匝道信号灯:逐跳反压,只停该停的
🔹 PFC(Priority-based Flow Control,802.1Qbb)一句话:队列快满了,下游喊上游"停发";队列回落了,喊"继续"。类比高速公路匝道:前方堵了,匝道信号灯亮起拦停入口车辆——但注意,它只拦去堵点方向的车,其他方向照常通行。
"只拦该拦的"靠的是按优先级分队列:802.1P把流量分成8个优先级,每个优先级独立队列、独立发PAUSE。智算集群的标配做法是——只给RDMA流量(通常priority 3或5)开PFC,普通业务流量照旧可丢。全开8个优先级的PFC等于回到老式全局pause,一台坏卡就能冻死所有业务,这是新手最常踩的配置坑。
两个水线:XOFF喊停,XON放行
队列占用越过 XOFF水线 → 发PAUSE帧(带优先级和时长);回落到 XON水线 → 发RESUME放行。两个水线之间的余量要能装下"信号在路上的时间":400G链路+300米光纤,在途数据约24MB——XOFF触发时,上游已经发出但还没到的包必须接得住,这就是水线设置里"headroom"概念的来源,第16篇调优专算这笔账。
👆 动图:交换机8个优先级队列并排——只有RDMA队列(p3)越过XOFF水线,逆流发PAUSE冻结上游该优先级;其余7个队列照常收发。第01篇是单队列特写,这次看全貌:"只停该停的"才是PFC的灵魂
现在回头看第1章的风暴就明白了:坏卡持续吞包 → p3队列永远满 → PAUSE永远不解除 → 反压沿路径逐跳上传染。PFC本身没错,错在没人盯着"PAUSE持续不解除"这个异常模式——它是死锁/风暴的指纹,第15篇的告警规则就盯它。
4ECN+CN——路牌与电台:不拦车,让司机自己减速
🔹 PFC是"拦停",动静太大。理想情况是车自己减速,路永远不堵——这就是ECN+CN的分工。
📝 ECN(显式拥塞通知,RFC3168)= 路牌:交换机队列刚过"预警水线"(远低于XOFF)、还没到要拦停的地步,就在经过的IP包头里把ECN字段从10/11改成01(CE标记)——"此路开始堵了",包继续走,不丢不停;
📝 CN(拥塞通知,CNP报文)= 电台:接收端网卡看到包上带了CE标记,就往回发一个小小的CNP报文(拥塞通知包)给发送端——"你发来的路堵了,降速";
📝 发送端网卡收到CNP:硬件直接把这条流(这个QP)的发送速率压下来。全程CPU不参与,微秒级响应。
注意这个闭环的巧妙之处:交换机只负责"贴条"(ECN标记),判断和执行的权力全在两端网卡。网络不需要理解RDMA,端点不需要等丢包——这就是"主动拥塞通知"对比TCP"丢了才知道堵"的代际差。
💡 生活类比:三件套 = 一套完整的城市治堵方案
早高峰治堵有三招:ECN是可变情报板("前方拥堵,建议减速绕行"——司机自己降速);CN是交警电台(情报板的信息得传到司机耳朵里);PFC是匝道信号灯(真堵死了才物理拦停入口)。三招齐用,城市才转得动;只留信号灯,就是第1章那场风暴。
5DCQCN——三件套合体:降速→探速→恢复全时序
🔹 零件齐了,谁把它们拧成一台机器?答案是 DCQCN(Data Center QCN,Mellanox+斯坦福的SIGCOMM论文)——RoCEv2网卡里那套拥塞控制的参考实现,也是它让"以太网跑RDMA"从想法变成生产可用(还记得04篇家谱里"2014 = RoCEv2 + DCQCN 同年"吗)。发送端维护三个动作:
📝 ① 降速(Fast Reduce):收到CNP,立刻乘性降速(速率×α,α≈0.7),并进入反应期——期间再收到CNP不重复降,防"一脚踩死";
📝 ② 探速(Additive Increase):反应期过后没新CNP,按定时器小步提速(每周期加一个增量),像"试探性踩油门";
📝 ③ 恢复(Fast Recovery):持续无CNP若干周期后,判定拥塞消退,加速回到线速。
三件套+DCQCN的完整协作,用文字说不如看一张时序——这是本篇(也是目前全系列)最重的一张动图:一次拥塞从发生到恢复的全过程,队列水位、ECN标记、CNP飞行、发送速率四视图同屏联动。
👆 动图:四视图联动13秒——①发送端速率条 ②数据包流(绿→带CE标记变琥珀)③交换机队列水位(越过ECN预警线→越过XOFF→回落)④CNP回程与降速决策。完整走完"拥塞发生→ECN打标→CNP回程→降速→水位回落→探速→恢复"闭环
看懂这张图,你就看懂了RoCEv2集群的日常:吞吐曲线上的每次"呼吸"(微降又爬升),都是这套机制在替你消化拥塞——它不是没堵过,是堵了没让成灾。而水线参数(ECN预警线、XOFF线、headroom、CNP间隔、α值)怎么调,就是第16篇的全部内容。
6三道防线接力:看懂谁在替你扛,扛了多少
🔹 把三件套放回一条真实的数据流上,它们是一道按代价排序的接力防线:ECN 在最前面,只贴条不拦车,处理掉九成以上的拥塞苗头;PFC 在中间,真拦停但只拦该停的队列;超时重传在最后兜底——它每亮一次,都意味着前两道防线失配了。健康集群里三道防线的拦截量比例大致是 92 : 7 : ≤1,这个比例本身就是体检指标。
👆 动图:包洪流从左冲向训练任务,穿过三道关卡——①ECN门绿包过门贴条变琥珀 ②PFC闸栏杆落下拦停两个包、水回落又放行 ③一个漏网包撞上超时关,弹出红色"重传账单";底部拦截量柱定格 92% / 7% / ≤1%
🔹 为什么"防线亮得越靠右越该复盘"?因为三道防线各有一个失效方向:ECN 不亮,说明水线太松(拥塞都堆到 XOFF 了还没打标,16篇的"过松"形态);PFC 常亮,说明 ECN 的降速力度追不上入流速度,或者 headroom 算小了(16篇的"过紧"形态);超时重传亮,最严重——要么 PFC 该开没开(配置漏了某个队列),要么死锁前兆(15篇)。值班时看这三根"柱子"的相对高度,比看任何单一指标都更接近真相。
🔹 一个评论区高频问题:"我家集群 pause 帧天天涨几百个,是不是有病?"——用接力模型回答:看它和谁同框。pause 缓涨 + ECN 标记同步涨 + 吞吐只是"呼吸" = 防线正常工作,不用动;pause 突刺 + ECN 几乎不动 + 吞吐掉台阶 = ECN 水线失效,PFC 在替它扛,查水线;pause 双向对打 + 吞吐归零 = 死锁,按 15 篇流程走。同一个计数器,在不同"同框组合"里是完全不同的病。
🎁 带走物:三件套"同框判读表"(贴在告警台)
🔹 顺手给一段"三防线同屏"的最小 Grafana 查询组合(配合17/18篇采集体系):
# 面板A:ECN打标速率(交换机侧)rate(ecn_marked_packets_total{queue="3"}[5m])# 面板B:PFC pause速率(端侧+交换机侧同屏,17篇的双向语义)rate(roce_pause_total{nic=~"eth[0-7]"}[5m])# 面板C:超时重传(端侧,最该为0的一根线)rate(packet_seq_err_total[5m]) + rate(local_ack_timeout_err_total[5m])# 三面板共用时间轴 + 一条训练吞吐曲线 = 值班判读屏🔹 这块屏建好之后,03 篇那句"监控大屏全绿≠网络健康"就有了正面解法:不追求"全绿",追求"三根柱子的形状符合预期"。呼吸状的 ECN 曲线是健康的心电图,一条直线的"全绿"反而可能是采集器挂了(18篇 Q3 心跳告警的意义)。
7三件套协作速查卡 + 今晚就能试(带走物)
🎁 带走物:三件套协作速查卡
| 最后防线(重拥塞) | 轻拥塞预警 | 降速执行依据 | |
🎁 今晚就能试:3条命令,看你环境的三件套状态
# ① 服务器侧:看哪些优先级开了PFC(1=开)——重点确认"只有RDMA队列开了"mlnx_qos -i eth0 | grep -A2 "Priority"# ② 服务器侧:看CNP收发计数(非零=ECN+CN闭环在工作)ethtool -S eth0 | grep -E "cnp|ecn"# ③ 华为交换机侧:看PFC与ECN水线配置display current-configuration interface 1/0/1 | include pfcdisplay current-configuration | include wred💡 判读要点:①里出现"8个优先级全是1"→你离风暴只差一台坏卡,立刻改成只开RDMA优先级;②里 cnp 计数为零而 ECN 标记在涨→CN闭环断了(多半是DSCP/trust模式没配对),三件套只剩两件在裸奔。
❓ FAQ三连:评论区最高频的三个"可是"
Q1:「可是我们厂商方案里 PFC 是全局开的,说这样最保险?」
A:全局开 PFC 恰恰是把"保险丝"换成了"铁丝"。8 个优先级全开意味着存储流、管理流、监控流全都获得反压资格——一条坏管理流量就能把 RDMA 队列的邻居也冻住,风暴传染面扩大 8 倍(第1章的放大器场景)。正确姿势只有一个:trust dscp + 只给 RDMA 优先级(通常 p3)开 no-drop。如果厂商坚持全局开,把本篇第1章风暴时序图发给他,让他解释"哪个队列被 PAUSE 后训练不受影响"。
Q2:「可是 ECN 和 PFC 二选一不行吗?只留一个更简单。」
A:可以"更简单",但会"更脆弱"。只留 PFC:反应是逐跳拦停,拥塞瞬间整条路径被多米诺冻住,且天然带死锁风险(15篇);只留 ECN:端点降速需要 RTT 级反馈时间,突发流量在这段"空窗"里会把队列打爆——没有 PFC 兜底就是真丢包,go-back-N 重传账单(第2章)立刻寄到。三件套的设计哲学就是快慢结合、软硬分工:ECN 管趋势(软降速),PFC 管瞬时(硬拦停),缺一不可,只是各自的"生效范围"必须锁死在 RDMA 队列。
Q3:「可是交换机是老的/网卡的 CNP 版本对不上,凑不齐三件套怎么办?」
A:降级方案按优先级排:① 缺 CN(CNP 不通)→ ECN 打标变成"已读不回",等效只有 PFC+裸 ECN 统计,此时把 PFC 水线适当下调、headroom 加大一档,用空间换端点不降速的时间——代价是吞吐锯齿更深,集群规模要控制在几百卡内;② 缺 PFC(老交换机不支持 per-priority)→ 只能全局严格限流跑,把 RDMA 流量占比压到 70% 以下,监控 discard 当"丢包金丝雀",适合小规模实验网;③ 三件套全缺→ 这不是无损网络,是"赌网络",别拿它跑生产训练。库房设备利用方案见 04 篇 FAQ。
⚠️ 踩坑提醒:DSCP→队列映射是三件套的"隐形地基"
PFC按队列生效、ECN按队列判水线、CNP按DSCP回带——全链路都靠 "RDMA流量打哪个DSCP、映射到哪个队列"这一条链对齐。端点、接入、Spine每一跳的映射不一致,就会出现"你PAUSE了你的队列、我堵的是我的队列"这种玄学现象。上集群前把DSCP映射表打印出来逐跳核对,10分钟省10个小时。
✅ 本篇自检:读完你能回答
1. 为什么"只给RDMA优先级开PFC"是标配?全开会发生什么?
2. ECN的水线为什么必须低于PFC的XOFF水线?
3. CNP是谁发给谁的?它触发发送端做什么动作?
📚 关于本系列
《AI智算网络》共 24 篇:基础认知 → 技术底座 → 架构设计 → 运维实战 → 自动化 → 交付案例,按 6 个月转型路径编排。点击文章上方合集标签一键追更。至此"基础认知篇"收官,下一篇进入技术底座深水区。
💬 聊聊你的水线
你们集群的 PFC 是全优先级开还是只开RDMA队列?被 PFC 风暴/死锁咬过的扣1,配置正确的扣2——让我看看行业现状。
🔮 下篇预告 · 进入付费篇
第06篇:RoCEv2报文全解——tcpdump抓一个包,逐字节拆开看
📌 Ethernet+IP+UDP+BTH+RETH…每层头为什么存在、每个字段怎么读
📌 带走:完整抓包命令+Wireshark过滤器清单+字段速查表
XOps之路
AI智算网络系列 · 让网络工程师看见算力时代的未来 🚀
🧡 如果这篇文章对你有帮助,欢迎点赞、在看、转发三连!
© 2026 XOps之路 · All rights reserved