news 2026/7/27 5:54:32

DCQCN 拥塞控制算法原理和参数配置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 主要由三个组件构成,形成闭环控制:

交换机拥塞检测
(ECN 标记)

接收端拥塞通知
(CNP 报文)

发送端速率调节
(RP) 速降与恢复

网络拥塞状态变化

  • 交换机端(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 速率递减方案

更新速率

  1. DCQCN每隔RATE_REDUCE_MONITOR_PERIOD us 检查是否收到CNP
  2. 如果收到CNP,做如下处理:
    • 记录当前CurrentRate,用作恢复阶段的TargetRate。注:如果CLAMP_TARGE_RATE=1,TargetRate 在每次降速阶段更新。
    • 降低速率 : currentRate = currentRate - (1 - α/(2^RPG_GD))
  3. 降速之后,所有的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 时,事件触发速率变化场景,横轴时间纵轴是速率,整个时间线包含了升速、降速和再升速的过程:

  1. 第一个时间点(升速),Time Reset事件 对Current Rate进行了升速,当前速率接近Target Rate
  2. 第二个时间点(降速),RP接收到CNP进行降速(Current Rate导致CP拥塞,NP发出CNP)
  3. 第三个时间点(降速),RP再次接收到CNP进行降速
  4. 接下来五个时间点,发生四次Time Reset事件(T=3),2次Byte Reset(BC=2),位于Fast Recovery阶段
  5. 下个时间点,再次Time Reset事件(T=4),达到rpg_threshold,所以进入Additive Increase
  6. 接下来经过了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):

  1. 快速恢复阶段 (Fast Recovery):速率迅速上升至最近一次降速前的 Target Rate,以最大化利用闲置带宽。
  2. 积极增加阶段 (Additive Increase):速率超过 Target Rate 后,以固定步长试探性地增加。
  3. 超积极增加阶段 (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_OFEDDescriptionRangeDefault
Enable在特定优先级上启用 RoCE 拥塞控制 (DCQCN)Enable (1) / Disable (0)Enable

Alpha Update

MLNX_OFEDDescriptionUnitRangeDefault
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 part0…10231019
dce_tcp_rtt见上文。Microseconds1…1310711
initial_alpha_value此参数设置在收到流的第一个 CNP 时应使用的 alpha 初始值。Fixed point with 10 bits in the fraction part1…10231023

dce_tcp_g : dce - decrease ,tcp - 沿用QCN算法术语,g - gain增益参数

Rate Decrease

MLNX_OFEDDescriptionUnitRangeDefault
rate_to_set_on_first_cnp第一个 CNP 时的速率(当前、目标)(0 – 线路速率的 85%)。Mbps0, 1…line rate [Mbit/S]0
rpg_min_dec_fac此参数定义单次事件中速率降低的最大比率。%0…10050
rpg_min_rate此参数定义 QP 的最小速率限制。Mbps1…line rate1
rpg_gdalpha 与速率降低因子之间的系,降速公式:currentRate=currentRate(1-α/2^rpg_gd)*Log2 of value in fixed point with 10 in the fraction part10…1111
rate_reduce_monitor_period速率降低之间的时间周期。microseconds1…UINT324

Rate Increase

MLNX_OFEDDescriptionUnitRangeDefault
clamp_tgt_rate如果设置,每次速率降低时目标速率更新为当前速率。否则,仅在增量事件后的第一次减量时更新目标速率为当前速率。NoneEnable/DisableDisabled
rpg_time_reset速率增加事件之间的时间周期。Microseconds1…131071300
rpg_byte_reset速率增加事件之间的已发送字节计数器。64 Bytes1…3276732767
rpg_threshold进入下一速率增加阶段所需的速率增加事件阈值。None1…311
rpg_ai_rate加性增加阶段的速率增加值。Mbps1…line rate5
rpg_hai_rate超加性增加阶段的速率增加值。Mbps1…line rate50

Notification Point

MLNX_OFEDDescriptionRangeDefault
cnp_dscp此参数设置 CNP 的 DSCP 值。0…6348
cnp_802p_prio此参数设置 CNP 的 PCP 值。设置 DcQcnCnpPrioMode 为 ‘0’ 以使用此优先级值。0…76
DcQcnCnpPrioMode不需要设置,如果设置了cnp_dscp和cnp_802p_prio,该参数被自动设置。如果此参数设置为 ‘0’,则使用配置的 CNP 优先级;否则,CNP 的优先级值取自接收到的数据包。0/10
min_time_between_cnps从端口同一条优先级队列发送两次 CNP 之间的最小时间间隔(微秒)。0…40954

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_timePFC 暂停帧的暂停时间(quantum = 512 比特时间)65535100–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 配置

在服务器侧,通过mlxconfigsysfs配置 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_value

4.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 memory

4.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 时,需要关注三个层面的参数协同:

  1. 交换机端:ECN 标记阈值与 PFC 阈值需要形成梯级保护(ECN 先于 PFC 触发)
  2. 接收端(NP):CNP 生成频率不能过高,避免拥塞信号放大的正反馈
  3. 发送端(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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/27 5:52:50

大模型内容生成对平台流量与创作者生态的影响分析

这次我们来探讨一个直接影响用户体验和平台生态的问题:当大模型不再把用户送回内容平台,会如何收场?这个问题看似简单,背后却涉及技术路线、商业模式和用户习惯的多重博弈。从技术发展角度看,大模型正在从单纯的问答工…

作者头像 李华
网站建设 2026/7/27 5:50:48

TMS320DM6446存储子系统实战:EMIF异步接口、DDR2与ATA/CF配置详解

1. 项目概述与核心价值在嵌入式系统开发,尤其是基于德州仪器(TI)DaVinci系列数字媒体处理器的项目中,外部存储器接口(EMIF)和ATA/CF控制器是决定系统性能与稳定性的两大基石。我接触过不少项目,…

作者头像 李华
网站建设 2026/7/27 5:48:04

2026年1月C#/.NET生态技术演进与创新

1. 2026年1月C#/.NET生态全景扫描2026年的第一个月,.NET生态又迎来一波令人振奋的技术演进。作为深耕这个领域十余年的老开发者,我每月都会系统梳理GitHub趋势榜、NuGet下载数据和社区讨论热点,以下是这个月特别值得关注的20个明星项目和框架…

作者头像 李华
网站建设 2026/7/27 5:45:11

PHP开源电商系统全解析:从部署到核心代码实战

如果你正在寻找一个完整的、可直接部署的电商项目源码来学习或作为毕业设计,那么这篇文章就是为你准备的。今天我们要深入剖析的是一个名为“沁心线上面包甜品系统”的PHP项目。它不仅仅是一个简单的购物车,而是一个包含了用户端、商家后台、完整订单流程…

作者头像 李华
网站建设 2026/7/27 5:41:05

LangChain链式调用实战:构建AI论文生成器

1. LangChain链式调用实战:从零构建AI论文生成器作为一名长期使用LangChain框架的开发者,我发现很多初学者在面对Chain链组件时容易陷入两个极端:要么被各种Runnable工具绕晕,要么只能照搬简单示例无法应对复杂场景。今天我就通过…

作者头像 李华
网站建设 2026/7/27 5:40:39

AI核心算法解析:A*搜索、粒子滤波与Q学习实战

1. 人工智能备考实战:三大核心算法深度解析作为一名经历过多次AI领域考试的老兵,我深知算法理解与解题技巧在应试中的重要性。今天我将通过三个经典考题——A*搜索、粒子滤波和Q学习,带大家拆解人工智能考试中的高频题型。这些内容不仅适用于…

作者头像 李华