紧接着上文 如何测量一个(传输网络)系统的容量 给出的方法,看一下如何测量网络容量,如果真的能测量网络容量,传输算法就好设计了。
先给出答案,很遗憾,根本无法测量,请阅读 why we don’t know how to simulate the internet,超级经典的一篇论文,我推荐过不止一次,因此我本文不谈异构问题,说点别的,比如拓扑。
感谢 bbr 讨论组前段时间抛出的一个问题,让我知道了一个新词,parking lot topology,真的就像停车场一样,肯定很多人都有体会。
本文我就用这个拓扑来描述,实证为什么往往在实验室仿真良好的算法一旦部署到真实的网络就拉了,这有点反其道而行之的意思,因为大多数文章甚至论文都在讲标准 dumbbell topology 下的仿真,但不妨把这看作一个新方向。
我准备分别从 bbr 和 aimd 这两个经典算法分析。先看拓扑:
很简单,3 条流共享 2 个 buffer,先看 bbr 的表现,设 x 为预估带宽,w 为 inflt,排除 RTT 分割因素,假设 R 非常小,建模如下:
d x 1 d t = C 1 ⋅ g ⋅ x 1 ⋅ R g ⋅ x 1 ⋅ R + w 21 − x 1 \dfrac{dx_1}{dt}=C_1\cdot\dfrac{g\cdot x_1\cdot R}{g\cdot x_1\cdot R+w_{21}}-x_1 dtdx1=C1⋅g⋅x1⋅R+w21g⋅x1⋅R−x1
d x 21 d t = C 1 ⋅ g ⋅ x 22 ⋅ R g ⋅ x 22 ⋅ R + w 1 − x 21 \dfrac{dx_{21}}{dt}=C_1\cdot\dfrac{g\cdot x_{22}\cdot R}{g\cdot x_{22}\cdot R+w_1}-x_{21} dtdx21=C1⋅g⋅x22⋅R+w1g⋅x22⋅R−x21
d x 3 d t = C 2 ⋅ g ⋅ x 3 ⋅ R g ⋅ x 3 ⋅ R + w 22 − x 3 \dfrac{dx_3}{dt}=C_2\cdot\dfrac{g\cdot x_3\cdot R}{g\cdot x_3\cdot R+w_{22}}-x_3 dtdx3=C2⋅g⋅x3⋅R+w22g⋅x3⋅R−x3
x 22 = C 2 ⋅ x 21 ⋅ ( R − ϵ ) x 21 ⋅ ( R − ϵ ) + w 3 x_{22}=C_2\cdot\dfrac{x_{21}\cdot (R-\epsilon)}{x_{21}\cdot (R-\epsilon)+w_3} x22=C2⋅x21⋅(R−ϵ)+w3x21⋅(R−ϵ)
w 22 = x 21 ⋅ ( R − ϵ ) w_{22}=x_{21}\cdot (R-\epsilon) w22=x21⋅(R−ϵ) 【这一步就是 Little 定律】
d w 1 d t = x 1 ⋅ R − w 1 \dfrac{dw_1}{dt}=x_1\cdot R-w1 dtdw1=x1⋅R−w1
d w 21 d t = x 21 ⋅ R − w 21 \dfrac{dw_{21}}{dt}=x_{21}\cdot R-w_{21} dtdw21=x21⋅R−w21
d w 3 d t = x 3 ⋅ R − w 3 \dfrac{dw_3}{dt}=x_3\cdot R-w3 dtdw3=x3⋅R−w3
设定参数如下:
C1, C2, R, g = 10, 10, 2, 1.25
x1[0], x21[0], x3[0] = 1, 6, 5
看一下表现吧:
任何端到端算法的动力学只作用于第一跳,不同的端到端算法就是采用不同方法利用 buffer 动力学挤兑带宽,根基就是 buffer 动力学,过了第一跳所有算法都退到自然 buffer 动力学:
x k = C ⋅ w k ∑ w i x_k=C\cdot\dfrac{w_k}{\sum w_i} xk=C⋅∑wiwk
看,是不是 bbr 的 gain 效应没了,人们预期的是:
x k = C ⋅ g ⋅ x k ⋅ R ∑ w i x_k=C\cdot\dfrac{g\cdot x_k\cdot R}{\sum w_i} xk=C⋅∑wig⋅xk⋅R
可这个只在第一跳生效,如上面模型所示。总结,上游输出不会携带算法的药效。
再来看 aimd 的表现,建模如下:
d x 1 d t = C 1 ⋅ w 1 w 1 + w 21 − x 1 \dfrac{dx_1}{dt}=C_1\cdot\dfrac{w_1}{w_1+w_{21}}-x_1 dtdx1=C1⋅w1+w21w1−x1
d x 21 d t = C 1 ⋅ w 21 w 12 + w 1 − x 21 \dfrac{dx_{21}}{dt}=C_1\cdot\dfrac{w_{21}}{w_{12}+w_1}-x_{21} dtdx21=C1⋅w12+w1w21−x21
d x 3 d t = C 2 ⋅ w 3 w 3 + w 22 − x 3 \dfrac{dx_3}{dt}=C_2\cdot\dfrac{w_3}{w_3+w_{22}}-x_3 dtdx3=C2⋅w3+w22w3−x3
x 22 = C 2 ⋅ x 21 ⋅ r 2 x 21 ⋅ r 2 + w 3 x_{22}=C_2\cdot\dfrac{x_{21}\cdot r_2}{x_{21}\cdot r_2+w_3} x22=C2⋅x21⋅r2+w3x21⋅r2
w 22 = x 21 ⋅ r 2 w_{22}=x_{21}\cdot r_2 w22=x21⋅r2 【这一步就是 Little 定律】
d w 1 d t = { 1 , D = 0 0.5 ⋅ w 1 , D = 1 \dfrac{dw_1}{dt}=\begin{cases} 1,& D=0\\0.5\cdot w_1,& D=1\end{cases} dtdw1={1,0.5⋅w1,D=0D=1
d w 21 d t = { 1 , D = 0 0.5 ⋅ w 21 , D = 1 \dfrac{dw_{21}}{dt}=\begin{cases} 1,& D=0\\0.5\cdot w_{21},& D=1\end{cases} dtdw21={1,0.5⋅w21,D=0D=1
d w 3 d t = { 1 , D = 0 0.5 ⋅ w 3 , D = 1 \dfrac{dw_3}{dt}=\begin{cases} 1,& D=0\\0.5\cdot w_3,& D=1\end{cases} dtdw3={1,0.5⋅w3,D=0D=1
r 1 = w 1 + w 12 C 1 r_1=\dfrac{w_1+w_{12}}{C_1} r1=C1w1+w12
r 2 = w 2 + w 22 C 2 r_2=\dfrac{w_2+w_{22}}{C_2} r2=C2w2+w22
与 bbr 同样初始值,g = 1.25 换成 I = 1,10X bdp buffer,结局如下:
如果 buffer 1 输出 C1 = 10,buffer 2 输出 C2 = 20,结局如下:
和 bbr 的动力学一样,细节不同:
- 上游输出带宽不会将 additive increase 传递到下游,特别瓶颈在上游时(输出固定,不足以填充下游);
- 任意一跳丢包都会导致 multiplicative decrease。
再多的例子我就不举了,总之这只是一个简单的拓扑,但足以表示真实网络的抽象,不必引入更复杂拓扑,只需细细斟酌上面 bbr 的例子就足够。我们清楚知道这个模型中, R + ϵ R+\epsilon R+ϵ 很重要,因为 buffer 2 中计算 w22 时并不能直接用 R,那么用什么呢?如果 ϵ = − 0.5 ⋅ R \epsilon=-0.5\cdot R ϵ=−0.5⋅R,f 2 就会被压到虚无。
我到底想说什么?我想说的是端到端拥塞控制算法的不可度量性,无论是静态适配的 aimd 还是动态适配的 bbr,这就是我逼逼呵呵说了好几年的 “测不准” 的数学表达。
这和上一篇说的测量系统容量的方法并不矛盾,因为对于网络传输系统而言,系统是动态变化的,在流量部署到系统上并开始传输时,没有全局视图,就不能指望全局公平,留下的 gap 是固有的,没法靠算法弥补。
如果拥有全局视图,对于第一个例子 bbr 算法,我们只需要将 f2 的 gain 调大就可以确保公平:
可是谁又提前知道这个拓扑和配置呢?
所以你知道实验室仿真的宇宙第一算法为啥拉了吧,也就不用再问为什么部署了 bbr 却还不如 cubic 了吧,如果你还希望研发一个精准的,普适的端到端算法,我劝你改行去卖皮鞋,至少还有很多经理市场。
令人费解的是,我为什么要说这些,这不是砸自己饭碗吗?对,就是要砸,因为我不干了。
浙江温州皮鞋湿,下雨进水不会胖。