透过现象看本质,不然很容易被带歪。
把 BBR \text{BBR} BBR 内在看透,便可知它是一个自我违背的设计,我想作者们已经意识到了这一点。
它就是一个被强制困在一个有限高墙里却假装自动收敛到了那里的人为算法,必须周期纠偏,否则就被吸引到了 cwnd-limited \text{cwnd-limited} cwnd-limited 的墙上。
BBR \text{BBR} BBR 的理想是将带宽控制在刚好不排队的附近,但这是不可能的,因为有一个固有矛盾:
- 若不排队就无法公平收敛;
- 若排队就会产生棘轮效应;
因此 BBR \text{BBR} BBR 设计了 inflight-cap \text{inflight-cap} inflight-cap 来约束队列,但棘轮效应总是让 inflight \text{inflight} inflight 触及该约束。
换句话说, BBR \text{BBR} BBR 实际上就是把 inflight \text{inflight} inflight 限制在 2 × BDP 2\times\text{BDP} 2×BDP 的依赖 buffer \text{buffer} buffer 占比负相关加速比收敛的 MIMD \text{MIMD} MIMD,而 RTT min \text{RTT}_{\min} RTTmin 的可信度并不仅受算法本身影响,在各种情况下均会跑飞:
- 与 Loss-based \text{Loss-based} Loss-based 流共存时;
- 与大量或持续增加的 BBR \text{BBR} BBR 流共存时,此时 4 N ≫ BDP 4N\gg\text{BDP} 4N≫BDP 甚至都不需;
- ProbeRTT \text{ProbeRTT} ProbeRTT 周期相对 RTT \text{RTT} RTT 太大时;
在 BBR \text{BBR} BBR 中, RTT \text{RTT} RTT 是依环境随行的,因此它是不稳定的,更可况它本身就是脏的。
看一下跑飞的一个典型的,在一个相对较长的
ProbeRTT
\text{ProbeRTT}
ProbeRTT 周期中的慢动作场景(假设一个无穷大的
ProbeRTT
\text{ProbeRTT}
ProbeRTT 周期):

棘轮效应这个词形容的特别好,通俗解释就是 “目标随着结果不断向上调整,自然不可逆”,必须人为纠正回去。
BBR \text{BBR} BBR 的 buffer \text{buffer} buffer 占用在 ProbeBW \text{ProbeBW} ProbeBW 的 gain ≠ 1 \text{gain}\ne 1 gain=1 阶段持续挤出虚高带宽,并被 10 10 10 个周期长期记忆,并在大 BDP \text{BDP} BDP 小 Buffer \text{Buffer} Buffer 场景很快触及 cap \text{cap} cap,化作 cwnd-limited \text{cwnd-limited} cwnd-limited,且 BBRv1 \text{BBRv1} BBRv1 又无视丢包,这将对 Loss-based \text{Loss-based} Loss-based 流是一种严重侵害。
来看一个覆盖关系,理解
buffer
\text{buffer}
buffer 侵占的根因:

不要试图调整这些参数,这些参数是这台棘轮契合好的,调一个而动全身,但这些大开合的覆盖区间又是必须的,因为没有事件驱动状态机,也没有普适的移动平滑系数,人为调整只能人为设置粒度。
反观标准 AIMD \text{AIMD} AIMD,虽然它也是在 2 × BDP 2\times\text{BDP} 2×BDP 内收敛,但它的 RTT \text{RTT} RTT 是无记忆不随行的,换句话说, B \text{B} B 和 D \text{D} D 随且仅随 AIMD \text{AIMD} AIMD 的行为而变化,没有任何外部行为干扰它。
基于 Ranysha Ware \text{Ranysha Ware} Ranysha Ware 等人的论文 Modeling BBR’s Interactions with Loss-Based Congestion Control 中的模型,设 N N N 为 BBR \text{BBR} BBR 流数, p p p 为 Loss-based \text{Loss-based} Loss-based 占比, c c c 为瓶颈带宽, l l l 为传播时延, X X X 为队列相对于 c ⋅ l c\cdot l c⋅l 的倍数, q q q 为队列报文量,由一定可达的稳定点:
cap = 端到端报文量 \text{cap}=端到端报文量 cap=端到端报文量
单 BBR \text{BBR} BBR 流时,解得:
p = 1 2 p=\dfrac{1}{2} p=21
这意味着单 BBR \text{BBR} BBR 流在深缓冲下能稳定吃掉约 50 % 50\% 50% 的链路,若把 cap \text{cap} cap 限制的 cwnd gain \text{cwnd gain} cwnd gain 改成 4 4 4,则能吃掉 75 % 75\% 75%。
多 BBR \text{BBR} BBR 流时,解得:
p = 1 2 − 1 2 X − 4 N q p=\dfrac{1}{2}-\dfrac{1}{2X}-\dfrac{4N}{q} p=21−2X1−q4N
那么如果解得 p p p 为负数,就意味着 BBR \text{BBR} BBR 将饿死所有 Loss-based \text{Loss-based} Loss-based 流,占满所有的 buffer \text{buffer} buffer!
总结一下棘轮效应, ProbeBW \text{ProbeBW} ProbeBW 探测自建队列, SRTT \text{SRTT} SRTT 抬高, buffer \text{buffer} buffer 占比太高,抓住更大的带宽,以此爬升,直到 cap=2BDP \text{cap=2BDP} cap=2BDP。
N N N 个流同时高估,总 inflight \text{inflight} inflight 一路增长直到撞上 cap \text{cap} cap,此时 BBR \text{BBR} BBR 从速率控制退化为窗口控制,被 ACK \text{ACK} ACK 时钟化,成为一个远不如 AIMD \text{AIMD} AIMD 收敛效率高的依赖流异步收敛的低效率 MIMD \text{MIMD} MIMD,稳定地收敛到了一个队列整整一个 BDP \text{BDP} BDP, RTT \text{RTT} RTT 翻倍的工作点,然后再靠一个蹩脚的 ProbeRTT \text{ProbeRTT} ProbeRTT 手工调整。
虽然 BBRv2 \text{BBRv2} BBRv2, v3 \text{v3} v3,对这种不公平性,收敛效率做出了很多改进,但兜了一圈,似乎就是回到了 CUBIC/AIMD \text{CUBIC/AIMD} CUBIC/AIMD 的普遍思路,只是大家不想承认这几乎一致的内核,而把外观搞得更加复杂了一些。
BBRv2 \text{BBRv2} BBRv2 的改进在于对丢包做出了 “一定的,约束性” 的反馈,降低了对 buffer \text{buffer} buffer 的固有侵占,理想流体模型的结论 q ∗ = N − 1 4 N + 1 d C ∗ q_{*}=\dfrac{N-1}{4N+1}dC_{*} q∗=4N+1N−1dC∗ 表明, v2 \text{v2} v2 和 v1 \text{v1} v1 相比,至少减少了 75 % 75\% 75% 的 buffer \text{buffer} buffer 占用,但还是占用了。
这表明, BBR \text{BBR} BBR 简直就是一个为 buffer \text{buffer} buffer 侵占而设计的协议,与其目标恰好相反, BBR \text{BBR} BBR 是一个自我违背的设计。
BBR \text{BBR} BBR 的本意是收敛到一个 “最大带宽 & 最小时延 的最佳工作点”,但结果却是快速偏移了那个点,甚至一瞬间也不停留,这意味这并不是一个稳定的工作点, BBR \text{BBR} BBR 不得不用用一个约束框住理想中最佳工作的周围,在那个舒适区里待那么一小会儿,事实上在这个框框的右边缘,早就被吸引到 AIMD \text{AIMD} AIMD 工作区了,这才里是稳定的,即便如此, BBR \text{BBR} BBR 却使用 MIMD \text{MIMD} MIMD 以表不同。
现在,真相已经大白了很久, BBR \text{BBR} BBR 的讨论组也死寂了很久。
回到现实中我们自己的做法,昨晚我发了一则朋友圈表达了我的抱怨:
棘轮效应,没有比这更好的词来形容 BBR 优化以及所有不知其所然的盲目网络传输优化了,我不针对某,我是针对所有
Hey \text{Hey} Hey,西皮 guys! \text{guys!} guys!(这里的 “西皮” 指 “穿西装和皮鞋的家伙们”)一个传输协议的算法的核心是公平性,稳定性和收敛效率这些统计学指标,其次才是资源利用率,带宽,低时延等这些网络指标,但几乎所有人但凡提到传输协议优化就认定是单流加速,首要关注高带宽,高吞吐,甚至不管时延,更不提方差, P99 \text{P99} P99 等各阶矩。
裤衩子锁着边儿,而且绣着花儿。
人们天真以为带宽就是优化的一切,到头来,和 BBR \text{BBR} BBR 差不多,自己重复玩了个寂寞。
浙江温州皮鞋湿,下雨进水不会胖。
1301

被折叠的 条评论
为什么被折叠?



