4. 拥塞控制基础:目标、拥塞窗口与关键性能指标

在深入 RoCEv2 的拥塞控制机制之前,必须先建立一套通用的分析框架。拥塞控制并非孤立的算法,而是围绕三个核心问题展开的系统工程:控制什么(拥塞窗口)、为了什么(性能目标)、如何衡量(性能指标)。只有将这三者统一理解,后续学习 DCQCN、TIMELY 等具体算法时才能看清其设计取舍。

4.1 拥塞控制的目标:效率与公平的平衡

拥塞控制的根本目标不是“消除排队”,而是在共享链路中维持高利用率的同时,避免因过度注入流量导致网络崩溃。对于 RoCEv2 这类运行在无损以太网上的协议,目标被进一步细化:

  • 最大化瓶颈带宽利用率:使瓶颈链路始终处于“忙而不堵”的状态,即队列深度保持在一个较小但非零的范围内。
  • 最小化端到端时延:尤其是对 RDMA 读操作,时延直接决定了分布式训练或存储集群的同步效率。
  • 保证流间公平性:避免某些“大象流”长期霸占带宽,导致“老鼠流”(如控制消息)饿死。
  • 避免 PFC 级联死锁:这是 RoCEv2 特有的目标——拥塞控制必须在 PFC 暂停帧扩散之前介入,否则可能引发全网范围内的头阻塞。

值得注意的是,这些目标之间存在内在矛盾。例如,追求极低时延意味着必须保持极短队列,但这会降低链路对突发流量的吸收能力,从而牺牲部分带宽利用率。优秀的拥塞控制算法本质上是在这个矛盾空间中寻找动态平衡点。

关键认知:RoCEv2 的拥塞控制与 TCP 拥塞控制的最大区别在于——TCP 以丢包作为拥塞信号,而 RoCEv2 在无损网络中几乎不丢包,因此必须依赖 ECN 标记或时延梯度作为更早期的拥塞信号。这意味着 RoCEv2 的拥塞控制是“预防性”的,而非“反应性”的。

4.2 拥塞窗口:发送行为的“节流阀”

拥塞窗口(Congestion Window, CWND)是发送端控制在途未确认数据量的阀门。在 RoCEv2 中,CWND 的单位通常是 包数量(而非 TCP 的字节数)。发送端允许发送的数据量由以下公式决定:

允许发送的数据量 = min(CWND, 接收端通告的可用缓冲区)

拥塞窗口的调整遵循经典的加性增/乘性减(AIMD)框架,但 RoCEv2 的具体实现(如 DCQCN)引入了更精细的步进控制:

  • 增加阶段:当收到正向反馈(如 ECN 标记率低于阈值)时,CWND 按线性或逐步递增,探测剩余带宽。
  • 减少阶段:当收到负向反馈(ECN 标记率超标)时,CWND 按比例快速下降,通常乘以一个小于 1 的因子(如 0.5 或更激进)。
  • 恢复阶段:为避免拥塞后链路空转,算法会通过定时器或额外确认机制逐步恢复 CWND,而非像 TCP 那样从慢启动重新开始。

下图展示了拥塞窗口在理想状态下的动态调节过程,以及它与队列深度、链路利用率之间的关系:

拥塞窗口动态调节与链路状态关系 时间 (t) 数值 拥塞窗口 (CWND) 队列深度 链路利用率 阶段1: 窗口递增(带宽探测) ECN标记/时延超标 阶段2: 乘性减 阶段3: 加性恢复(快恢复) CWND 队列 利用率 拥塞窗口下降过快 会导致链路空窗期 窗口恢复过慢 同样降低带宽利用率

上图揭示了拥塞窗口调节的核心矛盾:窗口增长过快会导致队列堆积和时延飙升;窗口下降过猛则会造成链路空窗期,浪费带宽。RoCEv2 的各类算法(DCQCN、TIMELY、HPCC)本质上都是在优化这条蓝色曲线的“爬升斜率”和“下降幅度”。

4.3 关键性能指标:吞吐量、时延与丢包率

衡量拥塞控制效果需要一套可量化的指标体系。在 RoCEv2 场景下,三个指标相互关联,构成一个“不可能三角”的约束关系。

指标 定义 RoCEv2 场景下的特殊含义 理想目标
吞吐量 单位时间内成功传输的数据量(Gbps) 受 PFC 暂停影响,实际吞吐可能远低于链路带宽 接近瓶颈链路带宽的 90% 以上
时延 数据从发送端到接收端的耗时(μs) 包含排队时延;无损网络中队列可能无限增长 无拥塞时接近基础时延;拥塞时增长可控
丢包率 丢失数据包占总发送量的比例 RoCEv2 设计目标为“零丢包”,但 PFC 暂停可视为“隐式丢包” 严格为 0(物理层误码除外)

4.3.1 吞吐量:不仅仅是“跑满带宽”

在无损网络中,吞吐量指标需要关注两个层面:瓶颈链路利用率和有效吞吐量。前者指物理链路上实际传输的比特率,后者则剔除了重传、PFC 暂停造成的空档期。一个常见的误区是:只要发送端持续发送,就认为吞吐量达标。实际上,如果 PFC 暂停帧频繁触发,发送端虽未停止发送,但链路利用率可能已大幅下降。

有效吞吐量 = 实际传输的有效数据量 / 总耗时
链路利用率 = 实际传输比特数 / (链路带宽 × 时间)

4.3.2 时延:从微秒级到毫秒级的灾难

RoCEv2 的时延敏感度远高于 TCP。一个典型的 RDMA 写操作要求在 10μs 量级完成,而一旦发生拥塞,排队时延可能迅速膨胀到数百微秒甚至毫秒级。时延指标通常关注:

  • 基础时延(Base Latency):空载时的端到端时延,由线缆、交换机和网卡处理决定。
  • 尾时延(Tail Latency):99 分位或 99.9 分位的时延,对分布式同步至关重要。
  • 时延抖动(Jitter):时延的方差,影响存储集群的 IO 稳定性。
重要警示:在 RoCEv2 网络中,时延比丢包更致命。因为无损网络不会丢包,拥塞只会表现为时延无限增长。如果拥塞控制失效,最终触发 PFC 暂停,导致“拥塞树”扩散——一个端口的拥塞会通过 PFC 反向传播,阻塞多个上游交换机端口,形成级联效应。此时,即使未丢一个包,整个集群的性能也可能崩溃。

4.3.3 丢包率:RoCEv2 的“零容忍”

虽然 RoCEv2 运行在无损网络上,但丢包并非完全不存在。可能的原因包括:物理层误码、配置错误的 PFC 优先级、或交换机内部缓冲区溢出(如因 PFC 死锁导致)。一旦发生丢包,RDMA 的可靠传输(RC 模式)会触发重传,但重传代价极高——不仅消耗带宽,还会造成严重的时延尖峰。

因此,RoCEv2 拥塞控制的一个核心评价标准是:能否在 PFC 触发之前就完成流量调节。如果拥塞控制算法足够灵敏,交换机队列深度应始终保持在 PFC 阈值以下,从而保证物理丢包率为零。

4.4 案例:一次典型的拥塞事件复盘

假设一个 40Gbps RoCEv2 存储集群,多台服务器同时向一台存储节点发起读请求。初始时各发送端 CWND 均为 64,链路空闲。

  1. 拥塞形成:10 台服务器同时发送,总注入速率达到 40Gbps,但存储节点的网卡处理能力仅为 30Gbps,瓶颈出现在接收端。
  2. 队列堆积:交换机出口队列开始增长,从 0 逐渐增加到 200KB。
  3. ECN 标记:当队列深度超过交换机设定的 ECN 阈值(如 100KB),交换机开始对数据包打 ECN 标记。
  4. 发送端响应:接收端收到 ECN 标记后,在 CNP(Congestion Notification Packet)中反馈给发送端。发送端收到 CNP 后,将 CWND 乘以 0.5(从 64 降至 32)。
  5. 队列回落:所有发送端窗口减半后,注入速率降至 20Gbps,队列逐渐排空,时延回落。
  6. 带宽恢复:发送端在未收到 CNP 后,每经过一个 RTT 将 CWND 增加 1,逐步恢复到 64,再次探测带宽。

这个案例展示了拥塞控制的完整闭环。但实际中,问题往往出现在第 4 步——如果 CNP 反馈延迟过大(例如因接收端 CPU 繁忙),发送端可能持续以高窗口发送,导致队列溢出并触发 PFC。

4.5 常见误区与复盘

误区一:认为“零丢包”等于“无拥塞”
无损网络只是将拥塞的表现形式从“丢包”转移为“时延增长”和“PFC 暂停”。真正的拥塞控制目标是避免 PFC 触发,而非仅仅避免丢包。
误区二:只关注平均时延,忽略尾时延
在分布式训练场景中,AllReduce 操作的完成时间取决于最慢的节点。即使平均时延很低,只要尾时延出现尖峰,整体性能就会严重劣化。
误区三:将 CWND 调大就能提升吞吐
如果瓶颈不在发送端而在网络中间节点,盲目增大 CWND 只会加剧队列堆积,最终触发 PFC 或 ECN,反而降低有效吞吐。CWND 的最优值应等于带宽时延积(BDP),即:CWND_optimal = 瓶颈带宽 × 往返时延。
复盘要点:评估一个 RoCEv2 拥塞控制算法时,不要只看吞吐量曲线,要同时观察:① 交换机队列深度的波动范围;② PFC 暂停帧的触发频率;③ 尾时延的分布。这三个指标共同决定了算法在真实生产环境中的表现。