試圖在 bbr 和 aimd 之間保持公平是徒勞的,因為它們沒有共識。bbr 認為 in-flight 超過 bdp 是擁塞,而 aimd 認為 buffer 溢出才擁塞,兼顧彼此,就是 bbr3,aimd 不會往左,bbr 就往右。
vegas 同理,vegas 流認為超過 bdp 的報文量大于 β 就擁塞,而 β 并沒多大,這讓 vegas 更難與 aimd 共存。
但 vegas 還有更有趣的事,每條 vegas 流都試圖維持 buffer 中的報文量的下界 α,α 是個很小的數。但 N * α > buffer_size 可與 α > diff 同時成立,buffer 已溢出,vegas 卻還試圖 cwnd++。 bbr 也存在該問題,雖然 bbr 為單流設置了 in-flight 上界 2 * bdp,但 N * 2 * bdp > buffer_size 和 cwnd < 2 * bdp 亦可同時滿足。
無論 bbr 還是 vegas 均采用 rack 丟包探測,值得一提的事,rack 早在 1994 年 vegas 論文中就被提出,只是 linux 沒有實現,讓人誤認為 rack 是晚近才由 google 提出。
我一向抱怨 bbr 狀態機太稀碎,但它也沒大錯,雖然 probe 會擠占 buffer,但 probertt 后 Σbw_i == C && queue_len == 0,卻也兌現了承諾,但值得注意,probertt 是同步的,眾流在同時進入 probebw 后僅維持自己的 bwi,卻釋放了所有 buffer,除非 N * 4 - bdp > buffer_size,請注意,如果 vegas 的 β 取 3,N 巨大且總 bdp 不太大時,bbr 更易爆 buffer。
說這個的目的是,雖然 bbr 和 vegas 均承諾把 in-flight 維持在 bdp or bdp 附近,但它們在 N 很大時卻沒有兌現能力,相反 aimd 就不同,即使 N 很大,md 行為卻同步將 in-flight 降到遠小于 bdp 處,而 bbr/vegas 沒有這類自適應的 decrease 行為。
問題的核心在于,bbr/vegas 測得的 bdp 中的 b 更全局,它們依靠 “越小的流加速比越大” 來公平收斂,而加速比必須在 buffer 中獲得(簡單等式:buffer 占比 = 帶寬占比),反之,aimd 的天然公平性意味著對每條流而言,bdp 中的 b 都是自己的,因為異步流從概率上講,buffer_size 為 B,一條流在 in-flight 為 B 會丟包 md,N 條流就是 B / N 會丟包 md,自適應性在于除以 N,與 bbr/vegas 的 α * N 和 4 * N 相比如何。
這就是我那個 E_best 余量或 pid 逼近 E_best 試圖解決的問題,為了始終在 buffer 中保存一定的報文(借鑒于 vegas)以自適應資源騰挪,又不至于 N * 余量 > buffer_size,那么該余量一定要攜帶負反饋縮放,N 雖對單流不可見,但可用 minrtt / rtt 間接感知:
- 對所有流共同作用而言,minrtt / rtt 越小,buffer 被占越多,潛在流數增多,余量必須收縮;
- 對共存流相互作用而言,bw 越大,侵占傾向越大,越需要為它流騰挪 buffer,余量必須收縮;
minrtt / rtt 實則就是 cwnd 縮放比例,這很容易理解。設瓶頸帶寬為 C,當擁塞臨界點到達時,Σcwndi/rtti = C,而擁塞控制的目標是將 in-flight 總量收縮到 bdp,即 C * minrtt,因此目標狀態應該是 Σcwndi/minrtti = C,而共享 buffer 中 rtt 想等,從 Σcwndi/rtti = C 到 Σcwndi/minrtti = C,需要乘以一個系數 β = 1 / (minrtt/rtt) = rtt / minrtt。
既然 cwnd 如此縮放 in-flight 到 bdp,那任何比較系數都應該如此縮放,包括 vegas 系數,bbr probertt in-flight = 4,以及 E_best in-flight 余量。
如下可對 vegas 的 α,β 行為負反饋縮放。設 g(x) 為與 minrtt / rtt 正相關的參數增益函數,值域在 (0, 1),vegas 則變為 g * α < diff < g * β。同理,對 bbr probertt 狀態的 in–flight = 4 亦可做 in–flight = g * 4 來縮放。然而在這種情況下,更細粒度的 cwnd 控量就是必須,當 N 很大,g 接近 0,cwnd 粒度需要切割到等同量級,cwnd += 1 顯得過大,cwnd += 0.08 可能更合適。
最后,這篇短文不牽扯 dcn,不要在 dcn 部署基于時延的算法:
- dcn 時延小,測量精度不足以過濾抖動(g 家 swift 緣由);
- dcn buffer 小,N 太大更易爆 buffer;
- dcn 短流多,負反饋難以生效。
浙江溫州皮鞋濕,下雨進水不會胖。