数据中心的拥塞控制

前面提到,如今的高速网络方案集中在卸载主机网络能力,降低主机处理时延,甚至 PFC 用网络排队时延换主机时延,本末倒置。而在拥塞控制领域仍是传统的 AIMD 闭环反馈,ECN,QCN 那一套,但拥塞是端到端时延的大头,不可不察。

网络不好改,但总将希望寄托在利用现成以太网,再高端的网卡也成了无水之源。过多资源往端倾斜,以至甚至 TOR 交换机已经远远无法支撑主机网卡的高吞吐。

网络的核心不是数据从超猛网卡放到网线就不管了,这种假设的前提是 “网络是尽力而为的”,但数据中心网络本质上是主板的延伸。

为配合高性能网卡,交换机已经做了很多复杂的事,如 PFC,QCN,但何不增加一个控制面呢?这不就是 SDN。

但一提到 SDN 总免不了陷入 “分布式控制 vs. 集中式控制” 的争论,但世界绝非非黑即白,如果只集中控制或者说调度拥塞就很高尚,数据转发依然按照分布式路由来。

如下图所示一个简单的例子,上图是传统的带内闭环反馈,下图是一个直观的集中式拥塞控制:
在这里插入图片描述

聚合可以是重新选一条路绕过拥塞点,也可以是 802.3ad,随意。全局看,局部受害流在大部分情况下绕过一个拥塞点非常容易,可能只需要换个端口跨条线就行,controller 就是干这个的。

这是非常自然的拥塞控制,哪里发生拥塞,哪里负责发送源抑制,顺便疏导调度拥塞而不是前向丢包或标记,更不是向上一跳 pause。说实话,依靠确认反馈的端到端拥塞控制携带着早期 TCP 的影子,结论延续了下来,以至于所有其它方式都 “不自然”,包括名不副实的 ICMP 报文(RFC896)。

直接丢包最简单,没有 receiver 的确认,sender 早晚会发现,正如范雅各布森多年后评价道,丢包永远不会说谎,不会被误解。但这种带内控制方式并不直观,也不高效,于是后来就有了 ECN,QCN,但本质上还是前向带内反馈,到顶就是到顶了。

如果能在带外直接通知 sender 需要做收敛,就没有必要必须丢包,疏导即可,丢包不是目的,而是昂贵的手段,否则在 ECN 时代也不会用标记代替丢包了。

有趣的是,实现这一条带外控制方式只要增加一个简单的控制面,这种复杂性并不比实现并处理 PFC 更难。控制面只需要确保随时准备好一条或几条备选路径即可拯救 PFC 下的 “受害流”,既然可以用 buffer 做后备,用路径做后备则更自然,还能消除拥塞排队时延。

控制面甚至可以是另一张普通网络,意思到了就行,不用非生搬硬套概念,先搭建跑通,手顺了,慢慢就标准化了。

再说一个有趣的点,慢就是快,快就是慢。

试想存在一个控制信息比如源抑制,重选路,重聚合可以瞬间(不需要时间)到达目标主机或目标交换机,整张数据面网络将永远没有拥塞,因为拥塞可被控制面提前预见并疏导化解,核心在于拥有全局视图的控制面比数据面更快。但很遗憾,信息都是以准光速传播的,无论控制信息还是数据转发信息。

但换一个思路,数据面网络可以逐跳人为引入固定时延或人为拉长线缆提高时延,而控制面则以准光速全速传播,这样控制信息就比数据转发 “更快” 了,虽然所有的数据转发时延增加了 20us(or 其它容忍时延),但拥塞消除了,p99 还会优化,达到这种效果只需要寻找一个在出让的 20us 内收敛的算法,纯成了一个算法问题。这就是慢就是快,us 级的买卖值得做。

反过来若一味激进发送,造成同步,拥塞的后果则非常严重,在数据中心的短肥网络场景,拥塞排队(ms 量级)的端到端(us 量级)占比将巨大到业务崩溃,吞吐和时延抖动将严重影响业务稳定性,而重连需要更多的时间。这就是快就是慢,ms 级的豪赌要避开。

当代青年的误区在拿广域互联网那一套分布式自组织机制照搬到数据中心,同时还嫌弃它效率低,于是拼命给仙人掌浇水,却发现《仙人掌喝水死了》(舌头乐队),吸取了教训,于是转而给金鱼戴上了游泳圈。

数据中心的性能应该关注的是 link,它们连接着异构但确定的各种 PU,至于 TCP/IP 连接的显然不是性能攸关的主机服务,人们不肯为数据中心设计专用的连通协议,继续使用 BGP/IGP 除了兼容性更多的还是拿来主义(兼容性可以通过 Gateway 解决),因为这是现成的。但为了这种方便就不得不容忍它的不足,指望 10us 甚至 1us 级收敛是不可能的,为了表达各种不服,膏药抹了一层又一层。

TCP/IP 工作在 ms 级,这和通用操作系统的调度周期相匹配,但不足以满足数据中心的 PU 互联,虽然 PU 互联早就不使用 TCP/IP,但我的意思是,它们多多少少在学 TCP/IP,并已经携带了影子。如果希望要从一个早到 1970 年代开始讲故事的老师那里获得智慧,或许应该看看 PCI,PCIe 甚至 ISA 的早期发展。

最后,如果一个事越做越复杂,大概率就是路子错了,甚至南辕北辙了,不要在细节的突破上自我感动,及时停下。我经常跟女儿讲这个道理,用它应对问题,正确的思路一定是一气呵成且简洁的,结果,即使像考试这种我根本不在乎的事,她在没有任何补课,没有任何额外辅导(包括我自己也没有给她任何额外辅导)的情况下,排名一直稳定靠前,这是值得欣慰的,我希望做技术也是如此,正确的,简洁的,轻松的,但大部分情况下不是。

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

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

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

相关文章

【网络云计算】2024第48周-技能大赛-初赛篇

文章目录 1、比赛前提2、比赛题目2.1、 修改CentOS Stream系统的主机名称,写出至少3种方式,并截图带时间戳和姓名,精确到秒,否则零分2.2、 创建一个名为你的名字的拼音的缩写的新用户并设置密码,将用户名添加到 develo…

SAP+Internet主题HTML样式选择

SAP目前只支持三种HTML样式选择: 样式一 背景色:深色,蓝 特点:适中型排列,与SAP界面排列相同,富含UI特征,整齐美观 URL地址:http://cn1000-sap-01.sc.com:8000/sap/bc/gui/sap/it…

鸿蒙动画开发07——粒子动画

1、概 述 粒子动画是在一定范围内随机生成的大量粒子产生运动而组成的动画。 动画元素是一个个粒子,这些粒子可以是圆点、图片。我们可以通过对粒子在颜色、透明度、大小、速度、加速度、自旋角度等维度变化做动画,来营造一种氛围感,比如下…

Java 使用MyBatis-Plus数据操作关键字冲突报错You have an error in your SQL syntax问题

问题 这个报错是出现在Java Spring boot项目中,使用MyBatis-Plus通过创建的实体类对数据库的操作过程中,通过实体创建数据库表是没有问题的,而在接口调用服务类操作数据库的时候,会出现报错。报错详情如下: 服务请求异…

<项目代码>YOLOv8 草莓成熟识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

查看Docker容器的IP地址有几种方法

查看 Docker 容器的 IP 地址有几种方法,这里列出了一些常见的方法: 方法一:使用 docker inspect 命令 docker inspect 命令可以提供容器的详细信息,包括 IP 地址。以下是具体步骤: 获取容器的 ID 或名称。可以通过 d…

Django5 2024全栈开发指南(一):框架简介、环境搭建与项目结构

目录 一、Python Web框架要点二、Django流程2.1 Django介绍2.1.1 简介2.1.2 特点2.1.3 MVT模式2.1.4 Django新特性2.1.5 Django学习资料 2.2 搭建Django框架开发环境2.2.1 安装Python语言环境2.2.2 安装Django框架 2.3 创建Django项目2.4 Pycharm创建项目2.5 初试Django52.5.1 …

Flutter:Dio下载文件到本地

import dart:io; import package:dio/dio.dart;main(){// 创建dio对象final dio Dio();// 下载地址var url https://*******.org/files/1.0.0.apk;// 手机端路径String savePath Directory.systemTemp.path/ceshi.apk;print(savePath);downLoad(dio,url,savePath); }downLo…

Golang | Leetcode Golang题解之第564题寻找最近的回文数

题目: 题解: func nearestPalindromic(n string) string {m : len(n)candidates : []int{int(math.Pow10(m-1)) - 1, int(math.Pow10(m)) 1}selfPrefix, _ : strconv.Atoi(n[:(m1)/2])for _, x : range []int{selfPrefix - 1, selfPrefix, selfPrefix …

鸿蒙原生应用开发元服务 元服务是什么?和App的关系?(保姆级步骤)

元服务是什么?和App的关系? 元服务是是一种HarmonyOS轻量应用形态,用户无需安装即可使用,具备随处可及、服务直达、自由流转的特征。 元服务是可以独立部署和运行的程序实体,独立于应用,不依赖应用可独立…

【第二课】Rust变量与数据类型(一)

目录 前言 变量绑定 变量遮蔽 常量 基本数据类型 复合数据类型 (1)元组类型 (2)数组类型 (3)结构体类型 (4)枚举类型 总结 前言 上一课是rust的入门第一课,介…

Exadata: 将数据库硬件和软件设计在一起

Engineering Database Hardware and Software Together,是Juan Loaiza在2015 VLDB大会上的Keynotes。虽然是10年前的文章,但其中一些要点一直延续至今,并未改变。 本文将讲解Keynotes摘要和演讲中的要点。 摘要 其中的一些观点&#xff1a…

Redis知识点整理 - 脑图

自己整理的"Redis脑图"是一份详细的知识图谱,涵盖了Redis的核心内容,包括数据类型、基本操作、高级特性和优化技巧等。适用于Redis初学者和有经验的开发者,帮助系统地学习和回顾Redis的相关知识。通过这份脑图,可以对Re…

Windows配置域名映射IP

一、找到 hosts 文件 打开 C:\Windows\System32\drivers\etc 二、添加hosts文件修改、写入权限 右击hosts文件,点击属性 -> 安全 -> Users -> 编辑 -> Users -> 添加修改、写入权限 -> 确定 -> 确定 进入常规,将只读属性关闭 三、…

Ubuntu20.04 解决一段时间后键盘卡死的问题 ubuntu

Ubuntu20.04 解决一段时间后键盘卡死的问题 在Ubuntu 20.04中为脚本文件(如 .sh 文件)创建桌面快捷方式,可以通过编辑 .desktop 文件来实现。这种快捷方式可以提供一种方便的方法来执行脚本,如重启 IBus 服务,这对于解…

第 20 章 - Golang 网络编程

下面将详细介绍Go语言中的网络编程,包括TCP编程、UDP编程和HTTP服务器的创建。为了更好地理解这些概念,我将提供一些简单的示例代码来说明每个部分。 1. TCP 编程 TCP(传输控制协议)是一种面向连接的协议,它确保数据…

173. 二叉搜索树迭代器【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 173. 二叉搜索树迭代器 一、题目描述 实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterato…

XXL JOB DockerCompose部署

官网给的方式是 Docker 命令启动,但是用起来太麻烦了,所以用DockerCompose 简化部署 创建数据库,导入 SQL SQL 脚本位置为/xxl-job/doc/db/tables_xxl_job.sql https://raw.githubusercontent.com/xuxueli/xxl-job/refs/heads/master/doc/…

【原创】如何备份和还原Ubuntu系统,非常详细!!

前言 我在虚拟机装了一个xfce4的Ubuntu桌面版,外加输入法、IDEA等,我想将这个虚拟机里的系统直接搬到物理机中,那我可以省的再重新装一遍、配置xfce4桌面、修改一堆快捷键还有配置idea了,那直接说干就干。 本教程基于Ubuntu24.0…

HTTP 安全头配置:如何配置 HTTP 安全头来保护应用

文章目录 前言一、常用的 HTTP 安全头1.1 Strict-Transport-Security (HSTS)1.2 Content-Security-Policy (CSP)1.3 X-Frame-Options (XFO)1.4 X-Content-Type-Options1.5 X-XSS-Protection1.6 Referrer-Policy1.7 Feature-Policy 二、实践案例2.1 项目结构2.2 客户端代码2.3 服…