第265篇:RoCEv2 拥塞控制与流量监管

关键词

RoCEv2 拥塞控制、DCQCN 调优、ECN 阈值、多流公平性、PFC 风暴、CNP 报文、速率控制


一、拥塞问题的根源

1.1 Incast 问题

Incast(多对一通信)是 RoCEv2 网络中最典型的拥塞场景:

Incast 场景(AI 训练 AllReduce):

          ┌──────────┐
          │ 参数服务器 │(Receiver)
          │  25Gbps  │
          └────┬─────┘
               │
┌──┴──┐ ┌──┴──┐ ┌──┴──┐
GPU1 25G GPU2 25G GPU3 25G ... GPU64

64 个 GPU 同时发送数据给参数服务器 接收端:25Gbps 发送端:64 × 25Gbps = 1600Gbps(远超接收能力)

结果: 接收端交换机端口缓存瞬间填满 队列深度急剧增加 ECN 标记 → CNP 反馈 → 发送端减速

1.2 拥塞传播

拥塞传播链(CCL, Congestion Chain Loop):

  次级拥塞(Secondary Congestion):

    发送端 ──► Leaf1 ──► Spine ──► Leaf2 ──► 接收端
                         │
                    发往其他 Leaf 的流量也受影响

  H2CC(Hashing-based Congestion Chain):
    ECMP 哈希导致不同流共享同一链路
    一条流拥塞 → 影响同链路的其他流

  PFC 反压传播:
    接收端端口拥塞 → PFC 反压到上游 Spine
    Spine 端口阻塞 → 反压到其他 Leaf
    → 拥塞从一点扩散到整个网络

二、DCQCN 深度分析

2.1 速率控制算法

DCQCN 的速率调整公式:

收到 CNP 时(减速):
  Rate = Rate × (1 - α / 2)

  其中 α 自适应调整:
    α = (1 - g) × α + g × F(每次收到 CNP)
    g = 滤波因子(默认 1/16)
    F = 标记比例(0-1)

没有 CNP 时(恢复):
  每 RateIncreaseTimer(50μs):
    Rate = Rate + β

  β 每次增加量(默认 50Mbps)

流量整形效果:

  速率
   │                    ● ← CNP 触发减速
   │                ┌──┘
   │     ┌──────────┘    ●
   │    ●              ┌──┘
   │   ┌┘  ┌───────────┘   ┌──────
   │───┘───┘               └────────→ 时间

   ● = CNP 接收
   折线 = DCQCN 速率控制
   体现:快速减速 + 缓慢恢复

2.2 ECN 阈值调优

ECN 阈值直接影响拥塞控制的灵敏度和网络利用率:

ECN 阈值参数:
  Kmin(低阈值):开始标记 CE 的最小队列长度
  Kmax(高阈值):CE 标记概率达到 100% 的队列长度
  Pmax:在 Kmax 时的标记概率(通常 100%)

队列长度 vs 标记概率:

  标记概率
  100% ┤        ┌────────────────
       │       ██
       │     ██
       │   ██
       │ ██
   0%  ┤───────────────→ 队列长度
       Kmin       Kmax

调优原则:
  Kmin 太小 → 过早标记 → 吞吐量下降
  Kmin 太大 → 标记太晚 → PFC 被触发(更糟)
  Kmax - Kmin 太小 → 标记剧烈 → 速率振荡

推荐初始值(100G 端口):
  Kmin = 100 个报文(~150KB)
  Kmax = 400 个报文(~600KB)
  缓冲区总量:~1.5MB(头房缓存)

调整方法:
  # ECN 阈值配置
  ecn-profile ROCE_TUNE
   color green
    ecn threshold low 200 high 500
    ecn mark-probability 100

  # 观察 PFC 和 ECN 的比例
  display dcb pfc interface 100GE1/0/1
  display ecn statistics interface 100GE1/0/1

  理想状态:
    ECN 标记多(说明拥塞控制正常)
    PFC 反压少(说明缓冲足够吸收突发)

  不良状态:
    ECN 标记少 + PFC 多 → Kmin 太大(需降低)
    ECN 标记多 + 吞吐低 → Kmin 太小(需提高)

2.3 多流公平性

多流 RoCE 在拥塞点的公平性问题:

不公平场景:

  流 A(GPU1→Receiver):5Gbps,长流
  流 B(GPU2→Receiver):1Gbps,长流
  等待具有相同 ECN 标记

  PFC 反压会对所有流一视同仁
  → 流 A 和流 B 被同等对待
  → 流 A 占大带宽,流 B 得不到公平份额

公平性改进:

  1. ECN 标记差异化
     降低 Kmin → 所有流更早收到反馈
     大流收到更多 CNP → 减速更积极

  2. DCTCP(Data Center TCP)风格标记
     标记概率与队列长度成正比
     大流 = 更多 CE 标记 → 更大减速

  3. 流量整形(Rate Limiting)
     每个 QP(Queue Pair)独立速率控制
     防止单个 QP 占用全部带宽

  验证公平性:
  # 查看各流的速率
  display roce statistics qp
  display interface 100GE1/0/1 queue statistics

三、PFC 风暴与防护

3.1 PFC 风暴的产生

PFC 风暴(PFC Storm)是无损网络的严重故障:

场景:Leaf 与 Spine 之间的链路拥塞

  Leaf1(发送)                    Leaf2(接收)
    │                                │
    │  PFC Pause Class 3 ───────────►│  ← 队列满
    │                                │
    │  停止发送 Class 3              │
    │                                │
    │  ← 对上游也发 PFC Pause        │
    │                                │
  上游 Spine 也停止发送              │
    │                                │
  更多流受阻...                      │
    │                                │
  持续 Pause → 检测超时 → 丢包       │

PFC 风暴特征:
  1. 连续收到大量 PFC Pause 帧
  2. PFC 反压逐级传播
  3. 影响面从一点扩散到全网
  4. 所有无损流量停滞

3.2 PFC 死锁检测

PFC 死锁检测与恢复机制:

华为 CE 的 PFC 死锁检测:

  # 配置 PFC 死锁检测
  interface 100GE1/0/1
   priority-flow-control dead-detect enable
   priority-flow-control dead-detect interval 100  # 100ms 检测周期
   priority-flow-control dead-detect count 3       # 3 次连续死锁判定

  检测逻辑:
    如果某个优先级连续 300ms 处于 Pause 状态
    → 判定为 PFC 死锁

  恢复动作:
    1. 强制退出 Pause 状态(丢弃部分缓冲报文)
    2. 记录告警
    3. 通知网管/控制器

  查看死锁:
  display dcb pfc dead-detect interface 100GE1/0/1

3.3 PFC 配置建议

PFC 防护最佳实践:

1. 只在必要的优先级上开启 PFC
   通常只在优先级 3(RoCE)开启
   不要在优先级 0(TCP)开启

2. 设置合理的 PFC 阈值
   # 华为推荐配置
   dcb pfc buffer shared 3000
   dcb pfc buffer headroom 1000
   dcb pfc buffer xoff-threshold 800

3. 结合 ECN 减少 PFC 触发
   ECN 阈值低于 PFC 阈值
   ECN 标记先于 PFC 反压触发

   典型设置:
     ECN 标记:队列 100-400 个报文
     PFC 暂停:队列 800+ 个报文

4. 监控 PFC 帧
   # 定期检查 PFC 帧数量
   # 如果 PFC TX 持续增长 → 存在问题
   display dcb pfc interface 100GE1/0/1

四、流量监管与整形

4.1 入方向监管

入方向流量监管(Ingress Policing):

在 Leaf 入端口限制 RoCE 流的速率:

  # 入方向监管
  interface 100GE1/0/1(连接 GPU 服务器)
   #
   qos lr cir 20000                        # 限制入方向 20Gbps
   #
   car car-name roce_car
    cir 20000
    pir 25000
    green pass
    yellow pass
    red discard

适用场景:
  控制单台 GPU 服务器的 RoCE 发送速率
  防止某台故障服务器过量发送
  多租户带宽保障

4.2 出方向整形

出方向整形(Egress Shaping):

在 Leaf 出端口对 RoCE 流进行整形:

  # 出方向队列整形
  interface 100GE1/0/1(连接 Spine)
   #
   qos queue 3 shaping 80000               # RoCE 队列整形 80Gbps
   qos queue 3 wfq weight 40               # 权重
   #
   qos queue 0 shaping 20000               # 尽力而为 20Gbps
   qos queue 0 wfq weight 10

  # 层次化 QoS(HQoS)
  qos profile HQOS_ROCE
   schedule wfq
   queue 3 shaping pct 80                   # RoCE 占 80% 带宽
   queue 0 shaping pct 20                   # TCP 占 20% 带宽

适用场景:
  出方向带宽保障
  确保 RoCE 和其他流量的带宽比例
  防止 RoCE 占满所有带宽导致管理不可达

4.3 端到端速率限制

端到端 RoCE 速率限制方法:

方法 1:DCQCN 自适应(推荐)

  # 仅配置 ECN + PFC,DCQCN 自动调节
  优点:动态自适应,无需手工配置速率
  缺点:收敛需要时间

方法 2:QP(Queue Pair)限速

  # 限制每个 QP 的速率
  roce
   qp-rate-limit enable
   qp-rate-limit default 10000              # 每个 QP 默认 10Gbps

  优点:精确控制每个流
  缺点:QP 数量多时配置量巨大

方法 3:UDP 端口探测 + 动态限速

  控制器监测各端口 RoCE 流速率
  发现异常 → 动态下发限速策略
  优点:自动化
  缺点:依赖控制器

推荐的做法:
  通常使用 DCQCN 自适应速率(方法 1)
  AI/HPC 场景可能需要 QP 限速(方法 2)
  大规模部署推荐控制器动态调优(方法 3)

五、RoCEv2 性能调优案例

5.1 AI 训练集群调优

场景:256 个 GPU 的 AI 训练集群
网络:Spine-Leaf,100G RoCEv2

问题:训练效率低下,AllReduce 阶段延迟高

排查:

  Step 1:查看 PFC 帧计数
    display dcb pfc interface 100GE1/0/1
    → PFC Tx 大量增长(> 10000/s)
    → PFC 过于频繁

  Step 2:查看 ECN 标记
    display ecn statistics
    → ECN 标记很少
    → ECN 阈值设置过高

  Step 3:查看队列深度
    display qos queue statistics
    → 队列经常达到 800+ 报文
    → 触发 PFC 前没有 ECN 干预

调优:

  1. 降低 ECN 阈值
    ecn threshold low 80 high 200

  2. 调整 Kmin/Kmax
    原:Kmin=300, Kmax=800
    新:Kmin=80, Kmax=200

  3. 增加缓冲区
    dcb pfc buffer headroom 1500

效果:
  ECN 标记增加 3×
  PFC 帧减少 10×
  AllReduce 延迟降低 40%
  训练吞吐提升 15%

六、总结

知识点 核心要点
Incast 问题 多对一通信导致接收端拥塞,RoCE 常见场景
拥塞传播 次级拥塞 + PFC 反压传播,影响全网
DCQCN 速率控制 收到 CNP 减半速,每 50μs 恢复 β
ECN 阈值 Kmin/Kmax 控制标记灵敏度,调试点
多流公平 ECN + 独立 QP 速率控制保证公平
PFC 风暴 连续 PFC 反压导致全网无损流量停滞
死锁检测 检测连续 Pause,强制恢复
流量整形 入方向监管 + 出方向队列整形

七、思考

  1. Incast 场景中为什么 RoCE 的拥塞控制比 TCP 更加关键?TCP 的 AQM(RED/CoDel)为什么不够?
  2. ECN 阈值 Kmin 设置得太小或太大会分别导致什么问题?如何根据 PFC 和 ECN 的统计判断 ECN 阈值是否合适?
  3. PFC 风暴是如何产生的?一个 Leaf 出端口拥塞为什么会导致全网多个 Leaf 受影响?
  4. DCQCN 中 α 自适应滤波因子 g 的作用是什么?g 设置太大或太小分别有什么影响?
  5. 在 AI 训练集群中,如果发现 PFC 帧频繁增加(> 10000 帧/秒),但训练吞吐不达标,应该如何调优 ECN 阈值和缓冲区?

下篇预告:第266篇《数据中心 PFC(优先级流控制)死锁故障》——PFC 死锁的根因分析、死锁传播模式、检测恢复机制、最佳实践与故障案例。