Skip to content

第 5 周:交换机队列、PFC、ECN、CNP 与 DCQCN

对应原计划:plans/muxi-fabric-network-learning-plan.md 第 5 周。
相关工程:plans/muxi-fabric-probe.md 的 H5/H6 与 W3。
本章定位:学会区分“拥塞”这个笼统现象背后的不同机制:queue、shared buffer、PFC pause、ECN CE、CNP 和发送端 rate control。


0. 这一周到底学什么

第 4 周讲了 RoCEv2 packet 如何被分类到交换机 queue。第 5 周接着问:

如果 queue 真的拥塞了,网络和端点会发生什么?

RoCE 网络通常希望低丢包甚至近似 lossless,因此会使用 PFC 和 ECN/DCQCN 这类机制。但这些机制不是“打开就一定更快”,配置不当或流量形态不合适时,它们本身也会造成复杂性能问题。

学完你要能回答:

  • egress queue、shared buffer、scheduler 分别在哪里起作用?
  • PFC pause 是什么?它解决什么,又会制造什么问题?
  • ECN CE 标记和 CNP 是什么关系?
  • DCQCN 大致如何让发送端降速和恢复?
  • pause 扩散、head-of-line blocking 为什么会影响无关流?
  • 要证明 PFC/ECN/CNP 是根因,需要哪些 counter?
  • 为什么只有端到端带宽下降,无法区分 PFC、ECN、ECMP、超分、接收端瓶颈和通信库问题?

本周核心原则:

text
“拥塞”不是一个机制。
必须说清楚:在哪里排队、触发了什么信号、谁响应、counter 是否对齐。

1. 从 queue 开始:交换机为什么会排队

1.1 egress contention

最直观的排队发生在出口:

text
sender1 ┐
sender2 ├→ switch egress port → receiver
sender3 ┘

如果三个 sender 各自以 200G 进入,但 egress port 只有 200G:

text
输入需求 = 600G
输出能力 = 200G

多出来的数据只能:

text
排队;
被限速;
被 pause;
被 ECN 标记;
严重时丢包。

1.2 shared buffer

交换机通常不是每个端口独占固定 buffer,而是多个端口/queue 共享 buffer 池。

这意味着:

text
一个热点 queue 吃掉 shared buffer;
其他 queue 即使不是热点,也可能受影响。

1.3 scheduler

如果一个 egress port 有多个 queue,scheduler 决定谁先发:

text
queue 0: 普通流量
queue 3: RoCE
queue 6: 控制流量

如果 QoS 映射错,RoCE 可能没有进入预期 queue。或者进入了正确 queue,但 scheduler 权重/优先级不合适。


2. PFC:按 priority 暂停上游

2.1 PFC 是什么

PFC = Priority Flow Control。它允许下游设备按 priority 暂停上游发送。

简化流程:

text
交换机某个 priority queue 快满

向上游发送 PFC pause frame

上游暂停该 priority 的发送

下游 queue 消化后再恢复

目标是避免丢包,尤其是 RoCE 对丢包敏感。

2.2 PFC 解决什么

它解决的是:

text
短时间拥塞时,不要直接丢 packet;
让上游先停一停,保护 lossless priority。

2.3 PFC 会制造什么问题

pause 扩散

如果一个热点接收端让 leaf egress queue 满了,leaf 发 pause 给上游。上游被 pause 后自己的 queue 也可能涨,再继续 pause 更上游。

text
receiver 热点

leaf pause

spine pause

其他 leaf 也受影响

head-of-line blocking

PFC 按 priority 暂停,不一定只暂停那条造成拥塞的 flow。

同一个 priority 里的其他 flow 也会被影响:

text
flow A:真正打到热点
flow B:同 priority,但目的地不热点

PFC pause priority 3 → A 和 B 都停

这就是为什么 PFC 问题可能表现成“看起来无关的 pair 也慢”。

2.4 小 case:PFC 误判

现象:

text
A→B incast 时,C→D 也慢

可能是 PFC pause 扩散,也可能是:

text
ECMP 共享上行;
shared buffer 被吃掉;
背景流量;
C→D 本身路径变化;
通信库同步尾部。

要支持 PFC,需要看到:

text
实验窗口内对应 priority 的 pause frame / pause duration 增加;
受影响端口和流量方向能对齐;
queue occupancy 达到 PFC threshold;
负对照没有同样 pause。

3. ECN、CNP、DCQCN:标记和降速

3.1 ECN 是什么

ECN = Explicit Congestion Notification。

交换机发现 queue 超过阈值时,不一定丢包,而是在 IP header 里标记 CE:

text
queue occupancy > ECN threshold

mark CE

3.2 CNP 是什么

在 RoCE/DCQCN 语境里,拥塞信号会触发 CNP:Congestion Notification Packet。

简化流程:

text
packet 被交换机标 CE

接收端/RNIC 看到拥塞标记

向发送端发 CNP

3.3 DCQCN 是什么

DCQCN 是 RoCE 的拥塞控制机制之一。发送端收到 CNP 后调整发送速率。

粗略理解:

text
CNP 多 → 说明拥塞严重 → 降速
CNP 少 → 慢慢恢复速率

它像一个反馈控制环。

3.4 小 case:什么叫 ECN/DCQCN 闭环证据

比较强的证据链应该像这样:

text
实验开始

某些 egress queue occupancy 上升

CE counter 增加

CNP counter 增加

发送端 rate 降低 / pause 或 throttle 指标变化

目标 flow 带宽下降

实验结束后 counter 不再增长或恢复

如果只有:

text
目标 flow 带宽下降

证据太弱。


4. PFC 和 ECN 的区别

可以这样记:

text
PFC:让上游暂停,偏“别再发了,buffer 快满了”
ECN/CNP/DCQCN:给拥塞信号,偏“你发太快了,请调速”

对比:

PFCECN/CNP/DCQCN
目标避免丢包提前降速,避免队列过深
信号pause frameCE mark + CNP
粒度priority/linkflow/发送端速率控制
风险pause 扩散、HOL blocking参数不当导致震荡或降速不足
证据pause counter/durationCE/CNP/rate counter

两者可能同时存在,也可能互相影响。


5. 和 Muxi incast 现象的关系

Muxi 看到:

text
7→1、15→1 incast 聚合入口约 24.2GB/s

这和单个 200G 接收入口有效上限接近。

它支持:

text
单接收 rail/入口可能成为容量瓶颈;
多 sender 聚合时发生了入口方向的共享容量限制。

但它不能证明:

text
PFC 触发;
ECN 触发;
CNP 导致发送端降速;
shared buffer 打满;
交换机物理超分;
ECMP 碰撞。

要证明这些,需要网络侧 counter。

5.1 如果是 PFC,应该看到什么

text
接收方向相关端口/priority 的 pause frame 增加;
pause duration 和实验窗口对齐;
上游端口也可能出现 pause;
受影响流共享相同 priority。

5.2 如果是 ECN/DCQCN,应该看到什么

text
queue occupancy 超过 ECN threshold;
CE mark 增加;
CNP 增加;
发送端 rate control 降速;
带宽曲线和 counter 时间对齐。

5.3 如果只是接收入口上限,应该看到什么

text
接收端单 port bytes 接近 200G 有效上限;
不一定有 pause/CE/drop;
per-flow 公平分享;
换多 rail/多 GPU 接收时 aggregate 上限提高。

6. 推荐阅读提炼

6.1 DCQCN

一句话

DCQCN 是 RoCE 数据中心里用 ECN/CNP 做拥塞控制的经典方案。

抓哪个问题

text
RoCE 为什么需要端到端拥塞控制?
交换机 CE 标记如何通过 CNP 反馈给发送端?
发送端如何降速和恢复?

和 Muxi 的关系

如果怀疑 ECN/DCQCN,需要向沐曦/H3C 索取:

text
CE counter
CNP counter
DCQCN 参数
发送端 rate 状态
ECN threshold

不能照搬

论文描述的是机制模型,xscale 的具体实现、counter 名字、默认参数必须以沐曦资料为准。

6.2 RDMA over Commodity Ethernet at Scale

一句话

这类材料说明大规模 RoCE 网络里,PFC、ECN、QoS、buffer 配置必须协同,否则会出现复杂问题。

抓哪个问题

text
为什么 lossless Ethernet 不是打开 PFC 就结束?
为什么 PFC 可能造成扩散?
为什么 ECN/PFC 阈值要和 buffer/headroom 配合?

和 Muxi 的关系

它提供排查清单:不要只问“有没有 PFC”,而要问:

text
哪个 priority 开了 PFC?
headroom 多少?
threshold 多少?
实验窗口 pause duration 多少?
和流量方向是否对齐?

6.3 Cumulus / RoCE QoS 文档

一句话

它给出实际配置链示例:priority、PFC、ECN、queue、buffer 如何组合。

不能照搬

命令和值不能照搬 H3C,但“必须拿到完整映射链和 counter”的思想可迁移。


7. 常见误判

  • 带宽下降就是 PFC。
  • 没丢包就没有拥塞。
  • 有 PFC 就不会丢,也不会慢。
  • 有 ECN 标记就说明发送端一定正确降速。
  • CNP 增加就能解释所有慢。
  • incast aggregate 接近 200G 就证明交换机拥塞。
  • pause counter 增加就一定是目标流造成的,忽略背景流量。
  • 只看端点带宽,不看时间窗内 counter。

8. 本周任务设计

8.1 任务 A:画拥塞反馈闭环

画出:

text
queue occupancy → PFC pause
queue occupancy → ECN CE → CNP → sender rate control

并说明每个箭头需要什么 counter 支持。

8.2 任务 B:PFC vs ECN 辨析

给定现象:

text
incast 后目标 pair 带宽下降,其他 pair 也有尾部

分别用 PFC、ECN、shared buffer、ECMP、通信库同步尾部解释一次,并写出区分证据。

8.3 任务 C:counter 请求清单

列出网络组需要提供:

text
per-port bytes
queue occupancy
PFC pause frames/duration
ECN CE marks
CNP counters
drop/retry
CRC/FEC

并说明每项用于验证哪类机制。


9. 和 agent 讨论的问题模板

9.1 incast 机制拆解

text
请把这个 incast 实验按 PFC、ECN/CNP、shared buffer、ECMP、接收端 rail 瓶颈五类解释拆开。
每类列出支持证据、反证、还缺的 counter。

9.2 counter 对齐

text
我拿到了实验窗口的 per-port bytes、pause、CE、CNP、drop counter。
请帮我按时间窗对齐,判断它们是否支持 PFC/ECN/DCQCN 机制闭环。

9.3 最小网络侧请求

text
请帮我设计一个最小网络侧 ground truth 请求,要求能区分 PFC pause、ECN/CNP 和普通 egress queue 饱和。
每个字段说明用途。

10. 本周最小掌握清单

  1. queue 是拥塞发生点:先问哪里排队。
  2. PFC 是暂停:保护 lossless,但可能扩散和 HOL blocking。
  3. ECN/CNP/DCQCN 是反馈降速:需要 CE、CNP、rate control 闭环。
  4. shared buffer 会造成非局部影响:热点流可能影响无关流。
  5. 带宽下降不是机制:必须拿 counter。
  6. incast 24GB/s 可能只是单入口上限:不能直接写 PFC/ECN。

11. 本周结束时你应该能解释的一段话

如果有人问:

“15→1 incast 聚合只有 24GB/s,是不是交换机 PFC/ECN 出问题?”

你应该能回答:

text
不能直接下这个结论。24GB/s 接近单 200G 接收入口有效上限,首先支持的是单入口容量瓶颈或聚合入口饱和。PFC、ECN/CNP、shared buffer、ECMP 碰撞、接收端 rail 映射、通信库同步尾部都可能产生类似带宽下降。要证明 PFC,需要 pause frame/duration 和 priority/端口方向对齐;要证明 ECN/DCQCN,需要 queue occupancy、CE、CNP、发送端 rate control 与实验时间窗对齐。没有这些 counter,只能把它们列为候选机制。

12. 进阶时序:一次 incast 如何触发不同机制

假设 15 个 sender 同时打到 1 个 receiver:

text
s0  ┐
s1  ├──→ receiver
...
s14 ┘

接收侧某个 egress 或 endpoint 入口容量接近 200G。15 个 sender 的总需求远大于 200G。

12.1 如果只是普通排队

时序可能是:

text
输入流量突增

egress queue occupancy 上升

scheduler 按队列服务

per-flow 公平分享

aggregate 接近 200G

counter 可能显示:

text
per-port bytes 接近线速;
queue occupancy 上升;
没有明显 pause;
没有明显 CE/CNP;
没有 drop;

这说明容量被用满,但不一定是 PFC/ECN 问题。

12.2 如果触发 PFC

时序可能是:

text
queue occupancy 接近 PFC threshold

receiver 侧 leaf 发 pause

上游端口暂停某 priority

上游 queue 堆积

其他共享该 priority 的 flow 也受影响

counter 应该看到:

text
pause frame count 增加;
pause duration 增加;
priority 对齐;
方向对齐;
时间窗对齐;

12.3 如果触发 ECN/DCQCN

时序可能是:

text
queue occupancy 超过 ECN threshold

交换机 mark CE

接收端/RNIC 产生 CNP

发送端收到 CNP

发送端 rate 降低

带宽下降或稳定在某个水平

counter 应该看到:

text
CE marks;
CNP sent/received;
sender rate control 状态;
queue occupancy 曲线;

12.4 如果是 ECMP 碰撞

时序可能是:

text
多个大象流 hash 到同一 uplink

该 uplink bytes 接近线速

其他 uplink 空闲

目标 pair 带宽下降

counter 应该看到:

text
per-uplink bytes 不均;
改变 QP/flow salt 后结果变化;
pause/CE 不一定明显;

12.5 结论

同一个 incast 带宽下降,可以对应完全不同机制。关键不是“有没有下降”,而是:

text
哪个 queue;
哪个 priority;
哪个端口;
哪个方向;
哪个时间窗;
哪个 counter;

13. PFC 进一步拆解:为什么 lossless 也会慢

13.1 lossless 的目标

RoCE 对丢包敏感,所以网络常希望特定 priority 近似 lossless。

PFC 的目标是:

text
在 buffer 溢出前暂停上游,避免丢包。

13.2 lossless 不等于 low latency

如果经常 pause:

text
没有丢包;
但发送端经常停;
队列持续堆积;
尾部变差;

所以“没有 drop”不等于“网络健康”。

13.3 PFC storm / pause 扩散直觉

一个热点可以让 pause 往上游传播:

text
receiver egress 满
  ↓ pause
leaf 上游停
  ↓ queue 堆积
spine 方向受影响
  ↓ 更多 pause

这可能让局部热点变成大范围抖动。

13.4 HOL blocking 直觉

同 priority 里的多个 flow 被一起暂停:

text
flow A:去热点 receiver
flow B:去正常 receiver

如果 A 触发 pause,B 也可能被卡住,因为它们共享 priority/queue。

这就是为什么端到端 pair matrix 可能出现“块状一起慢”,但你仍不能直接命名物理拓扑。


14. ECN/DCQCN 进一步拆解:为什么标记不等于修复

14.1 ECN 标记只是第一步

交换机 mark CE,只说明:

text
这个 packet 经过某个超过 ECN threshold 的 queue。

它不说明:

text
发送端已经降速;
降速幅度合适;
拥塞已经解决;

14.2 CNP 是反馈

CNP 把拥塞信号反馈给发送端。

但还要问:

text
CNP 是否到达发送端?
发送端是否识别?
rate control 参数是什么?
降速后是否恢复过快?

14.3 DCQCN 可能震荡

如果参数不合适,可能出现:

text
流量过冲 → CE/CNP → 大幅降速 → 恢复 → 再过冲

表现为:

text
带宽周期性波动;
p99 高;
平均值不稳定;

14.4 和 Muxi 的关系

如果 Muxi 只有端到端带宽曲线,没有 CE/CNP/rate counter,就不能区分:

text
DCQCN 震荡;
ECMP 碰撞;
PFC pause;
通信库同步尾部;
背景流量;

15. 进阶辨析:drop、retry、FEC/CRC 与拥塞控制

15.1 drop

drop 是 packet 丢弃,可能来自 buffer 溢出、错误配置或其他原因。

RoCE 对 drop 敏感,因为重传和超时会显著影响尾部。

15.2 retry

RNIC retry 增加可能说明:

text
packet loss;
ACK timeout;
拥塞导致响应慢;
链路错误;

但 retry 不是直接等于交换机拥塞,需要和 drop/ECN/PFC/FEC 对齐。

15.3 CRC/FEC

CRC/FEC/symbol error 更偏物理链路质量。

如果这些增加,说明可能有链路层错误,而不是普通队列拥塞。

15.4 小 case:带宽下降 + FEC 增加

如果实验窗口内:

text
某端口 FEC corrected/uncorrected 增加;
CRC 增加;
带宽下降;

这更支持物理链路质量问题。

如果:

text
FEC/CRC 不变;
queue/CE/CNP 增加;

更支持拥塞控制问题。


16. counter 对齐方法

16.1 为什么要对齐时间窗

只看累计 counter 很危险。

例如:

text
pause counter = 100000

可能是历史累计,与当前实验无关。

要看:

text
实验前 counter;
实验后 counter;
delta;
时间窗是否覆盖实验;

16.2 最小 counter 表

text
字段                  用途
per-port bytes         看流量是否经过该端口,是否接近线速
queue occupancy        看是否排队
PFC pause frames       看是否触发 pause
pause duration         看 pause 影响时长
ECN CE marks           看是否做拥塞标记
CNP sent/received      看端点是否反馈拥塞
packet drop            看是否丢包
retry                  看 RNIC 是否重传
CRC/FEC                看物理链路错误

16.3 对齐方式

text
T0:实验前抓 counters
T1:开始实验,记录 run_id 和时间戳
T2:结束实验
T3:实验后抓 counters
Delta = T3 - T0

最好还能有:

text
负对照时间窗;
空闲时间窗;
重复 run;

16.4 小 case:pause counter 增加但不能说明目标流触发

如果 pause 增加,但同时有其他大流作业,不能直接归因到你的实验。

需要:

text
端口方向和目标流路径对齐;
时间窗精确;
无背景流量或有背景记录;
负对照不触发;

17. 推荐阅读进一步拆解

17.1 读 DCQCN 时,重点看控制环

不要一开始陷入公式。先抓:

text
谁检测拥塞?
谁标记拥塞?
谁反馈 CNP?
发送端如何降速?
如何恢复?

然后把它映射到 Muxi:

text
H3C switch 是否 mark CE?
xscale 是否生成/接收 CNP?
MCCL/RNIC 是否暴露 rate counter?

17.2 读 RoCE at Scale 时,重点看“协同配置”

它告诉你:

text
PFC、ECN、buffer、QoS、routing 必须一起配置;
单独打开某个机制不代表网络健康;

迁移到 Muxi 时,问题不是“有没有 PFC”,而是:

text
哪个 priority?
哪个 PG?
哪个 threshold?
哪个 headroom?
哪个 counter?

17.3 读厂商 QoS 文档时,重点看字段链

你要提取:

text
DSCP/PCP 如何映射 priority;
priority 如何映射 queue;
PFC/ECN 在哪个 queue 上;
counter 怎么导出;

不要直接照抄命令或阈值。


18. 本周自测题:带答案方向

18.1 PFC 和 ECN 的核心区别是什么?

答案方向:

text
PFC 是按 priority 暂停上游,目标是避免丢包;ECN 是拥塞标记,配合 CNP/DCQCN 让发送端调速。

18.2 为什么没有 drop 仍然可能性能很差?

答案方向:

text
PFC 可以避免 drop 但造成 pause、排队和 HOL blocking;ECN/DCQCN 也可能降速或震荡。

18.3 什么证据支持 PFC pause 扩散?

答案方向:

text
实验时间窗内多个相关上游端口/priority pause counter 和 pause duration 增加,并能和目标流路径、方向、负对照对齐。

18.4 什么证据支持 ECN/DCQCN?

答案方向:

text
queue occupancy 上升、CE marks 增加、CNP sent/received 增加、发送端 rate control 降速,并和带宽下降时间窗对齐。

18.5 incast aggregate 接近 200G 为什么不能证明 PFC?

答案方向:

text
它首先支持单接收入口容量上限。PFC 需要 pause counter/duration 和 priority/方向/时间窗对齐才能证明。