bbr 讨论组有个有趣的问题:[bbr-dev] Parking lot topology
我此前也意识到这个问题(参见 pacing 之对错),但几乎所有 cc 的建模都基于 dumbbell topology,parking lot topology 因其太 “不理想”,“不规则” 而无人讨论,而理论分析往往基于理想和规则去建模。
但在实践中,恶魔往往在细节,非算法核心的边角便不得不考虑,它们才是实践中占比更大的部分。先简单画一个 parking lot topology 结构:
和普通道路不同,繁忙期的停车场非常难开,停车的位置对驶出停车场的难度起到决定性作用,而不是车技和路况。对以上拓扑而言,在 flow 1,flow 2,flow 3 之间维持公平的难度在直觉上似乎是 0:
- 若运行 bbr,flow 1 的 1.25X probe 作用在 SW 2 处将被削弱,与 flow 3 在 SW 2 处竞争时无法获得公平份额;
- 若运行 aimd,SW 1 持续输出公平份额 bw,致使 flow 1 在 SW 2 处与 flow 3 竞争时无法扩展 buffer 占率;
直觉需要数学来佐证,为了便于扩展和魔改,我依然用微分方程组而不是递推式来模拟。
先看 bbr 的情形,设 C 为 SW 1,SW 2 处的总带宽, x₁ 为 flow 1 在 SW 1 获得的 bw,x₂ 为 flow 1 在 SW 2 获得的 bw,y,z 分别为 flow 2,flow 3 的 bw,则:
d x 1 d t = C ⋅ G ⋅ x 2 ⋅ R p r o p G ⋅ x 2 ⋅ R p r o p + y ⋅ R p r o p − x 1 \dfrac{dx_1}{dt}=C\cdot\dfrac{G\cdot x_2\cdot R_{prop}}{G\cdot x_2\cdot R_{prop}+y\cdot R_{prop}}-x_1 dtdx1=C⋅G⋅x2⋅Rprop+y⋅RpropG⋅x2⋅Rprop−x1
d y d t = C ⋅ G ⋅ y ⋅ R p r o p G ⋅ y ⋅ R p r o p + x 1 ⋅ R p r o p − y \dfrac{dy}{dt}=C\cdot\dfrac{G\cdot y\cdot R_{prop}}{G\cdot y\cdot R_{prop}+x_1\cdot R_{prop}}-y dtdy=C⋅G⋅y⋅Rprop+x1⋅RpropG⋅y⋅Rprop−y
d x 2 d t = C ⋅ x 1 ⋅ R p r o p x 1 ⋅ R p r o p + z ⋅ R p r o p − x 2 \dfrac{dx_2}{dt}=C\cdot\dfrac{x_1\cdot R_{prop}}{ x_1\cdot R_{prop}+z\cdot R_{prop}}-x_2 dtdx2=C⋅x1⋅Rprop+z⋅Rpropx1⋅Rprop−x2
d z d t = C ⋅ G ⋅ z ⋅ R p r o p G ⋅ z ⋅ R p r o p + x 1 ⋅ R p r o p − z \dfrac{dz}{dt}=C\cdot\dfrac{G\cdot z\cdot R_{prop}}{G\cdot z\cdot R_{prop}+x_1\cdot R_{prop}}-z dtdz=C⋅G⋅z⋅Rprop+x1⋅RpropG⋅z⋅Rprop−z
代码如下:
C, a, b = 10, 1.25, 1.25
...
for n in range(1, len(times)):
x1[n] = x1[n-1] + dt * (C*b*x2[n-1]/(b*x2[n-1] + y[n-1])-x1[n-1])
y[n] = y[n-1] + dt * (C*a*y[n-1]/(a*y[n-1] + x1[n-1])-y[n-1])
x2[n] = x2[n-1] + dt * (C*x1[n-1]/(x1[n-1] + z[n-1])-x2[n-1])
z[n] = z[n-1] + dt * (C*a*z[n-1]/(a*z[n-1] + x1[n-1])-z[n-1])
# 以下为递推式
#x1[n] = C*b*x2[n-1]/(b*x2[n-1] + y[n-1])
#y[n] = C*a*y[n-1]/(a*y[n-1] + x1[n-1])
#x2[n] = C*x1[n-1]/(x1[n-1] + z[n-1])
#z[n] = C*a*z[n-1]/(a*z[n-1] + x1[n-1])
以下是结果:
非常符合预期,若三级 SW 级联,SW 3 获得的 bw 将更小,由是推广,n 级 SW,每一级都对 probe 能力有削弱作用,在 n < m 时,flow 1 与 flow 2 分别在其 SW n 和 SW m 处将获得不公平的 bw 份额,若没有全局信息斧正,这境况将无可改变。
注意上图表头上有个 g2,它表示 flow 1 的 pacing gain,如果把 flow 1 的 g2 调高,它将获得更高的 bw,虽纯属扯淡,但这无疑给了经理们一个可以魔改的点,请慢用。
再看 aimd,设 C 为 SW 1,SW 2 处的总带宽,设 x₁ 为 flow 1 在 SW 1 获得的 bw,x₂ 为 flow 1 在 SW 2 获得的 bw,y,z 分别为 flow 2,flow 3 的 bw,w₁,wᵧ,wz 分别为 flow 1,flow 2,flow 3 的 cwnd,则:
d x 1 d t = C ⋅ w 1 + 1 w 1 + w y − x 1 \dfrac{dx_1}{dt}=C\cdot\dfrac{w_1+1}{w_1+w_y}-x_1 dtdx1=C⋅w1+wyw1+1−x1
d y d t = C ⋅ w y + 1 w y + w 1 − y \dfrac{dy}{dt}=C\cdot\dfrac{w_y+1}{w_y+w_1}-y dtdy=C⋅wy+w1wy+1−y
d x 2 d t = C ⋅ x 1 ⋅ r x 1 ⋅ r + z − x 2 \dfrac{dx_2}{dt}=C\cdot\dfrac{x_1\cdot r}{x_1\cdot r+z}-x_2 dtdx2=C⋅x1⋅r+zx1⋅r−x2
d z d t = C ⋅ w z + 1 w z + x 1 ⋅ r − z \dfrac{dz}{dt}=C\cdot\dfrac{w_z+1}{w_z+x_1\cdot r}-z dtdz=C⋅wz+x1⋅rwz+1−z
r = C w z + x 1 ⋅ r r=\dfrac{C}{w_z+x_1\cdot r} r=wz+x1⋅rC
d w 1 d t = d w y d t = d w z d t = 1 \dfrac{dw_1}{dt}=\dfrac{dw_y}{dt}=\dfrac{dw_z}{dt}=1 dtdw1=dtdwy=dtdwz=1
简单起见,不再单独处理 md,以下面的代码替代:
C, a, b = 10, 1, 0.5
...
for n in range(1, len(times)):
w1[n] = w1[n-1] + a
wy[n] = wy[n-1] + a
wz[n] = wz[n-1] + a
if n % 10 == 0:
wz[n] *= b
if (n + 2) % 10 == 0:
w1[n] *= b
if (n + 5) % 10 == 0:
wy[n] *= b
x1[n] = x1[n-1] + dt * (C*(w1[n-1] + 1)/(w1[n-1] + 1 + wy[n-1]) - x1[n-1])
y[n] = y[n-1] + dt * (C*(wy[n-1] + 1)/(wy[n-1] + 1 + w1[n-1]) - y[n-1])
x2[n] = x2[n-1] + dt * (C*(x1[n-1]*r[n-1])/(x1[n-1]*r[n-1] + z[n-1])-x2[n-1])
z[n] = z[n-1] + dt * (C*(z[n-1] + 1)/(z[n-1] + 1 + x1[n-1]*r[n-1])-z[n-1])
r[n] = C / (wz[n] + x1[n]*r[n])
以下是结果:
符合预期,SW 1 输出公平份额,但在 SW 2 处 additive increase 被削弱至 0,因为 SW 1 输出持续稳定的 1/2*C 的 bw,在 SW 2 处 additive increase 效应将不再可见,之所以上图中没有跌 0,全在 flow 3 的 multiplicative decrease,我把代码中的 md 判断去掉,甚至只是将 md 效应减弱,flow 1 的 bw 跌落就显而易见了:
parking lot topology 的问题其实是任意多跳拓扑共有的问题,parking lot topology 只是一个形象的名字。在多跳拓扑中,只有第一跳严格遵循端到端 cc 的动力学模型运作,而在多跳场景,第一跳的输出是第二跳的输入,而不是反馈回 sender,换句话说,sender 接不住它自己端到端算法的输出。
当第二跳以后的级联 SW 首尾相接,随每一跳算法动力学效应持续被削弱,buffer 动力学开始起主导作用,而当前 flow 并不了解其它 flow 在该处的端到端算法作用力,这意味着全局公平性的不可能,这应该就是端到端 cc 不符合预期的核心原因。
幸运的是,大多数拓扑都介于 parking lot topology 和 dumbbell topology 之间,端到端 cc 虽不完全有用,但它确实有用。
…
我们的端到端 cc 失效的原因应该应该归结为仿真环境和现网环境的差异,而端到端算法的信息精度缺陷只能放大这一差异导致的误差而不是缩小。关于这一点,sally floyd(贡献与 范雅各布森 齐名,但很多人不知道) 在 1997 年的论文 why we don’t know how to simulate the internet 里也提到过这个观点。
浙江温州皮鞋湿,下雨进水不会胖。