我进一步把 bbr 模型简化为更一般的形式。设 x 为 bbr 流的 estimated bw,wₓ 为 bbr 流的 inflight,C 为瓶颈带宽,R 为传播时延,R_s 为总时延,pacing_rate 增益为 g:
I ( t ) = t o t a l _ i n f l i g h t _ a t _ t I(t)=total\_inflight\_at\_t I(t)=total_inflight_at_t
bw 方程: d x d t = C ⋅ g ⋅ x ⋅ R s I ( t ) − x \dfrac{dx}{dt}=C\cdot \dfrac{g\cdot x\cdot R_s}{I(t)}-x dtdx=C⋅I(t)g⋅x⋅Rs−x
inflt 方程: d w x d t = x ⋅ R − w x \dfrac{dw_x}{dt}=x\cdot R-w_x dtdwx=x⋅R−wx
其中 bw 方程体现了 probebw 状态 gain = 1.25 阶段,inflt 方程体现了 probebw 状态 gain = 0.75(or 0.9) 阶段,若 2 流共存,其 bw 分别为 x,y,则可化简为:
d x d t = C ⋅ g ⋅ x g ⋅ x + y − x \dfrac{dx}{dt}=C\cdot \dfrac{g\cdot x}{g\cdot x+y}-x dtdx=C⋅g⋅x+yg⋅x−x
d w x d t = x ⋅ R − w x \dfrac{dw_x}{dt}=x\cdot R-w_x dtdwx=x⋅R−wx
有趣的是,公平性恰恰由 probe 行为在 buffer 中促成,若把 g 调整为 1,初始值将永久持续不会发生任何变化:
probe 不仅用于获得空闲带宽资源,正是 g > 1 的 probe 行为促进了公平收敛。通过调整 g,g 越大,收敛越快:
接下来设 g = 2.25,收敛更快:
代价是 buffer 占率更高。可见,如何在 buffer 占率和收敛速度之间 tradeoff,是 bbr 调参的一大关键。
在 buffer 中持续腾挪数据包是公平性的保证,buffer 作为操作空间,若一点 buffer 都不用,则无法保证公平收敛。buffer 给了流量努力的空间和机会,努力才会公平,其中的不变量就是瓶颈带宽 C。
这背后的 why 在直观上非常显见,以 aimd 为例,若 buffer 无限大,随着 additive increase,buffer 占用越来越多,increase 幅度相同,意味着初始值的影响越来越小,buffer 占率趋向等分,带宽分配趋向公平,背后的理论是 ,W₁,W₂ 为两条流的厨师窗口,则随 x 的增加,
W
1
+
x
W
2
+
x
\dfrac{W_1+x}{W_2+x}
W2+xW1+x 趋向于 1。
对于 bbr,稍有不同但大差不差。
与 aimd 不同,bbr 的 primary controller 是 rate,而注意到总瓶颈带宽 C 是不变量,虽 buffer 可无限,但 maxbw 有限,正是注意到这个不变量资源限制,bbr 才被提出用来在解决 bufferbloat 前提下提高带宽利用率。
若不限制 bbr 的 buffer 占用,就像 aimd 只 ai 不 md 一样,其模型将变成:
$I(t)=total_inflight_at_t $
d x d t = C ⋅ g ⋅ x ⋅ R s ( t ) I ( t ) − x \dfrac{dx}{dt}=C\cdot \dfrac{g\cdot x\cdot R_s(t)}{I(t)}-x dtdx=C⋅I(t)g⋅x⋅Rs(t)−x
d w x d t = x ⋅ R s − w x \dfrac{dw_x}{dt}=x\cdot R_s-w_x dtdwx=x⋅Rs−wx
R s ( t ) = I ( t ) C R_s(t)=\dfrac{I(t)}{C} Rs(t)=CI(t)
给出最初时间段的趋势图:
可以看出虽然 inflt 由于 g = 1.25 强度的 probe 在快速发散,但 bw 仍然趋向收敛,这就是 buffer 动力学,与 aimd 殊途同归,buffer 占用越多,初始值的影响越微弱。
个中原因,不难计算一个 “bw 加速度” r:
r = p r o b e 后的 b w p r o b e 前的 b w = C ⋅ g ⋅ x g ⋅ x + y C ⋅ x x + y = C ⋅ g g ⋅ x + C − x = C ⋅ g ( g − 1 ) ⋅ x + C r=\dfrac{probe 后的bw}{probe 前的bw}=\dfrac{C\cdot\dfrac{g\cdot x}{g\cdot x+y}}{C\cdot\dfrac{x}{x+y}}=C\cdot\dfrac{g}{g\cdot x+C-x}=\dfrac{C\cdot g}{(g-1)\cdot x+C} r=probe前的bwprobe后的bw=C⋅x+yxC⋅g⋅x+yg⋅x=C⋅g⋅x+C−xg=(g−1)⋅x+CC⋅g
这是一个关于 x 的减函数,带宽越小,r 越大,意味着 bw 加速度越大,这正是公平收敛的内在机理。
只需最后一步,像为 additive increase 增加一个 multiplicative decrease 一样,为 bbr 的增加 drain 机制,无论 probebw 状态的 g = 0.75 drain 还是 probertt 状态的 inflt = 4 drain,或 startup 后的 drain 状态,都起到往回收 buffer 的作用,但 buffer 动力学的结果却保留了下来,公平收敛持续进行。
从拥塞控制算法整体视角看,效率不是偶然,而是设计的结果,但公平却始自海阔凭鱼跃,天高任鸟飞,这也是科斯定律的机理。
浙江温州皮鞋湿,下雨进水不会胖。