网络规模与性能优化的一篇随笔

news2024/11/18 9:47:39

本周写篇轻松的话题,注意信息传输的尺度和缩放比例,写篇随笔。

控制面和数据面随规模缩放的影响,举几个例子就能说明白。

CSMA/CD,控制面和数据面在一起,控制信息交互时延和数据面时延在同一尺度时,就到了极限,因为控制交互时延相对数据面时延更大的话,便可以反过来用了,如果一个胖经理跑 100 步等于一个工人走 1 步,为什么不换个瘦经理或者让工人命令经理呢,因此它们趋向最多收敛到一致。控制面和数据面合而为一的另一个例子是 TCP,带内控制协议典范。

翻转时延分配的经典例子是非对称加密和对称加密,时延更大的 RSA 可用的理由是它更安全更方便解决对称密钥分发和认证问题,但更大的理由是这些需求相对于对称加密更不频繁,否则人们肯定会想办法组合对称加密算法来满足。

交换式以太网脱胎于总线是从 CSMA/CD 逐步将控制面抽离并将控制面信息交互时延不断压缩的过程,最终控制信息交互时延足够短,几乎就有了全局视图,用 crossbar 类交换设施取代统计仲裁变得可行。但 rfc2544 的要求指出控制时延依然存在,它并没有消失,只是和传播时延相比,低到足以忽略了。

接着看另一个时延尺度问题从而揭示根本。

提到 rtt,它指主机时延,传播时延,排队时延之和,整个网络的控制面开销被所有流量的转发过程分担。注意到这些时延在整体 rtt 中的占比以及影响非常重要。

对不同尺度的网络,主机时延和排队时延的占比存在根本区别,问题解法也根本不同。网络规模越小,主机时延和排队时延占比越大,而排队时延影响越大,详细分析这事能指导我们做正确的事。

注意两个变量,一个是光速传播时延随网络规模线性变化,即 proprt = d/c,一个是 buffer 排空时间随网络规模以 根号n 变化,依据是 buffer_size = bdp/根号n。两个变量表现为两个不同伸缩速率,围绕这两个伸缩速率的其它时延伸缩是根本:
在这里插入图片描述

在数据中心,rtt 的主机分量和传播分量在同一 us 尺度,排队分量要高一两个数量级在 ms 尺度,以应对随机而频繁的 incast。三者占比类似,主机时延增加一倍,rtt 至少增加 1/3,而一旦遭遇 buffer queuing,rtt 至少增加 10 倍,这指明两个明确的方向,降低主机时延,减少 incast。大多数互联网厂商的伙计们都在干这两件事,DPDK,XDP 等 bypass,FPGA,DPU 等研发均旨在降低主机时延,而包括 SRD,Falcon 等 transport protocol,以及 SDN 技术旨在缓解甚至消除排队时延,而 Swift cc 则旨在明确区分势均力敌的主机和传播/排队网络时延,以更精确进行拥塞识别。

数据中心内部,SDN 控制器作为控制面,它本身与传统路由协议工作在同一时间尺度(参考南北向流量的生成过程),与 CSMA/CD 一样已到规模极限,但这并不是摒弃它的理由,相反,它是从多个盒子里故意抽拉出来的,因为它能大大减少甚至消除排队时延,而排队时延在数据中心影响巨大。

而 SDN 控制器在广域网上的作用却是另一个故事,反在相反的路上越走越远。广域网的排队时延小于传播时延且随规模增加而差距渐大(参见根号关系),控制信息交互时延与传播时延仍在同一尺度,尝试用它稍微降低一个很重要但并不那么重要的排队时延,反过来可能引入控制器净时延,因为广域网是异步统计的,完全消除排队肯定需要同步仲裁,这本身反而会加重排队(比较有趣的矛盾)。

总之,排队时延的广域网的影响不如在数据中心的影响大,为降低(但不能消除)排队时延在广域网引入 SDN 的 ROI 太低甚至带来净亏损。

整个互联网即使一开始不是脱胎于应对核打击而采用分布式架构,仅仅在知道中心化如此低效后,也还会转向分布式架构。

如果SDN 控制信息交互时延不低于数据通信本身甚至阻滞(比如指令尚未下发)数据通信时,它都有收缩趋势,只有在它能实际降低净时延时,比如数据中心场景,才能抵抗这种收缩趋势,所以不可能存在全球 SDN 控制器,它只能存在于数据中心,局域网。就像大帝国达到一定疆域必定收缩一样,而像希腊城邦则对CSMA/CD更包容。

至于 SDWAN 的意义,单独抽出这张 overlay,它就是个小规模网络,不得不说的是,这涉及到分形或同构性,只要在同一个层次上说事,就要在这个层次上谈规模,规模缩放的原则依然是普适的同一个原则,因此,全球 overlay 上的 SDN 就可以,但全球 underlay 上 SDN 就不行,但如果规模扩展到太阳系,overlay 的 SDN 也不行了。

一个和 SDWAN 规模相关的例子是,假设选择一条更好的路径的开销为 1ms,在数据中心,这 1ms 的选路开销避开 5ms 排队延时或许看起来挺值,但在广域网上,1ms 的选路开销可能减少 50ms 的传播时延(比如一个节点比另一个节点近 10000 公里),并且减少了 10ms 的排队时延,同样的选路开销却带来相差 10 倍的增益,这就是规模非线性效应。另一方面,数据中心抖动 100us 可能造成总 rtt 相差一倍,但对于广域网,100us 微不足道,因此对于 cc 中的 bdp 计算,显然对规模越小的网络越敏感,一个看得见的结果是 bbr 在小规模网络中侵占性太强(rtt 陡一下,bdp 差很多)而不实用。

指导性很明确,大规模网络选路收益大,小规模网络时延敏感性高。用什么不用什么,怎么做,现成的东西怎么改,自己定。

现在谈下传播时延。

传播时延看起来是一个受光速制约的倔强变量,我们无法做任何事情。但当它真成为瓶颈,唯一选择就是绕开它。典型的例子是多核处理器和边缘计算,看起来不相干的东西,实际是一回事。

处理器实际上就是用导线连接的不同计算组件总体,每个组件完成部分计算,将结果通过导线传输到另一个组件继续。传播时延不变,但组件的计算速度却在变快,直到它超过了传播速率,导线成了瓶颈。

让导线变短是好办法,而摩尔定律让这可行。处理器发展方向不是不断增强计算组件,而是不断把所有组件缩小,把整个处理器缩小,同一空间部署多个更小的处理器,这就是多核。

边缘计算则更直接,其不变量是一些硬需求,比如刹车时间,卡顿感知时间,分帧感知时间,唯一的方式就是将计算搬到离自己足够近到传播时延满足这些要求的地方。由此计算弹性可以衍生出 CDN,在边缘计算资源闲置时可缓存内容资源供就近下载,但有趣的是,这个顺序是反着的,CDN 更早一些,后来才有了边缘计算,可见时间不耐古已有之。

我举个例子结束关于传播时延的讨论,半径 200 米的圆形社区,圆心处有一家大型超市,别墅围绕在圆周,居民幸福感很强,半径 200 公里的圆形社区,别墅围绕在圆周,圆心处即使有座城市,居民便感受不到便利了。因为从步行到汽车速度的缩放相对距离缩放太慢了。

最后,谈谈 TCP。所有 TCP 失效的问题几乎都是规模问题。

上周写过一篇文章,谈谈越来越无效的拥塞控制 提到随着带宽的提高,拥塞信号越发不准确,传统的长肥管道问题也是一个规模问题,两个其实也是一回事,网络规模变大了,速度变快了,可拥塞的事实并没变,传达这个事实必然不能再用老方法了。

生活在越来越大的城市里的人们直接串门越来越少,事前都要先约一下,跑空的概率增加,代价增大,规模缩放会改变信息交互方式。

长肥管道中丢包后 cwnd 张开慢只是表象,认识不到本质只会被这些表面现象牵着鼻子走,就算不用 cwnd 控制你也搞不定。你想想任何信号包括电力在长距离传输中也会衰减就明白本质了,这其实是成功概率是与关系很快趋近 0,失败概率是或关系的问题很快到 100%,这概率计算随着规模扩展迅速非线性地拉大成功和失败之间的距离,这就是本质。解法自然就是不要搞长肥管道,别跟自然律对抗。

长肥管道问题,其它行业早就有解法,信号传输用中继补偿衰减,长距离输电升压减少热耗,TCP 你就不搞个代理 or SDWAN 隧道模仿一下信号中继,你就不用 pacing 模仿一下升压减少对 buffer 的冲击(bdp 很大,burst 对 buffer 冲击大,类似大电流的热耗)?固有损耗只能通过中继,比如电线漏电是没法通过升压解决的,但自身行为导致的损耗是可通过调节自身行为弥补的,比如升压输电,pacing 发送,一个 100MB 的 buffer 一窗发 110MB 就会丢包,但 pacing 就能顺利通过,这就是为什么转发节点都 pacing 的原因,网络传输也有欧姆定律。

成天想着怎么往长肥管道里猛灌增加 cwnd,除非你有物理专线,否则灌得多丢得多。

so?线性系统不好玩,纯内卷看不到岸。只有指数(无论指数是否大于 1)系统才有趣,才能在缩放中让各组分以不同比例的速度达到极限,优化明显落后的,或者砍掉明显靠前的,就有了看得见的收益,而工作的意义就在于,你要敏锐地发现哪些组分缩放地更快或者更慢。

希望本文对你有所启发。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac M1 M1 pro安装 protobuf 2.5.0

因为项目中的protobuf是2.5.0版本,但是旧版本的protobuf 不支持M1,此时需要修改源码重新编译 操作步骤: 从git上面下载对应版本的protobuf,地址:Release Protocol Buffers v2.5.0 protocolbuffers/protobuf GitHub…

Java源码分析:Guava之不可变集合ImmutableMap的源码分析

原创/朱季谦 一、案例场景 遇到过这样的场景&#xff0c;在定义一个static修饰的Map时&#xff0c;使用了大量的put()方法赋值&#xff0c;就类似这样—— public static final Map<String,String> dayMap new HashMap<>(); static {dayMap.put("Monday&q…

使用 React Flow 构建一个思维导图应用

思维导图是围绕共同主题或问题将思想、概念、信息或任务分组的视觉表示。思维导图应用是一种软件应用&#xff0c;允许您创建、可视化和组织您的思想、想法和信息作为思维导图。本文将向您展示如何实现自己的思维导图应用程序。 在我们开始之前&#xff0c;我想向您展示一下我们…

Go 上下文 context.Context

Go语言中的上下文&#xff08;Context&#xff09;是一种用于在 Goroutines 之间传递取消信号、截止时间和其他请求范围值的标准方式。context 包提供了 Context 类型和一些相关的函数&#xff0c;用于在并发程序中有效地传递上下文信息。 在Go语言中&#xff0c;上下文通常用于…

DAY56 647. 回文子串 + 516. 最长回文子序列

647. 回文子串 题目要求&#xff1a;给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不同的子串。 示例 1&#xff1a; 输入&#xff1a;"abc&q…

在Rust编程中使用泛型

1.摘要 Rust中的泛型可以让我们为像函数签名或结构体这样的项创建定义, 这样它们就可以用于多种不同的具体数据类型。下面的内容将涉及泛型定义函数、结构体、枚举和方法, 还将讨论泛型如何影响代码性能。 2.在函数定义中使用泛型 当使用泛型定义函数时&#xff0c;本来在函…

MATLAB Simulink和S7-1200PLC MOBUSTCP通信

MATLAB Simulink和SMART PLC OPC通信详细配置请查看下面文章链接: MATLAB和西门子SMART PLC OPC通信-CSDN博客文章浏览阅读749次,点赞26次,收藏2次。西门子S7-200SMART PLC OPC软件的下载和使用,请查看下面文章Smart 200PLC PC Access SMART OPC通信_基于pc access smart的…

瑞吉外卖Day06

1.用户地址 1.1实体类 /*** 地址簿*/ Data public class AddressBook implements Serializable {private static final long serialVersionUID 1L;private Long id;//用户idprivate Long userId;//收货人private String consignee;//手机号private String phone;//性别 0 女…

集软件库、论坛、社区、工具箱、积分商城、会员体系、在线商城一体的后台系统+HBuilderX 前端软件社区

集软件库、论坛、社区、工具箱、积分商城、会员体系、在线商城等多个功能于一体的全面后台系统加上强大的HBuilderX前端软件社区&#xff0c;为用户提供了全面的应用开发和交流平台 企业猫提供了完善的后台搭建服务&#xff0c;通过该服务&#xff0c;用户可以方便地搭建出所需…

关于FreeRTOS函数xSemaphoreGiveFromISR卡死的问题

0. 概述 关于FreeRTOS函数xSemaphoreGiveFromISR卡死的问题 1. 遇到的问题 在使用FreeRTOS调试激光雷达检测面积的项目的时候&#xff0c;遇到一个现象&#xff1a;在新加了一个线程之后&#xff0c;把程序下载到板子之后程序不会运行&#xff08;实际上已经运行了&#xff…

C语言二进制数(ZZULIOJ1068:二进制数)

题目描述 将一个二进制数&#xff0c;转换为对应的十进制数。 输入&#xff1a;输入一个只含有’0’和’1’的字符串&#xff0c;以回车结束&#xff0c;表示一个二进制数。该二进制数无符号位&#xff0c;长度不超过31。 输出&#xff1a;输出一个整数&#xff0c;为该二进制数…

【C语言期末不挂科——指针篇1】

C语言指针初阶 文章目录 C语言指针初阶**什么是指针&#xff1f;**   **1&#xff09;初识指针**  **2&#xff09;地址的大小**  **3&#xff09;指针变量** **指针的类型**   **1)指针对整数加减运算**  **2&#xff09;指针的解引用** **野指针**  **1&#xff…

linux使用spi读取icm20608传感器数值一直显示0

1.这个问题困扰了我两天&#xff0c;把下面这些uart2相关引脚屏蔽掉也不行&#xff0c;ICM20608 ID 读出的数值一直为 0X0 pinctrl_flexcan2: flexcan2grp{ fsl,pins < /* MX6UL_PAD_UART2_RTS_B__FLEXCAN2_RX 0x1b020*/ /* MX6UL_PAD_UART2_CTS_B__FLEXCAN2_TX 0x1b020*/…

关于Ultra HDR Image的那些事

一、什么是Ultra HDR Image 2023年10月初&#xff0c;google正式发布了Android 14。该版本中引入了一个新的功能Ultra HDR Image&#xff0c;被誉为”图像技术的未来”。之前Android版本各手机厂商或许有自己的HDR图片技术&#xff0c;本文这里重点分析下Android14上google的实…

JavaScript 浮点数运算的精度问题及解决

JavaScript 浮点数运算的精度问题及解决 在 JavaScript 中整数和浮点数都属于 Number 数据类型&#xff0c;当浮点数做数学运算的时候&#xff0c;你经常会发现一些问题&#xff0c;举几个例子&#xff1a; 0.1 0.2 0.30000000000000004 console.log(0.1 0.2) 0.3000000…

springcloud新闻发布系统源码

开发技术&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;nodejs&#xff0c;idea&#xff0c;vscode springcloud springboot mybatis vue elementui 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示搜索新闻&#xff0c;新闻分类&#xff0c;新闻列表…

VS+Qt+C++ Yolov8物体识别窗体程序onnx模型

程序示例精选 VSQtC Yolov8物体识别窗体程序onnx模型 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《VSQtC Yolov8物体识别窗体程序onnx模型》编写代码&#xff0c;代码整洁&#xff0c;规…

【Hello Go】Go语言工程管理

工程管理 工作区工作区介绍GOPATH设置 包自定义包main包main函数和init函数导入包点操作别名操作_操作 测试案例GOPATH配置go install使用 在我们实际的工作中 直接运用到编译器进行编译链接的场景少之又少 这是因为 在工程中不会只有一个源文件 并且源文件之间也有着相互依赖…

java学习part05

43-流程控制-使用Scanner类从键盘获取数据_哔哩哔哩_bilibili 1.接收输入 步骤 例子 2.生成随机数 3.switch-case 4.for 5.while

IDEA插件下载到本地

IDEA插件下载到本地 官网下载【点击跳转】