incast,拥塞控制,内存墙的秘密

数据中心 incast,广域网拥塞,内存墙都是一类问题。

我接触 incast 很久了,大多是帮忙查问题,也解过几例。

我记得有一次在业务几乎总是(在统计学上,几乎和总是属同义强调) tail latency 很大时,我建议在 sender 方加一个 0~rtt/2 的随机 delay,果然就缓解了。我尝试把这个方案 “永久” 化。

我觉得无论 clos 还是 leaf-spine 都太正则,它们是问题的原因而不是解法,特别在 mapreduce 场景,正则拓扑往往引发全局同步,所有服务器在 10ns 粒度同时发送数据,经过几乎等长的光纤同时到达 tor,剩下的交给 buffer 和时间,这就是 incast。

也因此,我建议插入随机时延。随机几乎是万金油,当你没有办法时,就想想随机。

但何必绕这么个圈子呢?先同步,再打乱?谁说下面的拓扑不合适呢:在这里插入图片描述
我知道 mesh 不该那样,我是故意的。光纤随机长度,汇聚 sw 下直接挂服务器,乱七八糟互联,都是些不负责任的拓扑,但都能缓解 incast,核心在于都引入了随机,至于它带来的混乱问题,就看和 incast 相比孰轻孰重了。

简单计算,信号 10ns 可传输 2m,40Gbps 交换机为例,报文间隔 200ns 即可避免拥塞,服务器只要有 0~20m 随机长度差即可缓解大部分 incast,这很容易。带宽越高,要求随机长度差越小,实施越容易。这只是开始。

站在这视角上升,然后往下看,就看到了 cpu 的内存墙。核越多,内存显得越慢,本质还是拥塞,好像多条流穿越一个瓶颈,受制于带宽。

只要涉及通信,那么 rtt 的开销就必不可少,而 rtt = 处理时延 + 传播时延 + 排队时延。传播时延只能减少距离来降低,cdn,内存离核越来越近,都在干这事。而处理时延受限于自身跟别人无关,一会儿说,排队时延比较有趣,先说它。

信道容量有限,需要通信方同步,同步是对通信信道达成共识的过程,因此排队时延是一种同步时延,通信量随通信方指数增长,而带宽却不能。cdn 卸载了骨干流量,但回源流量还在,前端总线越来越堵,加带宽也没法弥补,干脆处理核独享内存控制器,但只要内存本身还共享,问题就没解决。

回来说处理时延,处理时延也是种同步时延,即通信双方能力的同步,最终对木桶达成共识,效率取决于弱者。像 cpu 和内存,本就是两类东西,几乎可以肯定内存一定不比 cpu 快,否则二者就会反转,你快你算吧,至少能加速存内计算的普及。

综上,无论数据中心,广域网,还是 cpu 和内存,问题都围绕三个 rtt 组分:一方快另一方慢;距离太远;带宽太小而拥塞。解决这些问题的方法也一致:拉近距离,要么独享,要么错开。
L1/L2 cache 和 cdn 一样,但问题也和 cdn 一样,只是被小时延放大了问题尺度。这些都是细枝末节。

周五早上问 chatgpt “能不能随机化服务器光纤长度来缓解 incast”,chatgpt 说能,但不好,教我 “要用拥塞控制,流控和 buffer 来解决问题“,我一看这些就烦,这不都是经理们天天瞎咧咧的吗,瞎 JB 卷,结果这些恰是问题的原因而不是方案,我发了个朋友圈,把 cu 口去了:

问行不行就是行,问好不好就是不好。就算编程的人都知道尽量别动共享变量,避开同步,要异步,要percpu,怎么到了网络这里就开始天天瞎扯拥塞控制而不是异步避免拥塞,同样在处理器访存时那么多核心一起访问内存,内存墙越来越高后瞎折腾 L2/L3 cache 而不是搞独占和错峰,都 TMD 治标不治本且越搞越复杂好吗,一回事的解法也是一回事,三层架构和叶脊都太正则了,这不明显去硬碰同步的吗,路边摊小贩都知道摆一路而不是摆一排,公务员和经理都知道错峰上班,一帮工人一起挤着打卡堵了不是活该?就不能不规定准点上班?谁规定汇聚设备下不能挂服务器了,让你们错开为你们好,总有 SB 瞎怼挑毛病。当然,为了卷绩效的话你说什么都对。

多跟编程的学学,避开共享,避开同步,放之四海而皆准。编程的时候知道,不编就忘了?同步就是峰谷落差太大,集中力量闯大祸。所有人一起跺脚的频率和桥匹配,能把桥振塌,所有流量一起到,能把 buffer 干爆,所有处理核一起 spin,能把板子烧了。

尝试一下如何从根本上解决问题,而不是 “尽可能缩短时间”,后者毕竟只是缓解而不是解决。根本方案就是消除数据通信。这会儿从 cpu 说起。

最初,cpu 是数据面核心,所有数据都要送往 cpu。冯诺依曼存结构,cpu 负责计算,内存负责存储,两者之间必然要通信。于是计算,存储,通信三大件儿,各按自身规律独立发展。但随着单一功能外设(我关注网卡)快速发展,cpu 很快成了慢速设备,更别提内存了。事实上,cpu 大多也是被内存拖累, 访存时间太慢,但无论如何,冯诺依曼结构决定了 cpu 和内存只能共荣辱。

cpu 成了控制面,不再被寄希望于干重活。Linux 内核被认为不是千万并发的方案,而是问题所在,大家想方设法 bypass kernel,bypass cpu,kernel 和 cpu 在高性能网络领域被认为很 low。

事实上,不是 cpu low,高性能网卡毕竟功能相对单一,携带大量 offloading engine,比 cpu 更快处理网络报文理所当然,但当它们遇到甚至 1.6Tbps 时,也会逐渐吃力,你看,它们和 cpu + 内存没有本质区别。

问题不在 cpu,问题在冯诺依曼结构根本上是个网络通信结构,统计复用的带宽同步争抢问题是固有的,再大带宽也挡不住概率性突发。

如果倒转视角,把 cpu 当作控制面而不再是 “中央(数据)处理” 器,而以内存为 “中央”,并在内存的存储颗粒间嵌入计算单元(摩尔定律允许这么做),cpu 只负责将 “代码” 发给内存,内存自己进行计算和存储,就打破了冯诺依曼结构,消除了数据通信时对内存带宽的同步争抢:

在这里插入图片描述
mapreduce 网络传输也可以这么玩,举一例,不要将片段扇入到一个节点再,一边走一边拼接,走到底也拼完了,以数据本身为中心而不是以数据传输为中心,过交换机的时候一定是一份大数据,而不是多份小数据,只有一条流显然就消除了同步访问,更容易做流控:

在这里插入图片描述
无意同步,却全局同步,有意同步,以合作代替争抢,这很辩证。

性能问题就是时间问题,时间问题的根源在等待资源,无论网络传输还是 cpu 内存传输都一样。最终所有问题归根结底就是多路复用问题,而多路复用则分为统计复用和非统计复用(如时分复用),区别在于统计复用会因个体异常拉偏均值,比如 tail latency.

当我们说 “系统性能差” 时,一定是在抱怨时间太久,但真实的 “系统” 性能差一定不针对个体,它一定是全局的。系统性能差几乎一定是资源不足,剩下的就是使用资源的方式了,由于统计复用个体会拉偏整体,“要异步使用资源,而不是同步使用”,也就是本文的主旨。

说一万次了,buffer 不属于系统资源,带宽才是。

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

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

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

相关文章

利用chart.js来完成动态网页显示拆线图的效果

<% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%><%! String list"[一月份, 二月份, 三月份,四月份, 五月份, 六月份, 七月]"; String label"我的一个折线图"; String data &qu…

贝叶斯个性化排序损失函数

贝叶斯个性化排名&#xff08;Bayesian Personalized Ranking, BPR&#xff09;是一种用于推荐系统的机器学习方法&#xff0c;旨在为用户提供个性化的排名列表。BPR的核心思想是通过对用户历史行为数据的分析&#xff0c;对用户可能喜欢和不喜欢的物品对&#xff08;item pair…

迭代器模式

自定义 Counter 结构体类型&#xff0c;并实现迭代器。其他语言的场景&#xff0c;读取数据库行数据时&#xff0c;使用的就是迭代器。我们使用for语言遍历数组&#xff0c;也是一种迭代。 结构体对象实现 Iterator trait&#xff0c;创建自定义的迭代器&#xff0c;只需要实现…

【全栈开发】Blitz.js与RedwoodJS

技术的不断发展是必然的。如果你仔细观察这片土地&#xff0c;你会注意到随着技术的成熟而出现的某些模式。特别是&#xff0c;开发人员一直在努力提高性能&#xff0c;简化开发过程&#xff0c;增强开发人员体验。 在本指南中&#xff0c;我们将分析两个帮助全栈应用程序世界…

航天宏图——宏图1号样例数据0.5米-5米分辨率(上海部分)

简介&#xff1a; 作为航天宏图“女娲星座”建设计划的首发卫星&#xff0c;航天宏图-1号可获取0.5米-5米的分辨率影像&#xff0c;具备高精度地形测绘、高精度形变检测、高分辨率宽幅成像以及三维立体成像等能力&#xff0c;在自然资源、应急管理、水利等行业与领域具有极高的…

python游戏开发pygame初步

文章目录 安装和示例移动物体优化 安装和示例 顾名思义&#xff0c;PyGame就是用来做游戏的Python库&#xff0c;提供了许多游戏开发功能&#xff0c;如图像处理、音频播放、事件处理、碰撞检测等等。从这个角度来说&#xff0c;pygame不仅是一个游戏库&#xff0c;同时也是一…

Redis面试题:redis做为缓存,mysql的数据如何与redis进行同步呢?(双写一致性)

目录 强一致性&#xff1a;延迟双删&#xff0c;读写锁。 弱一致性&#xff1a;使用MQ或者canal实现异步通知 面试官&#xff1a;redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&#xff1f;&#xff08;双写一致性&#xff09; 候选人&#xff1a;嗯&#xff…

为什么淘宝取消双12活动?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 淘宝取消双12活动了&#xff0c;这条消息犹如一颗重磅炸弹&#xff0c;在整个电商圈中引发了轩然大波。 不过呢&#xff0c;淘宝为了过度&#xff0c;把双12改了个名字叫“好价节”。估计是官方都…

使用skforecast进行时间序列预测

时间序列预测是数据科学和商业分析中基于历史数据预测未来价值的一项重要技术。它有着广泛的应用&#xff0c;从需求规划、销售预测到计量经济分析。由于Python的多功能性和专业库的可用性&#xff0c;它已经成为一种流行的预测编程语言。其中一个为时间序列预测任务量身定制的…

栈详解(C语言)

文章目录 写在前面1 栈的定义2 栈的初始化3 数据入栈4 数据出栈5 获取栈顶元素6 获取栈元素个数7 判断栈是否为空8 栈的销毁 写在前面 本片文章详细介绍了另外两种存储逻辑关系为 “一对一” 的数据结构——栈和队列中的栈&#xff0c;并使用C语言实现了数组栈。 栈C语言实现源…

【自主探索】基于 rrt_exploration 的单个机器人自主探索建图

文章目录 一、rrt_exploration 介绍1、原理2、主要思想3、拟解决的问题4、优缺点 二、安装环境三、安装与运行1、安装2、运行 四、配置说明1、Robots Network2、Robots frame names in tf3、Robots node and topic names4、Setting up the navigation stack on the robots5、A …

【数据库】执行计划中二元操作对一趟扫描算法的应用,理解代价评估的应用和优化,除了磁盘代价还有CPU计算代价不容忽略

二元操作的一趟算法 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定…

C#,《小白学程序》第十九课:随机数(Random)第六,随机生成任意长度的大数(BigInteger)

1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// 除法运算为 Truffer…

Leetcode—167.两数之和 II - 输入有序数组【中等】

2023每日刷题&#xff08;四十一&#xff09; Leetcode—167.两数之和 II - 输入有序数组 实现代码 /*** Note: The returned array must be malloced, assume caller calls free().*/ int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {*returnSiz…

小程序中的大道理之四--单元测试

在讨论领域模型之前, 先继续说下关于测试方面的内容, 前面为了集中讨论相应主题而对此作了推迟, 下面先补上关于测试方面的. 测试覆盖(Coverage) 先回到之前的一些步骤上, 假设我们现在写好了 getPattern 方法, 而 getLineContent 还处于 TODO 状态, 如下: public String ge…

网络视频播放卡顿原因分析

一、问题描述 某项目通过拉摄像机rtsp流转rtmp/http-flv/ws-flv的方案&#xff0c;使用户可以在网页中观看摄像机的视频画面。在 观看视频时偶发出现卡顿现象。 二、卡顿现象分析和解决 此问题涉及的原因较多&#xff0c;所以得考虑各环节的问题可能性&#xff0c;并根据现场实…

在CentOS 7.9上搭建高性能的FastDFS+Nginx文件服务器集群并实现外部远程访问

文章目录 引言第一部分&#xff1a;FastDFS介绍与安装1.1 FastDFS简介1.2 FastDFS安装1.2.1 安装Tracker Server1.2.2 安装Storage Server 1.3 FastDFS配置1.3.1 配置Tracker Server1.3.2 配置Storage Server1.3.3 启动FastDFS服务 第二部分&#xff1a;Nginx配置2.1 Nginx安装…

Docker容器化部署若依微服务ruoyi-cloud项目

系统环境 接下来的内容以 Ubuntu 22.04.1 操作系统为例。 下载安装Docker Ubuntu hihi-IdeaCentre-GeekPro-15ICK:~$ sudo su [sudo] hi 的密码&#xff1a; roothi-IdeaCentre-GeekPro-15ICK:/home/hi# docker ps 找不到命令 “docker”&#xff0c;但可以通过以下软件包安…

Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线(实例分析)

Visual Studio 使用MFC 单文档工程从创建到实现绘制单一颜色直线和绘制渐变颜色的直线 本文主要从零开始创建一个MFC单文档工程然后逐步实现添加按键&#xff08;事件响应函数&#xff09;&#xff0c;最后实现单一颜色直线的绘制与渐变色直线的绘制o(&#xffe3;▽&#xffe…

【云原生】什么是 Kubernetes ?

什么是 Kubernetes &#xff1f; Kubernetes 是一个开源容器编排平台&#xff0c;管理着一系列的 主机 或者 服务器&#xff0c;它们被称作是 节点&#xff08;Node&#xff09;。 每一个节点运行了若干个相互独立的 Pod。 Pod 是 Kubernetes 中可以部署的 最小执行单元&#x…