传输协议设计与牧村摆动(Makimoto‘s Wave)

news/2024/11/8 14:30:40 标签: 网络协议

有一条活鱼和一条死鱼,你准备怎么做,你会将活鱼红烧或将死鱼清蒸吗?好的食材只需要最简单的烹饪,不好的食材才需要花活儿。

我此前的文字几乎都在阐述一个观点,广域网就是那条死鱼,数据中心则是那条活鱼。做那条死鱼要下重料,而活鱼只需要张嘴吃即可。辣椒,老抽,胡椒看做 CUBIC,BBR,PCC,专门调教广域网的朽木,而在另一边,TTPoE 则是最简单的刺身。

然而事实上,哪怕在现实中,虽然几乎没人拿臭鱼烂虾做刺身,但红烧活鱼的却大有人在,哪个对哪个错是没有意义的,摆弄清楚这些事的内在关系才重要。

前不久 Tesla 刚推出 TTPoE 那会儿,不少人问我它和 TCP BBR 或 QUIC 相比如何,我没有过多回复,而是写了两篇短文。事实上我的意思是,TTPoE 是一道活鱼刺身,而 BBR 是一勺浓油重料,但现实中真有不少人喜欢浓油重料,无论针对什么食材。

总结一个方法论,良好的环境做减法,恶劣环境做加法,大概就是如何设计传输协议的根本方案了。

但干净的方案几乎不存在,被后起重要作用的是 “牧村摆动(Makimoto’s Wave)”,也叫 “牧村定律”。这个定律说的是,半导体产品发展历程总是在 “通用化” 与 “定制化” 之间交替摆动,大概每 10 年波动一次。这种定律的背后是市场和人的周期性波动,所有花活儿均来自其中,没什么太大的奥妙,我做简图如下,随便看看:
在这里插入图片描述

另一种理解,将性能功耗比看做 “硬件”,将开发效率看做 “软件” 是高尚的。硬件意味着定制和高效,软件意味着通用可编程,本质上,软件就是拿时间换空间,而按照熵增的说法,能量的本质就是时间,软件的性能能耗比高是内在的。

举一个不严谨但简单的例子,一个携带 32 个加法器的电路计算 32 位加法和一个携带 1 个加法器的电路计算 32 次 1 位加法是等效的,但后者拿时间换空间,花了前者 32 倍的时间,外部时序经历了 32 倍的电平转换,在时间的流逝中也消耗了更多能源,性能低,能耗大。

现在看看在牧村摆动中的网络是如何发展的。

最初,网络通信被 socket 接口抽象成 IPC,TCP 是 inet stream socket,这是软件主宰的时代,诞生了一大批 socket 工人,当 CPU 足够快了就有人嫌网络,于是网卡开始按 10 倍速进击。

从千兆卡说起,这时 CPU 又成了瓶颈,开始有人折腾 TOE,RSS,中断了,诞生了一大批 TCP 以及内核协议栈优化工人,而先前的 socket 工人被认为是不懂网络的。

当更新更快的网卡出现,DPDK(同时还有几个竞争者) 自然就出现了,此时那些内核协议栈工人变成了古人,因为大家都在争先恐后 bypass 掉内核,不管是 DPDK 工人还是 XDP 工人。

虚拟化,SDN,NFV 风潮暂且不表。

IPC 网络模型彻底受到了挑战。在此之前,网络通信是进程的职责,而进程自然归 CPU 调度管理,但当 CPU 被网络通信拖住时,疑问是 “既然是网络通信,为什么不让网卡来做”,至此 RDMA 开始浮出视野,在此之前 DMA 已经解放了拷贝和中断的 CPU 开销,如今就连网络对端的行为也被网卡接管。

定制化网卡开始遍地开花,FPGA,SmartNIC,曾经力压内核协议栈的 DPDK 工人反而成了通用工人。随后的 AI 时代彻底捧起了 RDMA,在此之上或与之并列,新技术新标准新协议也层出不穷,IB(差点死掉),RoCE,RoCEv2,HPCC,SRD,Homa,SRD,TTPoE(这个不在下文贬义行列),… 随之而来的就是掌握这些技术的工人开始统领大小厂子。

最终,网络技术到底是什么?TCP,socket,DPDK,XDP,RDMA,还是上面最后一行那些?或者是这些的大杂烩?答案明显是后者。

所有定制硬件做着做着都会做成通用(可编程)软件,携带着被最普遍应用的定制硬件的影子,所有通用软件最终会被性能需求分化出各种定制硬件,夹杂着通用软件的毛病,这就是牧村摆动本身的最佳阐释。希望设计一个干净的传输协议,本身就是妄想。

但回头看这 30~40 年,上述这些名词术语,均离地不过八百米,它们均局限在主机周围很小的范围内,即主机本身到数据中心的范围。回看广域网,大致 2000 年左右的问题如今仍然还是问题,以文初的类比,海边从 30 年前吃小蟹到现在 100 种刺身,遥远的内地的海鲜 30 年来依然只有带鱼。

设计数据中心的传输协议和设计优化广域网协议是完全不同的路子,有不同的方法论,广域网卷算法,数据中心卷硬件和自研协议(强调硬件实现)。但在更大的时间尺度看,二者又相似。广域网也有牧村摆动主导的技术和职业变革,但慢得多,这并不仅仅是设备更新换代慢的问题,我曾从反馈时延角度建模分析过 SDN controller 在广域网失败的原因。

数据中心是可控的环境,如果扩容,升级交换机,很多协议端花活儿都不需要了,反之如果只是网卡厉害,为了适应恶劣的交换机,还是要在主机端网卡整花活儿,这提升了工人的热情,但对整体无益,然而这就是牧村摆动过程本身必然要经历的中途。正如上周一位经理所说,干嘛要费劲做用户态协议栈,那点收益还不如让业务删除几行代码来的快。

加大于减,这就是人性。

总之,牧村摆动不会停摆,仅针对网络传输协议而言,最近一轮定制化周期开始时的 “只要有就行” 被纷纷进场的对手开始内卷后,必然转向 “只有好才行”,而 “好” 则是万变不离其宗的,它并不藏在性能能耗比或开发效率的巅峰或低谷,而处在经理的心中。

顺着牧村摆动的解释写了一篇文章。我一向相信世界在小范围内是随机的,大尺度下是周期的,摩尔定律,牧村定律,都可以以此建模。小时候经常听到准时而来的叫卖声,卖洗衣膏的,卖酱油醋的,卖粉浆的,卖卫生纸的,爆米花的,卖雪糕的,。。。准时而来,他们并非随机而来,你想让这些卖货的随机而来都不行,因为他们也有自己心里规划的周期,规则和顺序,现在理解了,他们只是每天沿着固定的街道路线行走而已,安阳老城九府十八巷,够他们溜达的,综合起来各个卖家,那就显得五花八门了。
一个人的整个人生就是在解一个傅里叶变换,事实也确实如此。

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


http://www.niftyadmin.cn/n/5744022.html

相关文章

应用插件化及其进程关系梳理

插件应用的AndroidManifest.xml <manifest xmlns:android"http://schemas.android.com/apk/res/android"coreApp"true"package"com.demo.phone"android:sharedUserId"android.uid.phone"><uses-sdk android:minSdkVersion&q…

玲珑艾橘 - 不喜欢但不行

玲珑艾橘&#xff0c;是指的八面玲珑&#xff0c;始终戴着面具&#xff0c;不喜欢戴着&#xff0c;但为了生存不得不迎合&#xff0c;有点大众心理&#xff0c;且不得不这么做。 每个人都戴着面具&#xff0c;面对不同的人戴不同的面具&#xff0c;相比这面具不错。 那个不戴面…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.11

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第四周 特殊应用&#xff1a;人脸识别和神经风格转换&#xff08;Special applications: Face recognition &Neural style transfer&#xff09;4.11 一维到三维推广&#xff08;1D and 3…

WRF-LES与PALM模型:风能资源评估、风力发电、大涡模拟、大尺度湍流涡旋、大雾预报、局地环流模拟、城市热岛效应、流场模拟

专题一、背景 1、流体力学简介 2、计算流体力学简介 3、应用场景举例 专题二、计算机基础与编程入门 1、计算机基础与编程入门 2、计算机基本概念和操作系统讲解 3、Linux基础命令与操作 专题三、科学计算与数据处理基础 1、NumPy基础&#xff1a;数组操作与科学计算 …

【Python爬虫实战】DrissionPage 与 ChromiumPage:高效网页自动化与数据抓取的双利器

&#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、DrissionPage简介 &#xff08;一&#xff09;特点 &#xff08;二&#xff09;安装 &#xff08;三…

失业负债女孩,下班后用AI做副业,快速翻身上岸

** 我们应该把负债看成是成长的助力&#xff0c;而不是搞垮骆驼的稻草。 负债上岸&#xff0c;没有更多的捷径&#xff0c;唯有“开源节流”&#xff0c;节流就是尽可能节约花费&#xff0c;把生活支出减少&#xff0c;开源就是尽可能多的增加自己的副业收入。 负债后的至暗…

简易抽奖器源码以及打包操作

import wx import random import time# 定义Myframe类,继承Frame class Myframe(wx.Frame):# 奖品rewards [桥本香奈, 二代CC, NaNa, 情深叉]# 构造方法def __init__(self):# 父类初始化super().__init__(None, title主界面, size(500, 400), pos(500, 200))# 创建面板&#x…

openlayers实现图层裁剪,只展示关心区域,抹掉无关区域,“抠”地图

先给大家看一下效果: 很久没有用ol了,今天突发奇想,想完成一下在ol中如何实现图层裁剪,抹掉消除非关心区域的地图的操作。过去写了有关于遮罩和掩膜的教程,现在看来好像有点低级,不足以满足需求,于是我们重新来做一下。 首先要知道ol官方是支持canvas参数传递的,就是说…