上一期我对BBR进行修改的目标很简单,就是提高算法的RTT公平性,主要修改点有3个:
- 固定增益系数改为了RTT的减函数。
- RTT相关的steady phase改为了固定时间。
- 探测到带宽腾出时,马上进行up probe。
详情参见:
https://zhuanlan.zhihu.com/p/399639987
其实还差一点没有做,即将ProbeRTT状态维持4个cwnd的时间从固定的200ms改为3个RTT,这实际上是一个典型的横竖颠倒的修改思路,就和我之前预处理iptables规则以及nf-HiPAC的思路一样。总体来讲,就是下面这些:
- ProbeBW状态的steady phase从RTT相关改为固定时间。
- ProbeRTT状态的4 inflight phase从固定时间改为RTT相关。
代码已经更新:
https://github.com/marywangran/tcp-fair-bbr
这个修改提高了不同RTT的BBR流的动态性。
假设不和其它CC进行混部,ProbeRTT的目标是排空queue,这是BBR得以正常运作的前提,它自带天然的全局同步属性,最终让所有的BBR流收敛到公平。然而当考虑不同RTT的流时,就会发现固定200ms的4 cwnd phase不太合适:
- 对于RTT很小的流,比如RTT<20ms的流,200ms的时间太久了,以至于其max-filtered bw都滑走了。
- 对于RTT很大的流,比如RTT>200ms的流,4 inflight phase仅仅保持1 round,留给其它流up probe的时间过短。
这个问题和ProbeBW时对于不同RTT的流up probe的敏感性差异巨大非常类似,因此这么一颠倒,两个问题都解决了。
为什么我觉得做这么一件事是正确的呢?
我尝试过一些错误的思路,比如在ProbeRTT阶段不把cwnd降低到4,而是学CUBIC的样子,执行MD降低一个百分比,比方说cwnd降低20%,30%这种,我尽力不会将cwnd降低50%,因为我觉得这样损失太大了…事实上,之所以会有这样的“优化”手段,那是我完全就不理解BBR设计ProbeRTT状态的目的。
对任何逻辑的修改,都要以保证BBR的基础为前提,Bottleneck bandwidth和minRTT就是它的基础,脱离了这个基础,任何修改都是瞎搞。比如常见的,增加几个cwnd,少减几个cwnd,诸如此类。此类魔改之所以盛行,有一个根本原因无法忽视,那就是经这么魔改后,在特定的场景下,效果还真不错。
我的改法,200ms的4 inflight修改为3 rounds的inflight,没有破坏ProbeRTT的基本目标,1个round用来排空queue,1个round用来测得RTprop,1个round(或者2个rounds)用来给其它流机会up probe收敛。
浙江温州皮鞋湿,下雨进水不会胖。