我在 大历史下的 pacing 中误会程序员了,程序员的路子是正确的(虽然并不指网络方面)。本文接着扯网络,从系统程序员熟悉的开始:
- 当 cpu 过多时,把大的 spinlock 拆成 percpu lock;
- 使用 hash 时,倾向于 per bucket lock;
- 容器过多 per pod 控制复杂,倾向于 per pod 自决,edt 为一例;
- 前端总线太拥挤,取消了它。
总之就是拆除同步点,简化控制逻辑,让路不堵,而不是让路不那么堵。这些都是正确思路,但看看下面这个列表:
- cpu 比网卡强劲时,网卡发展到了千兆,网卡厉害时,cpu 开始多核;
- 多核内存墙,开始多核,numa,多核,numa,gpu 发力,网卡再次成为瓶颈;
- 优化网卡,各种 xpu,offloading,丢包重传,拥塞控制,端到端传输协议,自研交换机支持端到端协议;
- …
200gbps 网卡部署在 400gbps 网络中出现拥塞就拥塞控制,出现丢包就重传,为保网卡带宽构建无损网络,解决反压导致的拥塞扩散和 deadlock,如果再涉及到 rtt 测量,带宽感知,这个列表将无限加长。
看似在解决网络问题,其实是给网络添堵,网卡带宽越来越大,可不就越来越堵。这个列表的行为,既要把网络当黑盒子,又不甘心它 best effort,但无论如何,数据从高速网卡中出去,真就没人管了。
要解决网络性能问题,用第一个列表同样的思路重新评估问题就好了。
高速网络的根本问题不在网卡,协议和算法,而在交换机。网络拥塞,丢包的原因是交换机做的太多而不是太少。如今的网络架构,交换机不得不做大量工作以支持包分类,qos,aqm,调度等操作,原因是高速网卡注入的流量巨大且不同质,为了确保网络正常工作,交换机不得不做更多的 “判断”,“分类”,“针对” 和 “兼顾”,引入巨大管理开销。
高铁是我非常喜欢的一个例子。在高铁路网建立之前,全国只有一张普速路网,4 位数绿皮车,临客,k 字头快速车,t 字头特快车,z 字头直达车,d 字头动车组,短货车,长货车,全跑在这一张网上,而它们对应的 qos/qoe 更是五花八门,复杂的调度任务自然给到了铁路局和车站,为让快车更快,慢车要频繁停下让车,为不让慢车饿死,快车必须妥协速度,货车太长太慢导致它必须择时而不能随时通过大站,全国各大火车站庞大而凌乱。
如今数据中心网络现状正如上述。但铁路方面已经建立了独立的高铁路网,形成了运输效率极高的网络,而数据中心却依然在 “制造更多类型的火车”,“制造可以跑更快但却没条件跑更快的火车”,“修建更复杂的火车站”。
简单画一个网络(不局限在数据中心)发展图:
仍和铁路类比,1980s 到 2010s,中国普速列车经几次提速后,止步于 160km/h,因为普速路网控制复杂度太高,无法支撑 200km/h +,于是统一 qos 的高铁路网从普速路网中分离。
高速数据中心网络尚未从 “普速” 数据中心网络中分离,所见的只是构建几个相对隔离的队列,应用打标进特定队列,但每个队列看,里面的流量依然五花八门,规模小一点而已。分流特征不能基于应用,而要基于长短。
高速网络的特征是快网卡,快交换,大 buffer,瞄准这些特征做分流:
- 长流采用 pacing,浅 buffer;
- 短突发采用小收敛比;
短突发从 capacity-searching 分离,丢包自然降低,长流从短突发分离,丢包自然降低,拥塞控制更准确。
高速网络分流自然可以从上图中推演出来。
随摩尔定律逼近增长极限,网卡追平交换机,交换带宽的提升自然要靠并行。形象地说,一根光纤最大 400gbps,10 根光纤就是 4tbps,又回到了和网卡相比数量级的优势,不同的是,这次是 10 条链路的总和的结果,更形象点说,可以看作堆了 10 台交换机。
可预期的是网络中的链路数量大大增加。如何充分利用这些高速的,分离的链路是高速网络发展的目标,非常直观的两个层面可交叉论证的两个结论:
- 多路径传输以及协议支持;
- 长短流量分流在不同链路。
比如 m 条路径用于承载短突发并保持低收敛比,afap(as fast as possible),m / k 条路径用于承载长流并使能 pacing,afan(as fast as necessary)。
高速网络的重心将从 “充分填充链路但不至于拥塞” 转移到 “将同质流量导入不同链路路径并充分利用这些路径”,交换机将仅仅做简单的 red or ecn 以及路径调度(比如拥塞后换路),而不再需要做限速,整形等流量调度工作。更简单更少,更少更快。
直接从这一切背后起作用的摩尔定律视角来看,应对这种 “增长的极限” 有两个路子:
- 从交换机卸掉算力,彻底摆脱摩尔定律;
- 并行化已逼近极限的集成。
若卸掉算力,交换机将仅做傻瓜交换,不再 “判断” 和 “计算”,这种情况下,流量必须同质,试想允许所有各种能走的人,机动车,非机动车上没有红绿灯的 “傻瓜” 高速公路会怎样。
若选并行化路子,链路就一分为多,充分利用多链路自然的想法就是同质流量分流。
殊途同归了,因为这是历史发展的必然趋势。在增长的极限附近,优化措施几乎一致:
- 摩天大楼太集中,下面的路就会堵,多修路而不是统一调度;
- 摩天大楼太高,电梯会堵,采用高速电梯并在不同高度区间分区运行,而不是统一调度;
- cpu 太多,前端总线会堵,取消它并每核独享控制并引入 numa,而不是统一调度;
- 容器太多,协议栈队列管理会堵,简化控制或独享队列,而不是统一调度;
- 公路或铁路上交通工具型号太多,为高速车型修单独的路网,而不是统一调度;
- …
怎么换到高速网络场景下,这个一致的思路就像被遗忘了一样,竟然不提为不同类型流量创建单独的链路,然后在流量离开网卡甚至在网卡中第一时间导入特定链路,而坚持一定存在某个优秀的算法可以统一调度所有流量呢?
有朋友提到网络切片技术,确实是一个先进的路子。我也曾设想过一种多网口网卡,一些口专门出入长流,另一些口则出入短突发。
未来的数据中心端到端传输协议一定更简化,因为在专门的链路中,很多通用性假设是不言自明的,无需协议字段指示,亦无需在端侧基于复杂字段做计算。
涉及报文在网络中转发的信息,往往可用封包,拆包,stacked 的方式进行封装解封装操作,类似 sr 但更简化,同样得益于不言自明的路径假设。
推荐一本写于 1970 年代的好书,和 tcp 的诞生同年:
本文很多视角观点来自于此书。
浙江温州皮鞋湿,下雨进水不会胖。