DCQCN 拥塞控制算法原理和参数配置
1. DCQCN 拥塞控制算法概述
在现代数据中心网络中,RDMA over Converged Ethernet (RoCEv2)已成为高性能分布式存储和 AI 训练集群的主流通信协议。RDMA 要求网络提供无损传输能力,这对拥塞控制提出了严苛挑战。
DCQCN(Data Center Quantized Congestion Notification)是目前 RoCEv2 网络中最广泛部署的端到端拥塞控制算法,由微软、Mellanox 等厂商共同提出。它的核心思想是:结合 ECN 显式拥塞通知和 PFC 优先级流控,在保证网络无损的前提下,动态调整发送速率以缓解拥塞。
1.1 为什么需要 DCQCN?
在 RDMA 网络中,拥塞会导致严重的性能灾难:
| 问题类型 | 具体表现 |
|---|---|
| PFC 风暴 | 过度依赖 PFC 会导致头部阻塞(Head-of-Line Blocking)和多跳间的不公平竞争 |
| 拥塞扩散 | 单点拥塞通过反向传播影响上游交换机,形成“拥塞树” |
| 吞吐量下降 | 频繁触发 PFC 暂停帧会导致链路利用率骤降,吞吐量剧烈抖动 |
| 不公平性 | 不同流量之间缺乏协调,某些流长期“饥饿” |
DCQCN 的设计目标就是:在 PFC 被触发之前,主动感知并缓解拥塞,同时保证流之间的公平性。
2. DCQCN 算法原理
2.1 算法整体框架
DCQCN 主要由三个组件构成,形成闭环控制:
- 交换机端(CP,Congestion Point):检测队列深度,对到达阈值的数据包打上ECN 标记。
- 接收端(NP,Notification Point):收到带 ECN 标记的包后,向发送端回传CNP 拥塞通知报文。
- 发送端(RP,Reaction Point):收到 CNP 后执行速降,之后根据定时器和字节计数器逐步恢复速率。
2.2 CP ECN 协议
2.3 NP CNP packets
2.3 RP DCQCN
2.3.1 DCQCN 速率递减方案
更新速率
- DCQCN每隔RATE_REDUCE_MONITOR_PERIOD us 检查是否收到CNP
- 如果收到CNP,做如下处理:
- 记录当前CurrentRate,用作恢复阶段的TargetRate。注:如果CLAMP_TARGE_RATE=1,TargetRate 在每次降速阶段更新。
- 降低速率 : currentRate = currentRate - (1 - α/(2^RPG_GD))
- 降速之后,所有的timer/bytes counter 重置为0。
TargetRate = CurrentRate CurrentRate = CurrentRate * (1 - RateReduceFactor * Alpha)
更新Alpha
每隔 DcQcnDceAlphaUpdatePeriod【dce_tcp_rtt】 周期更新α。如果在此期间收到 CNP,alpha 增加;否则减少。
增加公式:α=α * G + (1-G)
减少公式:α= α * G
G控制α的变化幅度,G越小,α变化越快。
参考CC参数,实际使用时候的速率公式:
增加公式:α = (dce_tcp_g/2^10) * α + (2^10-dce_tcp_g)
减少公式:α = (dce_tcp_g/2^10) * α
速率公式:currentRate = currentRate(1-α/2^rpg_gd)
Example :RPG_THRESHOLD = 4
如下图给出的是rpg_threshold=4 时,事件触发速率变化场景,横轴时间纵轴是速率,整个时间线包含了升速、降速和再升速的过程:
- 第一个时间点(升速),Time Reset事件 对Current Rate进行了升速,当前速率接近Target Rate
- 第二个时间点(降速),RP接收到CNP进行降速(Current Rate导致CP拥塞,NP发出CNP)
- 第三个时间点(降速),RP再次接收到CNP进行降速
- 接下来五个时间点,发生四次Time Reset事件(T=3),2次Byte Reset(BC=2),位于Fast Recovery阶段
- 下个时间点,再次Time Reset事件(T=4),达到rpg_threshold,所以进入Additive Increase
- 接下来经过了1个Time reset和两个Byte reset,此时 T = 5, B=4,进入Hyper Increase的触发条件
Clamp Target Rate (Clamp = 0/1): 在更新速率时,Clamp 机制决定了是否要严格重置或继承历史上的 Target Rate。
例如 Clamp target rate = 1 时,每次收到CNP降速之后,都要更新target_rate = current_rate可以防止速率在短暂拥塞后恢复得过于激进。
Clamp target rate = 0
Clamp target rate = 1
2.3.2 DCQCN 速率递增方案
如果没有持续收到 CNP 报文,发送端会尝试逐步恢复带宽。提速的触发器 (Triggers to rate increment) 由计时器 (Timer) 和字节计数器 (Byte Counter) 共同决定。提速过程分为三个阶段 (Increment stages):
如果没有持续收到 CNP 报文,发送端会尝试逐步恢复带宽。提速的触发器 (Triggers to rate increment) 由计时器 (Timer)和字节计数器 (Byte Counter)共同决定。提速过程分为三个阶段 (Increment stages):
- 快速恢复阶段 (Fast Recovery):速率迅速上升至最近一次降速前的 Target Rate,以最大化利用闲置带宽。
- 积极增加阶段 (Additive Increase):速率超过 Target Rate 后,以固定步长试探性地增加。
- 超积极增加阶段 (Hyper Additive Increase):如果网络依然顺畅,速率会以更大的步长加速提升,快速抢占空闲带宽。
RP 通过定时器【Timer】和字节计数器【ByteCounter】来调整发送速率,其方式与 QCN[17]完全相同。每当发送了 B 个字节后,字节计数器会促使发送速率上升;而定时器则会在 T 个时间单位过后促使发送速率上升。定时器的存在确保了即使发送速率下降到较低水平,流量也能迅速恢复。这两个参数可以通过调整来达到所需的发送速率。
Rate translation in the HW
硬件速率转换 (Rate translation in the HW): 逻辑上计算出的目标速率,最终会被网卡底层的硬件 Pacer 模块转化为实际的发包延迟 (Inter-packet gap) 进行微秒级的流量整形。
2.3.3 DCQCN 参数 (DCQCN Configuration Parameters)
NVIDIA 提供了丰富的 DCQCN 参数 供高级用户针对不同业务场景进行微调。以下是影响 DCQCN 行为的关键配置项:
拥塞度控制 (α \alphaα相关参数):
rp_initial_alpha_value: 新流建立时的初始α \alphaα值。rp_g:α \alphaα值的指数衰减因子。决定了拥塞消除后,α \alphaα值下降的平滑度。rp_min_dec_fac: 接收到 CNP 时,速率下降的最小百分比阈值。提速触发器 (Increment Triggers):
rp_time_reset: 触发状态机进入下一个提速周期的时间间隔(微秒)。rp_byte_reset: 触发提速的发送字节数阈值。当发送足够多字节且未收到新 CNP 时执行提速逻辑。速率限制与阶段阈值 (Thresholds & Limits):
rp_rate_to_set_on_first_cnp: 在一个周期内第一次收到 CNP 时立即设定的强制速率。rp_thresholds(如RPG_THRESHOLD = 4): 决定状态机在快速恢复和积极增加阶段之间切换所需完成的循环次数。rp_clamp_flags: 布尔开关,用于启用或关闭 Target Rate Clamp 特性。
3. DCQCN 配置参数详解
DCQCN 在 RoCEv2 网卡上的行为由一组可调参数控制。以下是 Mellanox/NVIDIA ConnectX 系列网卡的关键配置参数。
3.1 拥塞通知【CC Param】相关参数
General
| MLNX_OFED | Description | Range | Default |
|---|---|---|---|
| Enable | 在特定优先级上启用 RoCE 拥塞控制 (DCQCN) | Enable (1) / Disable (0) | Enable |
Alpha Update
| MLNX_OFED | Description | Unit | Range | Default |
|---|---|---|---|---|
| dce_tcp_g | 每隔 DcQcnDceAlphaUpdatePeriod【dce_tcp_rtt】 周期更新α。如果在此期间收到 CNP,alpha 增加;否则减少。增加公式:*α=(dce_tcp_g/2^10)α +2^10-dce_tcp_g, 减少公式:*α=(dce_tcp_g/2^10)α, 速率递减公式:currentRate=currentRate(1-α/2^rpg_gd) | Fixed point with 10 bits in the fraction part | 0…1023 | 1019 |
| dce_tcp_rtt | 见上文。 | Microseconds | 1…131071 | 1 |
| initial_alpha_value | 此参数设置在收到流的第一个 CNP 时应使用的 alpha 初始值。 | Fixed point with 10 bits in the fraction part | 1…1023 | 1023 |
dce_tcp_g : dce - decrease ,tcp - 沿用QCN算法术语,g - gain增益参数
Rate Decrease
| MLNX_OFED | Description | Unit | Range | Default |
|---|---|---|---|---|
| rate_to_set_on_first_cnp | 第一个 CNP 时的速率(当前、目标)(0 – 线路速率的 85%)。 | Mbps | 0, 1…line rate [Mbit/S] | 0 |
| rpg_min_dec_fac | 此参数定义单次事件中速率降低的最大比率。 | % | 0…100 | 50 |
| rpg_min_rate | 此参数定义 QP 的最小速率限制。 | Mbps | 1…line rate | 1 |
| rpg_gd | alpha 与速率降低因子之间的系,降速公式:currentRate=currentRate(1-α/2^rpg_gd)* | Log2 of value in fixed point with 10 in the fraction part | 10…11 | 11 |
| rate_reduce_monitor_period | 速率降低之间的时间周期。 | microseconds | 1…UINT32 | 4 |
Rate Increase
| MLNX_OFED | Description | Unit | Range | Default |
|---|---|---|---|---|
| clamp_tgt_rate | 如果设置,每次速率降低时目标速率更新为当前速率。否则,仅在增量事件后的第一次减量时更新目标速率为当前速率。 | None | Enable/Disable | Disabled |
| rpg_time_reset | 速率增加事件之间的时间周期。 | Microseconds | 1…131071 | 300 |
| rpg_byte_reset | 速率增加事件之间的已发送字节计数器。 | 64 Bytes | 1…32767 | 32767 |
| rpg_threshold | 进入下一速率增加阶段所需的速率增加事件阈值。 | None | 1…31 | 1 |
| rpg_ai_rate | 加性增加阶段的速率增加值。 | Mbps | 1…line rate | 5 |
| rpg_hai_rate | 超加性增加阶段的速率增加值。 | Mbps | 1…line rate | 50 |
Notification Point
| MLNX_OFED | Description | Range | Default |
|---|---|---|---|
| cnp_dscp | 此参数设置 CNP 的 DSCP 值。 | 0…63 | 48 |
| cnp_802p_prio | 此参数设置 CNP 的 PCP 值。设置 DcQcnCnpPrioMode 为 ‘0’ 以使用此优先级值。 | 0…7 | 6 |
| DcQcnCnpPrioMode | 不需要设置,如果设置了cnp_dscp和cnp_802p_prio,该参数被自动设置。如果此参数设置为 ‘0’,则使用配置的 CNP 优先级;否则,CNP 的优先级值取自接收到的数据包。 | 0/1 | 0 |
| min_time_between_cnps | 从端口同一条优先级队列发送两次 CNP 之间的最小时间间隔(微秒)。 | 0…4095 | 4 |
3.2 ECN 标记阈值参数
ECN 标记由交换机完成,通常在交换机端口配置:
| 参数名 | 说明 | 默认值 | 建议范围 |
|---|---|---|---|
ecn_min_absolute/ecn_max_absolute | 绝对队列深度阈值(字节),低于 min 不标记,高于 max 全部标记 | min: 150KB, max: 1500KB | 取决于 Buffer 大小 |
wred_ecn_enable | 启用 WRED + ECN 标记 | enable | 必须开启 |
ecn_marking_enable | 启用 ECN 标记功能 | enable | 必须开启 |
3.3 PFC 相关参数
DCQCN 与 PFC 协同工作,PFC 参数需要在交换机端和网卡端对齐:
| 参数名 | 说明 | 默认值 | 建议 |
|---|---|---|---|
pfc_priority | 启用 PFC 的优先级(一般是 3 或 6) | 3 | 与 RDMA 流量优先级一致 |
pfc_pause_time | PFC 暂停帧的暂停时间(quantum = 512 比特时间) | 65535 | 100–65535 |
pfc_xon_threshold | 恢复发送的队列深度阈值 | 略低于 XOFF | 比 XOFF 低 10%–20% |
pfc_xoff_threshold | 触发 PFC 暂停的队列深度阈值 | 视 Buffer 而定 | 略高于 ECN max |
4. DCQCN 配置命令实战
4.1 场景说明
本节以Mellanox ConnectX-5/6 网卡 + NVIDIA Spectrum 交换机为例,演示 DCQCN 的完整配置。
网络拓扑:
- 两台服务器直连交换机,运行 RoCEv2 流量
- RDMA 流量映射到 Priority 3
- 使用 DSCP 26 作为 RDMA 流量的标识
4.2 网卡端 DCQCN 配置
在服务器侧,通过mlxconfig或sysfs配置 DCQCN 参数:
# 查看当前 DCQCN 参数mlxconfig-d/dev/mst/mt4125_pciconf0 query# 设置 RP(发送端)参数mlxconfig-d/dev/mst/mt4125_pciconf0set\DCQCN_RP_AI_RATE=10\DCQCN_RP_BC_STAGE_THRESHOLD=2097152\DCQCN_RP_GD=16\DCQCN_RP_RATE_REDUCE=2\DCQCN_RP_TIMER=55\DCQCN_RP_BYTE_RESET=0\DCQCN_RP_DCP_TIMER_CYCLES=16# 设置 NP(接收端)参数mlxconfig-d/dev/mst/mt4125_pciconf0set\DCQCN_NP_CNP_PRIO=6\DCQCN_NP_MIN_TIME_BETWEEN_CNP=4通过 sysfs 实时调整 DCQCN 反应端参数 (Reaction Point)
在开启 RoCE ECN 功能后,网卡的 DCQCN 参数通常挂载在系统内核目录中(以 mlx5_0 为例):
# 查看所有 RoCE CC 配置参数ls/sys/kernel/debug/mlx5/mlx5_0/cc_params/# 修改降速阶段的计时器和字节触发阈值echo50>/sys/kernel/debug/mlx5/mlx5_0/cc_params/rp_time_resetecho32768>/sys/kernel/debug/mlx5/mlx5_0/cc_params/rp_byte_reset# 调整初始 Alpha 值echo1023>/sys/kernel/debug/mlx5/mlx5_0/cc_params/rp_initial_alpha_value4.3 交换机端 ECN + PFC 配置(NVIDIA Spectrum / Cumulus Linux)
# 进入交换机配置模式switch# configure terminal# 设置 PFC 优先级(假设 RDMA 流量在 Priority 3)switch(config)# dcb priority-flow-control enable forceswitch(config)# interface swp1-32switch(config-if)# dcb pfc priority 3 enable# 配置 PFC 阈值switch(config-if)# pfc xoff threshold priority 3 1000switch(config-if)# pfc xon threshold priority 3 800# 配置 WRED + ECN 标记switch(config-if)# qos wred enableswitch(config-if)# qos wred ecn enable# 设置 ECN 标记的队列深度阈值switch(config-if)# qos wred ecn queue 3 min-threshold 150000 max-threshold 1500000# 将 DSCP 26 映射到 Priority 3switch(config)# dcb ets priority-group 0 bandwidth 80switch(config)# dcb ets priority-group 1 bandwidth 20switch(config)# dcb ets priority 3 group 1switch(config)# qos dscp-map dscp 26 priority 3# 保存配置switch(config)# write memory4.4 验证与监控命令
配置完成后,通过以下命令验证 DCQCN 是否生效:
# 1. 检查网卡 ECN 统计(发送端)cat/sys/class/infiniband/mlx5_0/ports/1/counters/ecn_marked_roce_packets# 2. 检查 CNP 收发统计ethtool-Seth0|grep-icnp# 3. 通过 perfquery 查看 RDMA 拥塞计数器perfquery-x-dmlx5_01|grep-iecn# 4. 在交换机侧查看 PFC 触发次数switch# show interface swp1 counters | grep pfc# 5. 实时监控 DCQCN 速率变化(部分驱动支持)watch-n1'cat /sys/kernel/debug/mlx5/0000:3b:00.0/cc_params/*/current_rate'4.5 常见调优建议
| 场景 | 调优方向 |
|---|---|
| 延迟敏感型业务(如分布式存储) | 降低ECN min阈值,尽早触发拥塞通知;减小AI_RATE避免速率过快增长 |
| 高吞吐型业务(如 AI 训练集合通信) | 增大BC_STAGE_THRESHOLD,减少恢复阶段的触发频率;适当提高AI_RATE |
| 混合流量环境 | 提高NP_MIN_TIME_BETWEEN_CNP,避免 CNP 泛滥影响正常流量 |
| 频繁 PFC 触发 | 降低ECN max阈值,让 ECN 在 PFC 之前介入;增大RATE_REDUCE逆数以加快降速 |
5. 总结
DCQCN 是 RDMA over Converged Ethernet 网络中最核心的端到端拥塞控制机制。它通过ECN 标记 → CNP 通知 → 发送端速降与恢复的闭环,在保证无损传输的同时显著提升网络利用率。
配置 DCQCN 时,需要关注三个层面的参数协同:
- 交换机端:ECN 标记阈值与 PFC 阈值需要形成梯级保护(ECN 先于 PFC 触发)
- 接收端(NP):CNP 生成频率不能过高,避免拥塞信号放大的正反馈
- 发送端(RP):速降因子和恢复参数需根据业务延迟/吞吐需求进行针对性调优
在实际部署中,建议先在测试环境通过perfquery和网卡计数器观察 DCQCN 行为,再根据业务特征微调参数,最后通过灰度发布推广到生产环境。
参考链接:
DCQCN CC Algorithm:https://enterprise-support.nvidia.com/s/article/DCQCN-CC-algorithm
DCQCN Parameters: https://enterprise-support.nvidia.com/s/article/dcqcn-parameters
DCQCN经典论文: https://conferences.sigcomm.org/sigcomm/2015/pdf/papers/p523.pdf
https://zhuanlan.zhihu.com/p/1986442361417519293
