很明显,bbr 的 probertt 状态向全局同步收敛,即每条流在同一时刻进入 probertt 状态,这是因为一旦有某条足够重量级的流进入 probertt 清空 inflight(保留 4),其它所有流都会在同一时间获得 minrtt,而 probertt 固定每 10s 一次,这就是 inflight-time 图中大家统一向下的那个小尖尖的成因。
probertt 的全局同步危害肉眼可见,它会引发集体卡顿,特别是长程依赖流量还会引发连锁反应,至今没有任何修正,民间修正方案也不难想到,随机化 probertt interval 即可。
事实上(作者告诉我的),bbr 的 probebw 状态最初也存在全局同步。在 bbr 迭代过程中,最初确实有用 packet-timed round 而不是 minrtt 来度量 probebw 的 cycle phase,直到意识到多条流会进入全局同步状态后,才改用 minrtt。
多流场景的 buffer 挤占动力学的 rtt 影响, 如下图所示:
probebw 全局同步危害很大,它彻底把 bbr 引入 mimd 的深渊,大家一起等比例 probebw,一起等比例 drain,永远无法收敛到公平,而 bbr 收敛很大程度上依赖在异步流共享链路,小流收敛比更大这个事实。
此前强调过,若不是 bbr 的 probertt 状态,共享链路瓶颈处的 queue 将越来越长,如上图也能看出,packet-timed round 越来越长,原因是 probeup phase 之后,确实靠挤占获得了新的 bw,因此接下来的 drain phase 注定 drain 不干净,这个说腻了,不说了。
以下是改用 minrtt 度量 probebw cycle phase 后的示意图:
然而,现网实践表明,probebw 仍然会进入同步,这也不难解释,因为 bbr 天真地假设共享链路的流也共享 minrtt,如果某条流的 minrtt 本身在链路其它部分被影响,拉伸或压缩,那么 bbr 使用 minrtt + random initial cycle phase 避免 probebw 全局同步的做法就不再可靠。
为什么这么麻烦?
注意到胶着的点,probertt 必不可少,可它的时机却不好把控,probebw 全局同步依靠 minrtt 错开 cycle phase 来避免,而 minrtt 的稳定性又不好把控,总之还是那套老话,bbr 的 maxbw,minrtt 不可同时测得,正是它们间不可弥合的 gap 引发了如此多不可控的可能性,再怎么折腾也无济于事。
再说一遍,要去跟踪 E_best = max(bw / srtt)。很少有人理解这个,就像跑步中的现象一样,正确的做法是追求 E_best = max(舒适速度 / 时间),而不是去追求配速,单纯追求配速容易跑崩,单纯追求舒适容易跑停。人们一直都很理解 “速度量纲与时间量纲的乘积”,但在控制论之外,几乎很少有人关注它们的商。
浙江温州皮鞋湿,下雨进水不会胖。