bbr 有个要点,要把 probebw 的 phase 错开:
static void bbr_reset_probe_bw_mode(struct sock *sk)
{struct bbr *bbr = inet_csk_ca(sk);bbr->mode = BBR_PROBE_BW;bbr->cycle_idx = CYCLE_LEN - 1 - prandom_u32_max(bbr_cycle_rand);bbr_advance_cycle_phase(sk); /* flip to next phase of gain cycle */
}static void bbr_reset_mode(struct sock *sk)
{if (!bbr_full_bw_reached(sk))bbr_reset_startup_mode(sk);elsebbr_reset_probe_bw_mode(sk);
}
若不错开,就可能会陷入同步 mimd 的陷阱和悲哀,白折腾一场,效用为 0。但一共也就 8 个周期,能错开多少?这并不是一个连续的分布,phase 宽度是离散且确定的,无法用时间粒度压缩宽度。
但即使错开了,相位差也影响收敛效率,虽然在数据流数量很大时大数定律和中心极限定理会导致正态分布起核心作用,但这对理论分析无益,因为到头来任何算法在海量流场景都会被这两个定律主宰,你得明白,互联网是统计复用的,起重要作用的就是统计律,而不是精确计算,参考热力学第二定律和分子运动。
我也一直反对在实施 bbr 算法时进行精确计算,你采集的数据都不准,计算越精确偏差越大,这种情况下,统计律才是高尚的。
所以我倾向于将 1.25X 的 probe quota 均匀平铺到整个时间轴,这就是 inflight 守恒算法的最初设想。如此也就看不到 probe 突刺了,彻底消除了锯齿,一切看起来就平滑了。
如果就事论事,只需要回答一个问题,如何安排 bbr probebw 状态的各个 phase,使多流收敛速率与它们之间的相位差无关,直接的答案就是均匀平铺,将 0.25X 的 bdp 均匀平铺在整个 8-round 周期,也就消除这 8-round 周期。
然而我没有找到可以从 bdp 通过负反馈(最关键,我需要用数学去证明)的形式直接算出 0.25X bdp 的数学算式,就只能用负反馈余量近似,但意思到了。
有一部分代码可参考:https://github.com/marywangran/bbr-simulation/tree/master/Documentation/bbr-sim
Das sind meine Lederschuhe. Das ist haut schuhe.
这真是我的皮鞋,不便宜。
浙江温州皮鞋湿,下雨进水不会胖。