云数据中心传输的出路

研发端到端协议不是出路,研发更智能调度流量的交换机不是出路,将流量按长短突发模式分流到不同链路(逻辑的或物理的)才是出路。所有高速传输的前提是标准化,统一简单的操作。多么简单的领悟。

数据中心网络具有范围小,带宽大,全局可控等特点,人们揪着这些特点设计出一系列与广域网 tcp 不同(大约还可以相悖)的端到端协议。

套路也有,大概就是瞄准两个点:在端侧,用硬件卸载掉 cpu 的处理,在网侧,自研交换机支持新协议,为端到端处理提供更详细的信息。这些都是正确的思路,肉眼可见的 aws srd,google falcon,alibaba int-based-hpcc 以及 uec transport,homa,都如此。具体来讲:

  • 支持更细粒度更准确的时间测量,例如 swift;
  • 支持多路径,喷洒乱序传输;
  • 支持 sack/nack 丢包检测以及快速重传;
  • 支持成熟的拥塞控制算法(aimd or bbr or …);
  • 支持路径发现和切换(很重要但不一定有);
  • 软硬件结合;

名词我就不罗列了,随便看一个协议基本就大差不差。

我一直秉持的观点之一,靠上述端网这两个方向的算法相关的设计优化只能提高资源利用率而不能提升绝对性能,绝对的性能提升是靠资源的量堆出来的。

简单扩容比好算法更有效,且扩容花的钱比招聘人员自研更省钱省心不惹麻烦。老板总想少花钱做大事,但没有免费的午餐,雇经理的成本比扩容成本大的多。

但光把路修宽还不够,还要限制不能谁都能上路。

我一直秉持的观点之二,但凡高速运输,都要将流量分别分流到专有通道,而不是混部。专有通道的流量一定要同质而不能不同质流量混部。

只要流量不同质,转发设备就要做更多 “判断”,“区分”,“针对” 等操作,算法成本的本质是时间,看得见的是能耗,花钱买时延?只有同质流量才能简单粗暴用一套简单规则对待,协议头简化带来了算法的简化,省钱省时间。

高铁之所以叫高铁是因为路而不是车,早期的动车组跑在普速铁路上,就像如今一个个自以为是的协议和 tcp 混部在以太网上一样。后来专门修建了独立于普速线路的高铁网,350km/h 的速度才有了可能,否则任由再好的调度算法,要么对普速列车不公平,要么高铁列车被掣肘。

高速公路也一样,和红绿灯控制的行人,自行车,机动车混部的普通道路相比,高速公路上只有特定的机动车可以上路,且必须保持一定的速度,不能随意停车。

在全局可控的数据中心,将流量按照流模式分类导入不同的足够隔离的链路,即使全部用以太网承载 tcp 都会在性能上获得质的提升,甚至不需要新的协议和算法,更无须对应用进行任何修改。

如果 incast 短突发流量和普通 tcp 长流(不仅限于 tcp)混部,问题在本质上不是 incast 的问题,针对 incast 再怎么的优化都无济于事,问题出在长 tcp,因为长 tcp 的 capacity- searching 属性摘不掉,长流和突发流并不相容,混部它们就是给自己找更多的事。

常规解决方案按前文所述,无非再设计一个端到端协议,然后在交换机上给予支持更复杂的 qos,更复杂的队列 … 事情越来越复杂。

反过来,长 tcp 也经常被 incast 短突发挤一下再挤一下而丢包,这些突发转瞬即逝,sender 无法区分且来不及反应,误判的代价往往倒逼经理把更多的资源投入到算法的研发,但并不有效。

好比一线城市核心区的老式红绿灯路口,汽车抱怨行人自行车闯红灯,行人抱怨自行车乱窜,自行车抱怨汽车不礼让,谁也过不去,交通事故频发,各种法律法规及调度都无济于事,如何解决?造行人自行车不让上的立交桥就行了,同时汽车也不能走人行道。推荐一篇九年义务教育的课文《北京立交桥》,都应该学过:
在这里插入图片描述
分流才是出路。不分流,即使上 ib 也很难。

incast 短突发流量只有 sender/receiver 最了解,长短 tcp 也没有谁比 sender/receiver 更懂,它们有足够的信息将自己导入不同链路。短突发不需要大带宽但需要更小收敛比,而长流需要公平共享大带宽,如果一个网络确保都是长流,交换机自然有能力执行 总带宽 / n 调度算法,而 n 可通过协议头携带的数据总量或千字节持续时间计算出。

长短流分流到不同链路(逻辑的或物理的)后,固定 buffer 可以吸收更大的 incast 突发,同时在长流链路,甚至只运行 red + aimd 就行。至于分流到固定的分离链路这件事,应用自己比谁都做得好,有个简单的例子可印证,edt(earliest departure time) 由应用自己打戳,就节省了底层很多资源,同时消除了抖动。

只要分流,从应用视角看,它无需任何修改升级,从网卡硬件和交换机视角看,它们更简单(粗暴)而不是更复杂了。

然而我并没有看到有人往这个方向走,人们在 “造车” 而无意于 “修高速公路”,现在的数据中心无异于用上一代基建跑这一代(AI??)的流量,拿单体服务时代的基建支撑微服务,在人车涌动的十字街头推搡着人群调度超跑。

在相似的其它领域,人们十分清楚人车分流,散货零担和集装箱分流,只有这样才可用标准且简单的方式统一操作。试想如果散货和集装箱混在一起装船会怎样,无论从分拣难度还是浪费的人力的角度,都是噩梦。

船还是那条船,可对码头要求更高了。要注意,复杂和精巧并不意味着好。小路更复杂更富有技巧性,可大路才高效。

从 cpu 乱序执行的原理也可见一斑,cpu 最怕执行 if 判断,涉及 if 就要预判,涉及预判就有概率误判,而误判的代价很大,因此才有了人为偏向注入,比如 likely,unlikely。但如果事先确认逻辑规格的一致性不需要 if 判断,也就没有这种代价了,效率自然就提升了。

我从不把做网卡的人等同于做网络的,其实这些人做的事情跟网络关系也并不大。

然而从人的一方面看,做复杂的事意味着更多的工作岗位,高速公路取消省际收费结算后出行更高效了,但收费站员工失业了。哪天要是真的数据中心流量分流了,怕是要裁员不少了,所以内卷也并不总是坏事,干就完了。

周末跟博士聊天,说到这个话题就简单发个随笔。博士认为这个思路完全是 infra 侧的事,与业务无关,但我觉得应用可以倒逼 infra,给足时间,这些五花八门的协议也解决不了问题的时候,人们就跳出 “单纯仅仅的互联网技术圈子” 的思维定势要求 infra 必须做出改变了。你自己开车宁可去高速上堵着也不走国道,为什么不为数据修建一条高速公路呢?为什么高速公路好,不仅因为它大部分时间更快,还因为走它会更轻松。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/509846.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 输入输出语句讲解 标识符概念讲解

上文 C语言 预处理器 注释 基本案例讲解 我们讲了一些 预处理器等逻辑 那么 本文继续 C语言由一个或多个函数组成,每个程序都必须有一个main() 函数 因为每个程序总是从这个函数开始执行 main() 函数可以返回一个值,返回值为0表示程序正常结束 如果有多…

38.基于SSM实现的传统文化网站系统(项目 + 论文)

项目介绍 随着信息技术在管理上越来越深入而广泛的应用,作为一个一般的企业都开始注重与自己的信息展示平台,实现传统文化网站在技术上已成熟。本文介绍了传统文化网站的开发全过程。通过分析传统文化的需求,创建了一个计算机管理传统文化网站…

百廿荣光 逐梦远航——记黄城根小学120年校庆

逝者如斯,黄城根小学建校百二十年矣。回首往昔,峥嵘岁月,如画卷展开,历历在目,皆美景胜概。楼宇更迭,万象更新;历代师生,薪火相传。笃学笃行,育桃李于学堂;至…

Linux 内核优化简笔 - 高并发的系统

简介 Linux 服务器在高并发场景下,默认的内核参数无法利用现有硬件,造成软件崩溃、卡顿、性能瓶颈。 当然,修改参数只是让Linux更好软件的去利用已有的硬件资源,如果硬件资源不够也无法解决问题的。而且当硬件资源不足的时候&am…

低代码革新:软件开发的未来潜力与创新路径探索

过去的一年,挑战与机遇并存。人们一边忧虑市场经济下行所带来的新的增长难题、裁员危机,一边惊叹于AIGC、量子技术等领域不断涌现新的创新成果。 时代发生了改变,传统“互联网”的模式已走入尾声,新一轮的科技革命与产业变革正在到…

【VSCode+Keil5+STM32CubeMX】开发环境配置

一、软件下载 二、软件安装 三、配置环境 四、验证开发环境 五、Keil与VS Code的同步 从0到1搭建VS Code Keil5 STM32CubeMX开发环境 优点 支持标准库HAL库LL库代码编辑更“现代化”:代码提示、函数跳转、更高自由度的定制主题等优点多端同步,VS Code和…

深入了解C语言中的结构体类型与内存对齐

引言: 在C语言中,结构体是一种自定义的数据类型,它允许我们将不同类型的数据组合在一起,形成一个新的数据类型。结构体的使用为我们解决了一些复杂数据的表示和处理问题,不仅限于单单的整型或者字符。本文将深入探讨结…

金三银四上岸!2024最新Java高频面试题总结(附答案PDF)!

《Java面试全解析》1000道 面试题大全详解(针对于应届生、三到五年经验、六到十年经验!) 本人是 2009 年参加编程工作的,一路上在技术公司摸爬滚打,前几年一直在上海,待过的公司有 360 和游久游戏&#xf…

Mysql数据库getshell方法

今天摸鱼时候,突然有人问我不同的数据库getshell的方式,一时间我想到了mysql还有redis未授权访问到getshell的方式,但是仅仅第一时间只想到了这两种,我有查了查资料,找到了上面两种数据库getshell的补充,以…

python实现泊松回归

1 什么是基于计数的数据? 基于计数的数据包含以特定速率发生的事件。发生率可能会随着时间的推移或从一次观察到下一次观察而发生变化。以下是基于计数的数据的一些示例: 每小时穿过十字路口的车辆数量每月去看医生的人数每月发现的类地行星数量 计数数…

Mysql 常用SQL语句

1、查看mysql中所有的数据库, show databases; 2、创建库 create database 库名;(也可以用 create database if not exists 库名; 表示如果库不存在再创建) 例:create database if not exists ecology; 3、删除库 …

Linux安全加固

账号和权限 系统用户 超级管理员&#xff1a;UID0 系统默认用户&#xff1a;系统程序使用&#xff0c;从不登录 新增普通用户&#xff1a;UID大于500 用户管理 添加用户&#xff1a;useradd <用户名> 删除用户&#xff1a;userdel [-r] [-f] <用户名> 锁定/解…

electron 打包生成的latest.yml文件名字变成xxx.yml文件名

正常情况是electron每次打包会生成一个latest.yml文件和一个xxx.exe文件&#xff0c;但是当version的名字修改成 这样 后面添加了-beta &#xff0c;然后生成的文件名字就变成了 beta.yml 更改方法&#xff1a; 在build配置底下添加 "detectUpdateChannel": false…

我的C++奇迹之旅:值和引用的本质效率与性能比较

文章目录 &#x1f4dd;引用&#x1f320;引用概念&#x1f309;引用特性 &#x1f320;使用场景&#x1f309;做参数&#xff08;传值与传地址&#xff09;&#x1f309;传值、传引用效率比较 &#x1f320;引用做返回值&#x1f309;引用和指针的区别 &#x1f320;常引用&am…

坚持刷题|分发饼干

文章目录 题目思路代码实现实现总结主要步骤时间复杂度 扩展问题 Hello&#xff0c;大家好&#xff0c;我是阿月。坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天刷第一个贪心算法&#xff1a;分发饼干 题目 455.分发饼干 思路 要解决这个问题&#xff0c;可以使用…

深度学习实战73-基于多模态CLIP模型的实战项目,CLIP模型的架构介绍与代码实现

大家好,我是微学AI,今天给大家介绍一下深度学习实战73-基于多模态CLIP模型的实战项目,CLIP模型的架构介绍与代码实现。多模态CLIP(Contrastive Language-Image Pre-training)模型是一种深度学习模型,其核心设计理念是通过大规模的对比学习训练,实现图像与文本之间的跨模…

Linux——进程管理

目录 作业和进程的概念 程序与进程的关系 查看进程信息——ps&#xff0c;top ps命令 top命令 设置进程的优先级——nice&#xff0c;renice nice命令 renice命令 查看进程信息——pgrep&#xff0c;pstree pgrep命令 pstree命令 切换进程——jobs&#xff0c;bg&a…

【linux】基础IO(一)

文件只有站在系统层面才能彻底理解 简单回顾一下文件&#xff1a; 首先我们要明确一点&#xff0c;我们说的打开文件不是写下fopen就打开文件&#xff0c;而是当我们的进程运行起来&#xff0c;进程打开的文件。 我们在C语言一般都会使用过如下的代码进行向文件中写入 但是除…

Oracle客户端如何连接远程数据库?

Oracle是一种常用的数据库管理系统&#xff0c;它具有高效、稳定的特性&#xff0c;广泛应用于各行各业。为了实现远程数据库的连接&#xff0c;我们可以使用Oracle客户端工具。本文将介绍如何使用Oracle客户端连接远程数据库&#xff0c;并讨论其使用场景。 Oracle客户端工具 …

sql中如何添加数据?

添加 在 SQL 中添加数据通常使用INSERT语句。INSERT语句用于将新的数据行插入到数据库表中。 基本的INSERT语句语法如下&#xff1a; INSERT INTO table_name (column1, column2,...) VALUES (value1, value2,...);其中&#xff1a; INSERT INTO&#xff1a;指定要插入数据…