亚马逊终于放大招了,来自 5 5 5 月初的一个新样式数据中心网络 RNG,这可能是网络设计的最新革新范式,以往不为人知,先看论文:
这论文正是我多年想法的一个实例印证,统计最优卸载了确定性约束,就卸载了很多维持确定性要做的事,网络自然变得简单,也就稳定,高效。
本文主要是简评,所以我不会详解论文的细节。
在人们早已习惯了规范化的,结构化分层的胖树网络后,天然的随机网络反而被认为是胡扯,因为它不可预测。
过去的很多年,我一直说随机网络,基于摩尔定律极限后的规律,可交换带宽的多路径网络是必然,可我们并没有这样的网络,现在的规则网络带宽是不可置换的,可交换带宽必然要取消过多规则和预设,这便是随机。
单路径容量已不可持续提升,必然导向多路径,路径越多,为可扩展性,越容不得复杂性,随机化趋势越明确,于此,我提出了很多设想:
- 谈谈 Packet Spraying 与拥塞控制,【标记 1】;
- TCP/IP 到 Torus 街坊的重构,【标记 2】;
- 后摩尔定律时代网络传输;
- 数据中心传输:消除流抽象,重塑多路径;
- 数据中心网络随想-电路交换,【标记 3】;
- ...
可这些设想被认为是如此不着边际,以至于我成了编程的人眼里的 "民科",还是细看亚马逊的论文吧。
编程的人不能接受天然的网络乱序带来的抖动,便把抖动搜集到了端,用保序来换确定性,可抖动还是没消除,反而增加了代码的复杂性,这就是编程,但这也只是编程,反直觉的是,编程带来的问题比解决的问题更多。
随机网络的好处在于它几乎永远都有路径可达目的地,但获得这种高容错性和高扩展性需要付出难以割舍的代价:
- 取消分层拓扑,扁平随机图取而代之;
- 取消最短路径优先,随机多路径可达;
这便是论文的两个核心点,这是多么轰轰烈烈的革新啊。
我来简析这两点在算法层面的体现,细节还是要自己深入阅读论文。我要描述的点在于:
- ShuffleBox 如何构建逻辑上的随机图;
- 随机网络的不相交路径数量并不太少;
- 随机网络的路径长度固定且并不太长;
首先看拓扑的革新,RNG 引入一个 ShuffleBox 概念,可以将它看作一个排线盒,内部就是一堆固定光纤交叉通断开关,ShuffleBox 的作用是把路由器之间的连线随机打乱,生成随机图,但布线却和胖树一样简单,我的【标记 3】作文也是这个思想。
ShuffleBox 解决了随机网络布线蜘蛛网般的不可扩展性问题,本质上就是将物理随机图抽象成了逻辑随机图,让物理布线仍然规整,但逻辑拓扑变成随机图。
下面侧重说性能的确定性,这多少有点违背直觉,我主要是相对通俗地导出论文一致的结论。
RNG 可行的前提是 "随机网络中有足够的不相交路径到达目的地",所谓不相交就是不会有多条路径重叠造成的拥塞点,但这哪能保证,编程的人肯定不能接受没有事先安排好的确定性路由。
编程的人宁可接受在拥塞点排队,并用复杂的 AQM 配合同样复杂的端到端拥塞控制算法去处理拥塞,也不愿接受一个足够高的概率上的无阻塞可能性并去尝试为此随机发包。
用数学戳穿直觉,一打一个没脾气。
以路由节点度数 d d d 为例,经过计算,在一个扁平随机图中,从 s s s 到 t t t,边不相交的路径数是 PathN = d ⋅ ( 1 − e − h ) \text{PathN}=d\cdot(1-e^{-h}) PathN=d⋅(1−e−h),其中 h h h 为途中每节点选的下一跳数量。
以常规的 d = 16 , 24 , h = 2 , 4 d=16,24,h=2,4 d=16,24,h=2,4 代入,路径数可高达接近 85 % ∼ 98 % 85\%\sim98\% 85%∼98% 的 d d d,这非常不可思议。
这个路径数描述的是一种概率,即 s s s 到 t t t 尽可能多的,互相不争抢带宽的路径的数量,这些路径不走回头路,不共用一条链路,最终都能到 t t t.
s s s 有 d d d 个邻居,每个邻居都能通过以 t t t 为圆心组织的同心圆 waypoint 层到达 t t t,而同样的, t t t 只有 d d d 个入口,因此从 s s s 的一个邻居独立到达 t t t 的概率就是 1 d \dfrac{1}{d} d1,不能独立到达的概率就是 1 − 1 d 1-\dfrac{1}{d} 1−d1,另一方面,在 Waypoint 的每一跳,有 h h h 个下一跳,那么这么多下一跳都不独立的概率就是 ( 1 − 1 d ) h (1-\dfrac{1}{d})^h (1−d1)h, d d d 个邻居一起,都不独立的概率就是 ( 1 − 1 d ) h d \left(1-\\dfrac{1}{d})\^h\\right^d (1−d1)hd.
最近一直跟 e e e 较劲,这不又来了, lim n → ∞ ( 1 − 1 n ) n = 1 e \lim_{n\to\infty}(1-\dfrac{1}{n})^n=\dfrac{1}{e} limn→∞(1−n1)n=e1 收敛相当快, n = 16 , 24 n=16,24 n=16,24 就差不多了,因此我们可以放心得到 ( 1 − 1 d ) h d = e − h \left(1-\\dfrac{1}{d})\^h\\right^d=e^{-h} (1−d1)hd=e−h,因此至少通过一个邻居获得独立路径的概率就是 1 − e − h 1-e^{-h} 1−e−h,一共 d d d 个邻居,总的独立路径数自然就是 d ⋅ ( 1 − e − h ) d\cdot(1-e^{-h}) d⋅(1−e−h).
PathN = d ⋅ ( 1 − e − h ) \text{PathN}=d\cdot(1-e^{-h}) PathN=d⋅(1−e−h) 的 1 − e − h 1-e^{-h} 1−e−h 意味着中间节点的扇出路由对路径的收益是指数递减的,人们没有必要追求更大的 h h h,路径组合的 d h d^h dh 被限制,这便约束了路由表的规模不会暴涨。
几乎什么都不做,只是随机 spraying,独立,不冲突路径数可高达接近 85 % ∼ 98 % 85\%\sim98\% 85%∼98% 的 d d d,这已经打破了编程的人的直觉,接下来要证明的是,从 s s s 到 t t t 的跳数也收敛在近乎固定的数值,这意味着,即使完全随机选路, 99 % 99\% 99% 以上的流也不会绕远。
要算到达 t t t 的路径长度,以目标 t t t 为中心,构建同心圆环路:
- WP 0 ( t ) \text{WP}_0(t) WP0(t), t t t 的直接邻居,到 t t t 只要 1 1 1 跳,邻居在此,路径长度为 2 2 2;
- WP 1 ( t ) \text{WP}_1(t) WP1(t), WP 0 \text{WP}_0 WP0 每个节点随机挑 p p p 个邻居,到 t t t 要 2 2 2 跳,邻居在此,路径长度 3 3 3;
- IR ( t ) \text{IR}(t) IR(t), t t t 的内环, WP 1 \text{WP}_1 WP1 的邻居,没进前面的,到 t t t 要 3 3 3 跳,邻居在此,路径长度为 4 4 4;
- OR ( t ) \text{OR}(t) OR(t),外环外,剩下所有节点,到 t t t 要 4 4 4 跳,邻居在此,路径长度 5 5 5;
RNG 的路由规则很简单,流量只能从外环向内环流动,无法反向, s s s spraying 到所有邻居的流量会被推向外环,再经多级 waypoint 逐步汇聚到 t t t.
设 n n n 为全网节点数, d d d 为每个节点度数, p p p 为每层路标点分支数,比如预设 p = 2 p=2 p=2,简单计算可知, WP 0 \text{WP}_0 WP0 全网占比为 d n \dfrac{d}{n} nd,它便是路径长度为 2 2 2 的概率,同理, WP 1 \text{WP}_1 WP1 占比为 p ⋅ d n = P ( 路径长度 = 3 ) \dfrac{p\cdot d}{n}=P(路径长度=3) np⋅d=P(路径长度=3),现在看 OR \text{OR} OR 层邻居占比。
接着前面的 WP 1 \text{WP}_1 WP1 层,由于它们自身有 d d d 的连接能力,因此它们总共的连接数就是 p ⋅ d 2 p\cdot d^2 p⋅d2,假设一节点 v v v,那么随机图里一条边连到 v v v 的概率为 1 n \dfrac{1}{n} n1,所以一条边没连到 v v v 的概率为 1 − 1 n 1-\dfrac{1}{n} 1−n1,一共 p ⋅ d 2 p\cdot d^2 p⋅d2 条表都没连接上的概率就是 ( 1 − 1 n ) p d 2 (1-\dfrac{1}{n})^{pd^2} (1−n1)pd2,又是 e e e,因此 ( 1 − 1 n ) p d 2 ≈ e − p d 2 n (1-\dfrac{1}{n})^{pd^2}\approx e^{\frac{-pd^2}{n}} (1−n1)pd2≈en−pd2,这就是离 t t t 最远的那层节点的比例,即 P ( PathL = 5 ) ≈ e − p d 2 n P(\text{PathL}=5)\approx e^{\frac{-pd^2}{n}} P(PathL=5)≈en−pd2,那么剩下的就是 P ( PathL = 4 ) P(\text{PathL}=4) P(PathL=4) 了。
按照论文给出参数实例计算, P ( PathL = 2 ) = 6.4 % , P ( PathL = 3 ) = 12.8 % , P ( PathL = 4 ) = 80.8 % , P ( PathL = 5 ) = 0.03 % P(\text{PathL}=2)=6.4\%,P(\text{PathL}=3)=12.8\%,P(\text{PathL}=4)=80.8\%,P(\text{PathL}=5)=0.03\% P(PathL=2)=6.4%,P(PathL=3)=12.8%,P(PathL=4)=80.8%,P(PathL=5)=0.03%,几乎可以肯定,大部分情况下,跳数就是 4 4 4 跳,这就规定了一个时延抖动的范围,由于指数衰减律,随机图中极少数路径会超过 4 4 4 跳。
看看我们的结论:
- 随机网络中存在足够的不相交独立路径,路径数量与 d 相关;
- 转发节点增加下一跳数量 h 的收益递减, h 趋向确定值;
- 路径长度高比例趋向固定,少有超长路径,波动范围有界;
随机网络其实并不随机且混乱,相反,它是非常确定,而少有的波动空间则是统计复用的秉性而不是毛病。
总之,这盘论文印证我多年的一些想法,随机 spraying,我并没有在 【标记 1】和 【标记 2】中给出数学上如本论文般定量的结论,因为我觉得这些结论都是图论的基础,只是好奇为什么这么多年没人提到基于这些结论的网络。
再深入思考,我觉得问题不在人们没有勇气放弃最短路径优先,而在于心理上预设的困局,而在成型的规则化分层拓扑中,最短路径优先,端到端,流抽象这些便是自然推论,不必再拿出来讨论。
有趣的是,随机网络虽早有人关注,但它直到今天才被实例化,全在于技术上的不可扩展问题,如此可扩展的网络被诟病的反而是它的不可扩展性:
- 路由不可行,早期的 k-最短路径造成路由表内存爆炸;
- 布线不可行,随机图布线凌乱,几无规律,难以运维;
- 性能不可预测,人们天然厌恶随机;
RNG 的创举在一抽离了这些问题。
对于路由问题,由于 RNG 以每一个目标 t t t 为核心做同心圆,源端 s s s 对所有邻居 spraying,而每一个中间节点对 t t t 的同心圆层级只转发到 h h h 个下一跳,简单的 spraying 规则让路由条目最多保持 O ( n × h ) O(n\times h) O(n×h) 或 O ( h × d h ) O(h\times d^h) O(h×dh)(小 h = 2 , 4 h=2,4 h=2,4),更可以以时间换空间,实时求得 WP 0 ( t ) , WP 0 ( t ) ,IR ( t ) ,OR ( t ) \text{WP}_0(t),\text{WP}_0(t),\text{IR}(t),\text{OR}(t) WP0(t),WP0(t),IR(t),OR(t) 等层级关系,对于特定的 t t t,所有节点的 waypoint 选择完全一致。
对于布线和扩展问题,shuttlebox 巧妙解决了,而性能不可预测问题,通过图论结合概率统计基础也能定量算出,这还有什么问题呢。
扩展性的技术问题解决,随机网络就自然了。拆流分包,拥塞就自然分担了,平坦随机网络中,多路径随机 spraying 和包抽象反而成了自然推论。
最后,简单对比 RNG 和 Spine-Leaf,虽然 Spine-Leaf 流行到它几乎就是唯一标准,但简单看一眼拓扑就发现它过于正则,能从肉眼看到的拥塞路径,就一定会发生拥塞,而与此同时,却总有链路空闲,这就是带宽的不可交换性。
再看成本,大量 Spine,Agg 交换机的采购成本,运维成本并不低,而 RNG 则去掉了这些中间层级,用聋哑的 ShuttleBox 替代,这是真正的哑网络,进一步增强了网络的可扩展性。
而爆炸半径更是雪上加霜,以至于若细看,Spine-Leaf 已经枉为网络,它更像是主板,坏一个点就要整片瘫痪,而 RNG 则是被解放的真正的网络,不拘泥于固定路由,而只求可达性。
论文有点长,但 RNG 是简单的。
浙江温州皮鞋湿,下雨进水不会胖。