提高 bbr 的灵敏性

bbr draft 给出了 MaxBwFilterLen 的定义:

MaxBwFilterLen: The filter window length for BBR.MaxBwFilter = 2 (representing up to 2 ProbeBW cycles, the current cycle and the previous full cycle).

从 v1 到 v3 版本,该值均只跟状态机而不跟实际,这导致 bbr 对带宽变化反应迟钝。

bbr 可轻松越过短 burst 造成的抖动,但坚持而非适应的方式往往弊大于利。“坚持” 可能造成带宽过估,引发丢包或对共存流量的不公平侵占。为此,我来做个微创小手术:

  • 对适当大小 win 内的所有 (t, bw) 样本进行线性回归(比如简单的最小二乘法),设 x 为拟合斜率(的移动平均),y 为 x 的方差(的移动平均),算法对 x,y 的反应如下:
x: 表示变化趋势,越平越倾向平均值,越陡越倾向瞬时值
y: 表示变化趋势的持续性和程度
i_bw: 即时带宽
s_bw: 移动平均带宽

f(x, y):
    x 越大,y 越小,MaxBwFilterLen 越大;
    x 越小,y 越小,MaxBwFilterLen 越小;
    ...

g(x, y):
    可适当组合 s_bw 与 i_bw 的分量

if x == 0:
    MaxBwFilterLen = 10
    bw = (1 - 1/y) * s_bw + (1/y) * i_bw
else:
    MaxBwFilterLen = f(x, y) 
    bw = g(x, y)

做了一个测试 case,修改 bbrv1,win = 20,1 <= MaxBwFilterLen <=10,采用最简单最小二乘法拟合样本,代码由 chatgpt 给出,kernel 无浮点运算造成一些误差,图示如下:
提高 bbr 的灵敏性_第1张图片
在细微处所有大开合场面都躲过去了,却还无碍于越过第一个波动,大轮子过坑稳,小轮子坡道强,就是这意思。

这个微创的意义在于提高感知和适应带宽变化的能力,提高灵敏度的同时又能平滑波动。

简评一下。

所谓启发式,信息非常有限时,你能控制到什么程度,无非就是榨干这些信息,原值,导数,二阶导数,二阶导数的导数,说到底就是揭露隐藏的趋势,差不多就行了。

能在开始抗噪,但噪声持续就不是噪声了,持续时间和反应窗口负相关就能快速反应,线性回归虽显粗糙,但就是这意思,越高阶,越精确,越麻烦,而原值本就有噪声,上限再怎么也无法突破,视必要而选择,这就是自适应。

越多就越少,越少就越多,玩的就是负反馈。

皮鞋没有蹬上,露着白袜子。

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

你可能感兴趣的:(bbr)