欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > BBR 之 ProbeRTT 新改

BBR 之 ProbeRTT 新改

2025/5/3 10:58:50 来源:https://blog.csdn.net/dog250/article/details/147672566  浏览:    关键词:BBR 之 ProbeRTT 新改

早在 1981 年,Jaffe 在 Flow Control Power is Nondecentralizable 中就给出过论证,测量 maxbw 必然引入队列,而获得 minrtt 时带宽必然欠载,这确定了后面 30 年的拥塞控制算法基调,但 BBR 在 35 年后非常聪明地在两者间切换,在一个相对长的周期时间尺度中保持近似逼近真实的 maxbw 和 minrtt,这是独创。

让我们从 BBR 存在两个典型的两难处境的细节展开:

  • maxbw 和 minrtt 作为正交量不可同时测得,因此 BBR 设计了复杂但不灵敏的状态机;
  • ProbeBW 的 ProbeUP phase 一定会挤出带宽而建立队列,因此 BBR 需要定期 ProbeRTT。

第一个是 BBR 的核心设计,直接看第二个,其实这第二个我在前几天的论述中也屡次提到过,具体看 BBRv1 到 BBRv3 的公平性。

核心还是 buffer 动力学和数据包守恒,buffer 动力学说的是 ProbeUP phase 改变了 buffer 占比,从而改变了 bw 分配比例,而数据包守恒意味着一旦队列形成,只要离开的数据量小于等于发出的数据量,队列就不会消失,0.75 · bw2 · minrtt 中的 bw2 即挤兑后的新带宽,在没有新流汇入且对方没有 ProbeUP 前提下(控制变量法)一定小于 bw1,队列一定会持续形成。

在一个没有队列反馈的尽力而为网络,通过 ProbeUP phase 挤兑带宽的拥挤网络,就好像多条汹涌急躁的支流汇入干流,形成的湖泊一定不会自动消失一样,队列一定会持续。于是 BBR 一定需要 ProbeRTT,这是 ProbeRTT 的设计初衷。

BBRv1 的 ProbeRTT 看起来别扭,它激进地将 inflight 降为 4 并持续 200ms,这一方面造成了吞吐抖动,另一方面造成了发送缓冲区的 yet another bufferbloat,也因此出现了非常多的 ‘优化’,比如我曾经将 ProbeRTT 的周期从固定 10s 改成了 5~15s randomized,虽避免了全局同步,但也破坏了全局同步,而 BBR 非常依赖 ProbeRTT 时间的同步,只有同步 ProbeRTT,才能保证 minrtt 的可靠。

BBRv2/v3 的 ProbeRTT 发生了改变,将 inflight = 4 改为了 inflight *= 0.5 并重构了 MinRTTFilterLen 和 ProbeRTTInterval 语义,但依然存在过度 ‘参数化’ 嫌疑,为什么是 0.5 而不是 0.4 和 0.7。

再看第二个两难之间,显而易见的是,如果 x 倍的 pacing_rate 没有带来 x 倍的 delivery_rate,就一定发生了在 buffer 中挤带宽,若不想形成队列,只要检测到这种情况(这很容易),就将 inflight 退回 bw1 · minrtt 而丢掉 bw2,但为什么这么简单的事却没做,理由也简单,因为 BBR 必须靠 buffer 动力学收敛到公平,若不在 buffer 中折腾,BBR 就丧失了公平性,这个两难处境说的是,若想公平就一定要形成队列在 buffer 中折腾,若不想要队列,就得不到公平,这直击了效率和公平的两难之正中间,怎么做都是错。

这意味着还得依赖 ProbeRTT,但前面说了 ProbeRTT 非常拧巴,于是目标就是重构一版新的 ProbeRTT 逻辑。

把所有这些揉杂,说的是,既要形成队列,在 buffer 中收敛到公平,又不能形成队列,恪守 BBR 承诺,就需要一个 ProbeRTT 机制来平衡两者。本质上来讲,ProbeRTT 只需要将自己为了公平收敛在 buffer 形成的队列退掉即可。

ProbeRTT 后的初始,设 bw 为 bw1,the next ProbeUP phase 后的 bw 为 bw2,只要 bw2 > bw1,那么 B1 = (bw2 - bw1) · minrtt 就是这次该流形成队列所占据的 buffer,在下一次 ProbeRTT 之前,把这些 B1,B2,B3,… 累加起来就是所有占据的 buffer 总和,将 inflight 减去这么多即可。
ProbeRTT 要做的事很简单:

if (inflght <= INFLIGHT - Sigma_B) {stat = ProbeBW;
}

这竟然也摆脱了全局同步的需要以及调参的需要,长期看来,所有的流均定期将自己 ProbeUP phase 形成的队列清除,稳定状态下就没有队列,也不再需要固定的周期,这就很高尚。

想到这个新算法处于一种最基本的假设,即明确了队列是必不可少后,又明确了队列是如何形成的,然后记录队列的大小,怎么长大的就怎么清除掉,长大多少清除多少,这就在 ProbeRTT 周期内既保证了平性收敛,在 ProbeRTT 之间又保证了效率,典型的 short-term 和 long-term 特征分门别类。

五一出行,全年无休,此刻正在安徽泾县体验蚊虫,明天去桃花潭喝酒作诗,今日先喝一壶试醉,随手写一文。

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词