当前位置: 首页 > news >正文

给 BBRv2/3 火上浇油的 drain-to-target

最近彻底跟 BBR 杠上了,再读一篇落实性论文 Promises and Potential of BBRv3,结论依然是 BBRv3 并未如声称的那般优化公平性,反而可能更糟糕,不得不说又是任重而道远。

说一个我遇到的,讲理之外顺带吐槽。

BBRv1 在 ProbeUP 后的 Drain phase 仅停留一个 minrtt,被认为一次清不干净收敛慢,于是 BBRv2 提出 drain-to-target,一口气以 gain = 0.75 将 inflight 降低到 new_maxbw · minrtt,而 BBRv3 将 gain 修正到 0.9,理由是:

  • 0.9x is derived from on the ProbeBW_UP pacing gain of 1.25x…
  • …as the minimum pacing gain value that allows slow flows to consistently utilize enough bw to cause fast flows to yield bw for fairness convergence

但测试发现还是弄巧成拙了。

我不禁想到一种可能性,BBRv1 之所以只 drain 一个 minrtt 时间,甚至不是一个 packet-timed round 的时间,理由就是 Google BBR 团队早就发现了 drain-to-target 不可行,所以不得已才宁可清不干净,也不冒大险。

我来简单分析一下。

一条流进入 Drain phase 前,其 inflight = BDP = 1.25 · maxbw · minrtt,显然,这造成了排队,却挤出了新带宽 new_maxbw,设排队时延为 RTwait,按照 “BDP 力矩” 概念,可将其等效为 BDP = new_maxbw · (minrtt + RTwait)。

Drain phase 需要以 gain = 0.75 收缩 inflight,即满足 0.75 · new_maxbw · (minrtt + RTwait) <= new_maxbw · minrtt,解上述不等式,只要 RTwait > 1/3 · minrtt 就意味着 drain-to-target 将持续,而这非常易满足,且对 minrtt 更小的流更易满足,这说明 drain-to-target 更加伤害 minrtt 小的流,使其难以退出 Drain phase。

如果一条流难以退出 Drain phase,一旦超过 1 个 round,就会推迟下一次 ProbeUP,从而违背 “一个 cycle 必 ProbeUP 一次” 的承诺, 最终导致上一次 Probe 得到的 new_maxbw 过期,maxbw 跌落,陷入恶性循环。

可以用干扰流来理解上面说的 “BDP 力矩”:

  • queue 增加,时延将增加,导致 BDP 增加,pipe 凭空被 buffer 撑大,此时如果跟随填充增大的 pipe,就会加剧该 pipe 继续撑大,如果不跟随它撑大,goodput 就会变小。

这段分析确认了 drain-to-target 对 minrtt 小的流伤害极大,BBRv2 为了收敛快引入该机制对 RTT 公平性是一种破坏,我个人曾经非常拥护这个机制,也曾经独立想到了这个机制,现在回想,当时我确实犯了错误。

更火上浇油的是,BBRv3 将 Drain phase gain 改成了 0.9,这意味着只要 RTwait > 1/9 · minrtt 就陷进 Drain phase 而回不去,怪不得 BBRv3 的 RTT 不公平比 BBRv2,v1 更严重,这就是根因。
就这还没考虑 ProbeRTT 的穿插影响。

BBRv3 也部分修正了 ProbeRTT 对吞吐稳定性的伤害,从 inflight = 4 绝对值改为将 inflight 降 50%,但降多少也不平滑,50% 对 minrtt 更小的大象流影响非常大,使它丧失了仅有的足够的挤兑资本。一旦 maxbw 过期,其仅靠 ProbeUP phase 将很难将 bw 涨回。

早在 1981 年,Flow Control Power is Nondecentralizable 就证明了 maxbw/minrtt 这个最佳功率的操作点分布式不可达,因为它们是正交的,必须越界其中一个来测量另一个,而这个越界的过程在分布式环境中无法收敛,因此这种算法很难有效控制网络拥塞。

这篇论文实际上确定了一个未来的基调,大意是以后别想着往 maxbw/minrtt 方向走了,于是 1988 年的拥塞控制直接选择了 AIMD。直到 2016 年,BBR 利用一个状态机保持了收敛,向 maxbw/minrtt 逼近:

It builds an explicit model of the the bottleneck delivery rate and path round-trip propagation delay.

但正如所担心,正如所料,BBR 确实难以满足公平性收敛的目标。

只需看看 BBRv3 的修正改进以及我的一些魔改,就知道有多拧巴:

  • cwnd_gain = 2.25 虽然缓解了 small 流 cwnd-limited 问题,但却也放大了 big 流,让其更有侵入性;
  • maxbw-filter window 用 2 round 替换了 10 以获得 TCP friendly,其实是 8 round cycle 换成了 2s,灵敏性更低;
  • 至于我那些 “优化”,炫技而已,启发式算法一无是处;

虽然但是,BBR 在 Google 的推动以及大众的迷信下,在全网已经有了足量的占有率(约 40%+),即使不考虑 reno/cubic 公平性,BBR 自身的公平性也必须要考虑,且 Google 仍在持续推进 BBR 的部署,如果它始终处在一个未知的状态,是否会突然出现类似 1986 年的拥塞崩溃也是不得而知,但是好是坏,至少人们确实不知道到底会发生什么。

浙江温州皮鞋湿,下雨进水不会胖。

相关文章:

  • 使用DDR4控制器实现多通道数据读写(十)
  • Thinkphp开发自适应职业学生证书查询系统职业资格等级会员证书管理网站
  • 【PyTorch动态计算图原理精讲】从入门到灵活应用
  • react-native-vector-icons打包报错并且提示:copyReactNativeVectorIconFonts相关信息
  • 20_大模型微调和训练之-基于LLamaFactory+LoRA微调LLama3后格式合并
  • 详解大语言模型生态系统概念:lama,llama.cpp,HuggingFace 模型 ,GGUF,MLX,lm-studio,ollama这都是什么?
  • LeetCode 2302 统计得分小于K的子数组数目(滑动窗口)
  • “连接世界的桥梁:深入理解计算机网络应用层”
  • 第十六届蓝桥杯 2025 C/C++组 脉冲强度之和
  • Leetcode 3533. Concatenated Divisibility
  • python中 str.strip() 是什么意思
  • CPU 空转解析
  • Spring Cloud 项目中优雅地传递用户信息:基于 Gateway + ThreadLocal 的用户上下文方案
  • oracle 批量查询每张表的数据量
  • 基于STM32、HAL库的AT88SC0104CA安全验证及加密芯片驱动程序设计
  • Linux/AndroidOS中进程间的通信线程间的同步 - 管道和FIFO
  • PyTorch实际上是按照**行优先(Row-Major)**的方式存储数据
  • 公路安全知识竞赛主持稿串词
  • Vim 中替换字符或文本
  • 无锡哲讯科技:SAP财务系统——赋能企业智慧财务管理
  • 2025五一档新片电影总票房破亿
  • 全国人民代表大会常务委员会公告〔十四届〕第十号
  • 荆州市委书记汪元程:全市各级干部要做到慎微、慎初、慎独、慎友
  • 农行一季度净利润719亿元增2.2%,不良率微降至1.28%
  • A股三大股指小幅低收:电力股大幅调整,两市成交10221亿元
  • 港交所与香港证监会就“中概股回流意向”已与部分相关企业进行接触