从 Tesla 的 TTPoE 看资源和算法

news2024/9/25 6:21:27

特斯拉的 ttpoe 出来有一段时间了,不出所料网上一如既往的一堆 pr 文,大多转译自 演讲 ppt 和 Replacing TCP for Low Latency Applications,看了不下 20 篇中文介绍,基本都是上面这篇文章里的内容,车轱辘话颠来倒去。

我也大致看了一下 ttpoe 在 github 上的代码和 spec,好家伙,真是大道至简(仅 17 页 spec,每页大量留白)。抛开商业相关的不谈,仅从传输优化的视角,本文谈点方法论。

说起传输,要分场景,一般我会区分数据中心和广域网,我早说过,数据中心不是互联网,广域网才是,怎么看这个说法呢?

数据中心看 pcie,它是主机的延展,需高速 link 连接不同组件,而广域网看 tcp/ip,它是独立的主机分布式通信。拿一把尺子量一量,长管道和短管道哪个增加截面收益更大且工作量更小,高下立判。

因此,数据中心重资源,广域网重算法。资源和算法,又是辩证的两面。

从性能优化看,协议和算法决定了资源利用率,兜住性能的下限,而资源本身才决定性能上限。换句话说,协议和算法让性能不至于太难看,而优化则需要增加资源。

“道生之,德畜之,物形之,势成之”,这是《道德经》里的话,以 tcp 为例,rfc793 谓之 “道”,sack/wscale/ts/reno/cubic/vegas/bbr 谓之 “德”,运行在某台主机上的 tcp 连接实例谓之 “物”,而带宽,光纤,路由器,交换机,供电设备,机房环境谓之 “势”,大概就是这个意思。

具体而言,想优化性能,需要的是 “势”,即资源。

而 “势” 和 “德” 又相互作用,在一个高尚的环境,人们便不需要过度宣扬德行,同样,在一个带宽资源足够丰盈的传输环境,传输算法就可以相对激进而不必过度谨慎。

带宽足够大时,传输算法就可以相对激进,比如可以使用 gbn 来恢复丢包而不必担心会浪费带宽,首先带宽是充足的,其次,带宽充足时丢包是罕见的,因此经得起 gbn 的少量浪费。一个反例,pfc 则是希望在一个资源一般的场景用算法构建一个无损网络,显然就是错误的做法了。

再联系 sack,早期 tcp rfc 793 满足了基本的可靠传输,但在一个资源简陋的高丢包环境 gbn 显得很不节约,于是 sack 避免了本就不丰富的带宽浪费,但如果一个网络好到丢包率小于 0.01%(约数) 时,sack 就没必要了。

ttpoe 所谓大道至简就是遵循了重资源轻算法之道,因为它是跑在好网络上的。ttpoe 的逻辑非常粗暴有效,看 receiver 如何处理:

/*
 * Per TTP_Opcode spec:-
 * [OPEN] / [CLOSE_SENT] / [CLOSE_RECD]
 *      TTP_ACK         TxID <= local RxID
 *      TTP_NACK        TxID >  local RxID
 *      TTP_NACK_FULL   local is temporarily full
 * [CLOSE_SENT] / [CLOSE_RECD]
 *      TTP_NACK_NOLINK TxID >  local closing ID <-- ** NOT IMPLEMENTED YET **
 */

通过引入 nack operater,sender 就简化了:
在这里插入图片描述

nack 直接取消了 sender 所有预判逻辑,让一切启发式算法再无必要。按常规 tcp 早期逻辑,需等 3 个 dupack 触发重传以适应 reorder,后又用 rack 取而代之,不管怎样,预判的代价是时间。而 ttpoe 明确回复 nack,这部分时间节省了下来,代价转移到了 nack 误判后的不必要重传,辩证正在此处展现。

前面提到 tcp 之所以采用启发式预判,并采用一切手段追求预判精度,原因就是带宽匮乏,就是要节约,因此必须谨慎。而 ttpoe 的假设是它运行在足够好的网络上,丢包是小概率事件,一旦丢包,用积极激进的方式快速应对,而代价的交换方正是充裕的带宽。

这里不得不提到的是 ttpoe 的 packet retired 特性,让人联想到处理器的 instruction retired,大意是,处理器利用当前空闲的计算单元,提前将多个分支数据准备好,不管最终逻辑进入哪个分支,都可以直接使用。这意味着有大量指令是白白执行的,但 instruction retired 却作为一个特性而不是一个 bug 被广为人知。ttpoe 的 retired 特性非常类似。

当 sender 收到 ack/nack 时,ack 指示 dealloc,nack 指示重传,sender 可以任意方式调度 send-buffer(类似处理器 instruction-buffer) 发送,大不了就是在高带宽下微不足道的不必要传输,但收益肯定是低时延。

在上述前提下,用固定 buffer-size 做 cwnd 就顺理成章了,因为实属无必要动态计算 cwnd 引入复杂性,问题是十有八九还算不对。整个 tx buffer 固定,ack 一个 free 掉一个方可进入一个,维持持续滑动,而 win-stall 是很难的,因为丢包概率低,万一丢包,重传非常激进。

延展几个 argue 的点:

  • 固定 cwnd 试过,效果不好:不是固定 cwnd 这个做法不好,是你的带宽不够大,数据流不够规则;
  • ttpoe 在复杂的网络环境无法自适应:ttpoe 不是在动态网络环境中用的,不要指望它用于无线环境;
  • ttpoe 不就是 udp 吗?:udp 还要 ack/nack 干嘛?另,ttpoe 无 ip 直接跑在以太网(oe),协议号 0x9ac6;
  • ttpoe 高带宽,低时延:没有任何协议可以用资源的属性特征来描述,凡是标榜于此的都有 pr 嫌疑;
  • ttpoe 低时延来自于硬件实现:硬件省不了大头,低时延来自于它的部署环境足够好,它省了很多烦恼;
  • 这高档鞋子能跑步吗?:皮鞋不能跑步,再贵也不能。

从 srd,homa,falcon,… 一直到 ttpoe,它们 ppt 的前几页无一例外都在喷 tcp,旨在 replace tcp in datacenter,人们也人云亦云,这些车轱辘话听到耳根发麻,直到最近理解 tcp 为什么那么不堪的人依然很少。

tcp 的不堪祸首在于资源不足,其次才是它的实现复杂,而它的实现复杂又来自于它本就是应对资源不足的环境。但 tcp 的自适应力极强,放在 100gbps 的网络,它真就能跑到接近 90gbps,想想看 tcp 是携带那么多好网络根本用不到的应对坏网络的特性大负重跑到接近 90gbps,这个情况下不是要重复造轮子取代它,而是为 tcp 减负,做减法。

好网络下的 tcp 卸载掉谨慎的特性便不再需要复杂的实现,唯一的不堪也不复存在。撤掉 sack 换 gbn,撤掉重传触发启发换 nack,简化 cc,大概就是 ttpoe 了。

至简之道就是做减法,因为只有减到不可再减,才能重新再做加法。回头看主机总线,优化方向一直是加频率,加 lane,加并行度,无止境增加传输带宽,而不是依靠精巧的算法,因为它有个可以 “二生三” 的极简核,才能彼此互联而不会把自己绕死。世界的另一面,广域网,它也有一个 “二生三” 的极简核,IP 协议,主机传输层只能采用端到端算法才不至于污染这个极简核,然后三生万物。

“道生一,一生二”,数据中心和广域网各有不同,被大道统一于至简,在各自方向 “二生三,三生万物”。

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

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

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

相关文章

Python网络爬虫获取Wallhaven壁纸图片(源码)

** 话不多说&#xff0c;直接附源码&#xff0c;可运行&#xff01; ** import requests from lxml import etree from fake_useragent import UserAgent import timeclass wallhaven(object):def __init__(self):# yellow# self.url "https://wallhaven.cc/search?co…

【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路

文章目录 C string 类的模拟实现&#xff1a;从构造到高级操作前言第一章&#xff1a;为什么要手写 C string 类&#xff1f;1.1 理由与价值 第二章&#xff1a;实现一个简单的 string 类2.1 基本构造与析构2.1.1 示例代码&#xff1a;基础的 string 类实现2.1.2 解读代码 2.2 …

电池快充协议芯片

1&#xff1a;18650充电快充规则 电池知识 | 东莞市恒帝电子科技有限公司 (heldee.com) 锂电池快速充电知识【钜大锂电】 (juda.cn)18 锂电池和18650锂电池能不能快速充电&#xff0c;四种充电方式讲解 | 东莞市恒帝电子科技有限公司 (heldee.com) 2&#xff1a;国产厂家 …

数据库课程 CMU15-445 2023 Fall Project-2 Extendible Hash Index

0 实验结果 tips:完成项目的前提不需要一定看视频 1 数据结构&#xff1a;扩展哈希 解释下这张图&#xff1a; 图中header的最大深度2&#xff0c;directory最大深度2&#xff0c;桶的容量2。 最开始的时候只有一个header。 插入第一个数据&#xff0c;假设这个数据对应的哈希…

安谋科技发布全新自研“玲珑”多媒体处理器

当前&#xff0c;受视频直播、AR/VR、智驾智舱等新兴应用场景和使用人群的飞速增长&#xff0c;视频编解码及显示处理领域呈现出旺盛需求&#xff0c;进而带动了下游设备数量不断攀升。以智能汽车为例&#xff0c;根据盖世汽车研究院的产业报告显示&#xff0c;预计2025年国内车…

【GeekBand】C++设计模式笔记4_Strategy_策略模式

1. “组件协作”模式 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”&#xff0c;“组件协作”模式通过晚期绑定&#xff0c;来实现框架与应用程序之间的松耦合&#xff0c;是二者之间协作时常用的模式。典型模式 Template MethodStrategyObserver / Event 2.…

如何确定SAP 某些凭证或者单号的号码编码范围的 OBJECT 是什么?

在SAP的运维或者项目实施中&#xff0c;有时会如何确定SAP 某些凭证或者单号的号码 OBJECT 是什么&#xff1f; 一般一下常用的可以通过事务代码 例如&#xff1a; XDN1 Create Number Ranges for Customer Accounts&#xff0c;定义客户编码FBN1查看维护会计凭证号范围 我…

【项目】多设计模式下的同步异步日志系统

文章目录 项目介绍开发环境核心技术日志系统介绍为什么需要日志系统日志系统技术实现同步写日志异步写日志 相关技术知识补充不定参函数不定参宏函数的使用C中不定参函数的使用C中不定参函数的使用 设计模式单例模式工厂模式建造者模式代理模式 日志系统框架设计模块划分日志等…

springboot+阿里云物联网教程

需求背景 最近有一个项目,需要用到阿里云物联网,不是MQ。发现使用原来EMQX的代码去连接阿里云MQTT直接报错,试了很多种方案都不行。最终还是把错误分析和教程都整理一下。 需要注意的是,阿里云物联网平台和MQ不一样。方向别走偏了。 概念描述 EMQX和阿里云MQTT有什么区别…

springboot整合openfeign

文章目录 准备一、引入必要依赖二、写一个feign client并暴露到注册中心2.1 client2.2 开启Feign客户端功能 三、别的服务引入IProductClient并调用方法3.1 建一个order-service&#xff0c;引入IProductClient所在模块3.2 注入IProductClient&#xff0c;并调用方法 四、启动服…

Github优质项目推荐-第一期

文章目录 Github优质项目推荐一、【free-for-dev】&#xff0c;88.4k stars二、【linux-command】&#xff0c;31.5k stars三、【system-design-primer】&#xff0c;270k stars四、【GitHub-Chinese-Top-Charts】&#xff0c;99.1k stars五、【Docker-OSX】&#xff0c;46k st…

分布式计算框架

进入Scala模式 终端里输入Scala 创建一个新的Scala文件 vim 文件名.scala 复制粘贴代码 ctrlshift c/v 使用vim 先进入插入模式&#xff0c;可以通过按i键来实现&#xff0c;然后粘贴代码&#xff0c;完成后按Esc键退出插入模式&#xff0c;保存并退出可以通过输入:wq然后按…

HarmonyOS开发之利用TextPicker实现日期选择框只有【年】

效果图&#xff1a; 一&#xff1a;实现年份数组 function generateYearArray(startYear, endYear) {const yearArray [];for (let year startYear; year < endYear; year) {yearArray.push(year年);}return yearArray; } 二&#xff0c;设置年份区间&#xff08;1995,2…

每日论文2——用于锁相环应用的0.025%直流电流失配电荷泵

《A 0.025% DC Current Mismatch Charge Pump for PLL Applications 》2021 IEEE International Midwest Symposium on Circuits and Systems (MWSCAS) The Key Lab of micro-nano electronics and system integration of Xian city, Xian 本文结构主要不同是仅用了一个OPA&…

JAVA并发编程系列(11)线程池底层原理架构剖析

面试官&#xff1a;说说JAVA线程池的几个核心参数&#xff1f; 之前我们用了10篇文章详细剖析了synchronized、volatile、CAS、AQS、ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier、并发锁、Condition等各个核心基础原理&#xff0c;今天开始我们说说并发领域的各种…

基于单片机的精确电压表DA-AD转换

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DAC0832和ADC0832检测电压&#xff0c;0到8.5V&#xff0c;设计复位电路 LED管显示实际稳压值&#xff0c;初始电压0 二、硬件资源 基于KEIL5编写C代码&#xff0c…

《MATLAB项目实战》,专栏目录和介绍

文章目录 前言专栏介绍&#x1f393;一、 项目实战篇和GUI界面篇&#x1f393;二、 项目基础篇总结 前言 MATLAB 是一款强大且广泛应用的数值计算和数据可视化软件工具&#xff0c;它提供了一个高效、简洁的编程环境&#xff0c;使用户能够进行从简单的矩阵运算到复杂的多维数…

QT+ESP8266+STM32项目构建三部曲二--阿里云云端处理之云产品流转

一、创建一个新的产品 创建两个设备&#xff1a;一个用于stm32端连接并动态上传数据&#xff0c;一个用于上位机端订阅获取数据 添加功能&#xff0c;也就是物模型的的标签&#xff0c;这里根据自己在设计过程中需要的标签&#xff0c;自由设计 我这里定义了两个不同数据类型…

HBase DDL操作代码汇总(namespace+table CRUD操作)

HBase DDL操作 DDL操作主要是关于命名空间和表格的内容增删改查。 注&#xff1a;如果出现无法连接到zookeeper等的相关错误&#xff0c;可以将以下代码打jar包&#xff0c;在HMaster节点上执行 错误提示&#xff1a; Exception in thread “main” java.net.SocketTimeoutExc…