当前位置: 首页 > article >正文

网络基础设施 拥塞控制

我经常说,传统的 TCP 优化已经到顶,不会有大意义了,这有两方面意思。

一方面,内在的,TCP 的 ACK 时钟带回的信息就那么多,用足了又能怎样。一个学习最差的差生能控制的分数是是 0~100 分的区间,宽度足足 100 分,他控制不了自己能考多少分,而一个学习最好的学生能控制的分数则是任意值,宽度为 0 分!

另一方面,按照 TCP/IP or OSI 分层模型,任何上层的机制都是在弥补下层的缺陷。比如传输层需要重传,因为下层链路不可靠,那么如果下层链路保证可靠了,上层的可靠传输机制是不是就没用了呢?答案是肯定的。

假设物理层有了极大突破,实现了无限带宽,还需要拥塞控制吗?

Linux 内核的 task 调度算法可能就是来源于 CPU 核少 task 多的环境。几千个 task 排队,肯定要精致化排队体验。但如果有几千个 CPU 核,每个核只有几个 task 排队,要需要精致化排队体验吗?随便排就好了嘛!

所有花哨的算法,都源于资源不足,不得已需要权衡取舍。一种资源调度算法,要保证相对公平,所谓不患寡而患不均,但问题恰恰就是寡,资源要是丰盈,就不需要这些算法了。简单的日常例子,高速公路上没有红绿灯。因为不需要调度,道路立交,资源丰盈,各行不悖。

有意义的事在传输层之外。

全局意识下,不能指望传输层可以解决所有问题。以 incast 流量为例,无论任何传输层方案,包括 Homa,SRD 在内,都只是 workaround,需要从物理拓扑上着手才能解决根本问题。

比如 MapReduce,它本身就是一个以服务器为中心的星型逻辑,而服务器还单独挂在胖树上,不 incast 才怪,最后一跳 TOR 往往最容易拥塞。各种大成本投入在传输协议研发以及交换机 PFC 上却始终解决不了问题。其实只要改变拓扑即可:
在这里插入图片描述

将交换机为中心的视角改为服务器为中心就豁然开朗了,服务器星型拓扑是天然的 MapReduce,多连了几根线而已,总不能空手套白狼。

剩下的事情逐层自下而上,网络层需要支持多路径。IP 路由规划与宣告是个细活儿,这里不谈,但仔细想想 IP 理由到底还适合不适合,就发现这里还是有问题。IP 天然就不适合 MapReduce。

数据中心网络需要 IP 做隔离,但 MapReduce 却明明不需要隔离,相反,如果有一个广播发送,单播回复的协议就好了。

总之,单纯从传输层解决不了的问题,如果可以着手从物理层做出改变,那么完整的方案又何止一个。点对点拓扑一直被认为是不合理的,但三层架构树就一定正确吗?

有一个其它领域的例子,Intel CPU 的 FSB(前端总线) 速率一直在提升,可终究有问题解决不了,最终发现本质问题就是 FSB 自身,于是干掉它就好了。Intel FSB 的问题是一个与 incast 问题非常类似的例子,十几年前我看 AMD 发布的 CPU 架构时,发现它们 “一点都不美”,布线引脚乱七八糟,没有 FSB 将大家汇聚在一起进入 CPU,然而优美并不意味着正确。大多数时候,优美的架构源自于资源紧缺,“如果空间有的是,谁还会去整理物品,只有狭小的空间才需要灵巧的收纳。”

为了解决 incast,应用层方案,传输层方案都有,就是没有物理层方案,可物理拓扑的限制才是问题的根本。条件允许时,浪费并不可耻,明明连几根线就能解决的问题,非要执念于一个根本不存在的完美传输协议,岂不悲哀。

再看回传输本身。

MapReduce 除了可作为编程范式之外,它竟然可以作为一种非常自然的方式解释传输的本质。传输的目标是在 receiver 还原 sender 的数据,传输的过程就是 map,而 receiver 交付数据的过程则是 reduce,非常自然的一种多路径乱序传输的范式。类似多台服务器一起提供一个文件的不同片段的 map 过程最终汇总成一个完整文件的 reduce,多条链路可以同时传输一条流 or 一则消息的不同片段最终在 receiver 汇总成原始数据流 or 消息,这就是传输的过程,我们发现它不仅仅是一个传输协议,而是包含从物理拓扑到应用语义的全部。

当然,基于最优路径的逐跳 IP 路由已经 40 多年了,显然,它并不 match 上述 MapReduce 的意思。但我们必须明白,物理基础设施并不是一成不变的,在需要的时候,它们必须 “有能力被改进”,并且,我们也不能总盯着几个传输协议,现在越来越多的方向都在模糊分层模型的各层,应用层可以自己控制 pacing rate,物理层也可以。

传统网络以交换机为中心,意在巩固利好上层,如果以服务器为中心,则巩固利好底层,很多问题都将解决。多对多,人人为我,我为人人,自服务器为中心的交叉。这是一个在来温州的

路上想到的一个问题,写篇文字以记录。


http://www.kler.cn/a/17344.html

相关文章:

  • 微服务day07
  • 040 线程池
  • Mit6.S081-实验环境搭建
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十三:将AVFrame转换成AVPacket。视频编码原理.编码相关api
  • Linux设置Nginx开机启动
  • Unity资源打包Addressable资源保存在项目中
  • 基于JavaWeb实现的寻码网文章资讯管理系统
  • 动态页面配置
  • 我有一个方法判断你有没有编程天赋
  • ElasticSearch学习随笔之分词算法
  • 第17章 信息系统安全管理
  • IAST工具是如何工作的?主动和被动IAST有什么区别?
  • 信号完整性分析基础知识之传输线和反射(三):仿真和测试反射波形
  • 开放式基金净值估算数据 API 数据接口
  • 编写服务器重启的脚本(rc.local调用版本)
  • 基于GWO灰狼优化算法的城市路径优化问题GWO-TSP(MATLAB程序)
  • 操作系统——线程调度
  • SpringBoot整合Mybatis-Plus、Jwt实现登录token设置
  • Java回收垃圾的基本过程与常用算法
  • 面试总结,4年经验
  • python语法入门到面向过程编程(二)
  • 类与对象之构造函数
  • SPSS如何进行基本统计分析之案例实训?
  • 什么是工业互联网?5G到底能在工业互联网中承担哪些重任呢?
  • Java实现添加文字水印、图片水印功能
  • java基础知识——27.动态代理