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 无浮点运算造成一些误差,图示如下:
在细微处所有大开合场面都躲过去了,却还无碍于越过第一个波动,大轮子过坑稳,小轮子坡道强,就是这意思。
这个微创的意义在于提高感知和适应带宽变化的能力,提高灵敏度的同时又能平滑波动。
简评一下。
所谓启发式,信息非常有限时,你能控制到什么程度,无非就是榨干这些信息,原值,导数,二阶导数,二阶导数的导数,说到底就是揭露隐藏的趋势,差不多就行了。
能在开始抗噪,但噪声持续就不是噪声了,持续时间和反应窗口负相关就能快速反应,线性回归虽显粗糙,但就是这意思,越高阶,越精确,越麻烦,而原值本就有噪声,上限再怎么也无法突破,视必要而选择,这就是自适应。
越多就越少,越少就越多,玩的就是负反馈。
皮鞋没有蹬上,露着白袜子。
浙江温州皮鞋湿,下雨进水不会胖。