有 100 个 cubic 用户准备切到 bbr,总带宽一共 100mbps,平均一个用户 1mbps,等切换完成,平均一个用户还是 1mbps,有一种可能会发生下面的情况:第一个切到 bbr 的用户获得了超过 1mbps 的带宽,直到第 n 个用户获得刚刚好 1mbps,第 n + 1 个用户切到 bbr 后发现还不如以前的 cubic,于是又切回,升级就此打住,因为没人喜欢出力不讨好。

这种情况是否会真的发生呢?

早先看过一篇论文说的是存量 cubic 切换 bbr 的过程会在一个纳什均衡点(NE)停止,我用一个新模型再分析一下,这个模型主要关注 bbr 和 cubic 对 buffer 的不同使用风格。

早先有过一个简易版分析,文字最后贴有相关论文的链接:bbr 会取代 cubic 吗?

先看一个均匀模型,即假设它们使用 buffer 的风格相同,都是 aimd 风格:

( N − n c ) λ b + n c ⋅ λ c = C (N-n_c)\lambda_b+n_c\cdot\lambda_c=C (Nnc)λb+ncλc=C

其中 N 为总用户数,n_c 为 cubic 用户数,lambda_b 为 bbr 单流带宽,lambda_c 为 cubic 带宽,C 为总带宽。

它的图像如下:
在这里插入图片描述

接下来将此模型按照 bbr 和 cubic 对 buffer 不同的使用风格进行偏置,偏置原则如下:

  • bbr 保持 2bdp in-flight,in-flight 应该在 1bdp <= in-flight <= 2*bdp,取最大值放大 bbr 的 buffer 优势;
  • 用 y = (x - 1) / x 拟合 cubic 的 buffer 最低使用率,x 为 cubic 流数量;
  • 用 g = x / (x + 1) 拟合 cubic 的 buffer 平均使用率,x 为 cubic 流数量。

解释一下为啥用两个渐进函数拟合 buffer 用量,主要是承认流在常规场景的统计异步性和异构性,没必要用 aimd 动力学微分方程建模(流太多时,统计一抹糊),相反,用正态分布特征去拟合 W t o t a l = Σ i = 0 n c w i W_{total}=\Sigma_{i=0}^{n_c}w_i Wtotal=Σi=0ncwi更有效,用期望,均值特征去分析。但我觉得还是太麻烦,索性进一步简化:

  • y 表示最低 buffer 用量,当 n_c 为 1,queue 刚刚退空,典型的范雅各布森管道场景,当 n_c 趋向无穷,进入异步统计稳态,buffer 长期被占;
  • G 表示平均 buffer 用量,当 n_c 为 1,典型 aimd 管道利用率为 50%,当 n_c 趋向无穷,进入异步统计稳态,buffer 长期被占;
  • 另一个原因是在真实场景下,各种 cc 共存本就无迹可循,只能分析统计特征。
    总体表达式如下:

( N − n c ) λ b ( R T p r o p + 2 ∗ B ∗ ( n c − 1 ) λ c n c 2 ) + B ∗ n c n c + 1 − ( 20 − n c ) ( R T p r o p + 2 ∗ B ∗ ( n c − 1 ) λ c n c 2 ) ≤ B (N-n_c)\lambda_b(RT_{prop}+2*\dfrac{B*(n_c-1)}{\lambda_c n_c^2})+B*\dfrac{n_c}{n_c+1}-\left(20-n_c\right)(RT_{prop}+2*\dfrac{B*(n_c-1)}{\lambda_c n_c^2})\leq B (Nnc)λb(RTprop+2λcnc2B(nc1))+Bnc+1nc(20nc)(RTprop+2λcnc2B(nc1))B

其中:

  • bbr 单流占用 buffer 由 2 ∗ b d p − i n f l i g h t w i r e 2*bdp - inflight_{wire} 2bdpinflightwire 表达,后者由 2 ∗ λ b ∗ ( R p r o p + R q u e u i n g ) − λ b ∗ R p r o p 2*\lambda_b*(R_{prop} + R_{queuing}) - \lambda_b*R_{prop} 2λb(Rprop+Rqueuing)λbRprop 化简;
  • bbr 的 R q u e u i n g R_{queuing} Rqueuing由 cubic 的 b u f f e r m i n n c ∗ λ c \dfrac{buffer_{min}}{n_c * \lambda_c} ncλcbuffermin 化简。

通过调整 B,C,N,R 等参数,可获得一个如下相对激进的图像:
在这里插入图片描述

纳什均衡点很轻松获得。下面结合 bbr,aimd 动力学解释一下。

bbr 的 2*bdp in-flight 自带适应性反馈,如果基础 queuing 大,bdp = maxbw * minrtt 中 minrtt 就很大,稳态 in-flight 就大,这种与 aimd 共存时 cwnd_gain = 2 不会成为限制因素,但 queuing 退却后,cwnd_gain 可以确保 bbr 自身 probe 不会过激。

接下来,少量 bbr 初始加入 cubic 群,单流 probe 的 multiplicative increase 行为迅速挤占带宽,注意,buffer 挤占效果可确保 bbr 流获得更大 maxbw,不会在下面 drain 周期回到原点。

随 bbr 流渐多,其行为将主导 buffer 动力学,bbr probertt 将反制 probebw 中挤占的 buffer,此时 cubic 流将会拿掉 bbr 腾出的 buffer,随 bbr 流增多,这效应越发显著,若最后剩有一条 cubic 流,其带宽将大于此时 bbr 单流带宽。

除非 bbr probe 更激进,除此之外 bbr 只被动响应,minrtt 可随大量 aimd 行为增加,但越来越少的 aimd 行为则减少 minrtt,而可观测的 maxbw 在 bbr 本身的公平性动力学中随 bbr 流量增加而减少,抵消掉了部分 buffer 中的增益。

换句话说,bbr 只能对 bbr 感知和反应,aimd 也一样。不同 cc 没有共识,感知和反应不会在预期之内。

bbr 流多,虽可从持续减少的 cubic 方 probe 一些带宽,但所有 bbr 的同步 probertt 及自己的 cwnd gain(量多,值就小了,很容易被限制在很小的buffer)会限制甚至反制 in-flight,如果相反,bbr 少,cubic 多就不同,大量异步 aimd 造成统计波动平稳(平方反比律还记得吗),minrtt 不会减少,而 maxbw 在 mi probe 中纯增加,bbr 带宽持续攀爬向上。

2bdp 等于 2b*d,如果没有一增一减,就是持续增加,目标指标本身也会卷着增加而自适应。

so?纳什均衡几乎是必然的,这不是仅用边际收益递减原则能解释的,还和博弈双方的秉性有关。
更进一步推广,这几乎是世界的本质,这也是世界万物多世代多样化共存的根源,如果再套用控制论的术语,纳什均衡点后面其实是一个 “稳态误差”,如果没有更进一步的持续激励,这个误差将永远存在。

软件升级过程很容易消除稳态误差而突破纳什均衡点,比如忽略存量,只搞增量,随时间推移,存量总会自然流失,这是另一个层面的自然淘汰。升级 bbr 也不一定要强迫 cubic 用户切换到 bbr,等到 cubic 用户升级操作系统,新版系统中如果没了 cubic,cubic 再好也用不成了。

时间长河中,一切现状都是历史在叠加,这就是卷积,而另一方面,如本文所描述的模型 ( N − n c ) λ b + n c ⋅ λ c = C (N-n_c)\lambda_b+n_c\cdot\lambda_c=C (Nnc)λb+ncλc=C,这是个无限可能的均匀共存模型,为其加上偏置就可能获得纳什均衡点,而这些纳什均衡点决定了共存的长期性,进一步解释了世界多样性的卷积本质,纳什均衡点决定的是 “单位激励响应” 函数尾巴的形状。

浙江温州皮鞋湿,下雨进水不会胖。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐