cubic 相比 bbr 并非很糟糕

迷信 bbr 的人是被它的大吞吐所迷惑,我也不想再解释,但我得反过来说一下 cubic 并非那么糟。
想搞大吞吐的,看看我这个 pixie 算法:https://github.com/marywangran/pixie,就着它的思路改就是了。

cubic 属于 aimd-based 算法,以 aimd 描述全程。以下是一个参数为 1,0.5 的 aimd 过程 tcptrace 图,md 采用 prr 过程:
在这里插入图片描述
prr 降窗细节请参考:数据包守恒

简单的一个 cubic 优化请参考:cubic 与随机丢包

cubic 公平性不必说,但它吞吐低的原因也明确,图中 XXX 区域太大了。追查 XXX 太大的原因有二,rtt 越大,XXX 越宽,丢包越多, XXX 越深,越深的区域肯定越宽(长肥管道),但越宽却不一定越深(小带宽场景)。若要优化 cubic,目标也明确,减小 XXX。

rtt 无法改变,XXX 区域多由丢包决定,而丢包分为随机丢包和拥塞丢包。拥塞丢包情况下,执行 md 是 aimd 算法核心,所以不要试图通过 “不 md 降窗(换成 ad 降窗?)” 来优化吞吐,另一方面,丢包恢复后,cwnd 起点低,不要试图加速 ai 过程来优化吞吐,因为这同样破坏了 aimd 内核。 若在 aimd 框架下优化,可参考 tcp scalable 的思路。

常说的 aimd-based 算法吞吐低的原因就是 “cwnd 下降后,恢复太慢,在长肥管道尤为严重”,而似乎又什么都做不了,这是 ack 自时钟(self-clock)驱动的传输协议内在性质决定的。

但有个事可做,即隔离随机丢包。这可是个顽固难题,只有 ack 序列,信息量有限,所以不要试图折腾复杂的启发预测算法,写论文可以,实践肯定失败,要做的是引入一个非常简单的自适应机制。

相比 rfc3517 和 rate halving,tcp undo 和 prr 结合已覆盖误判,prr 让 cwnd 慢慢下降而不是一下子下降,过程中如果误判,cwnd 直接 restore。但如果随机丢包,哪怕重传一个报文,也无法 undo,任凭 cwnd 降到 ssthresh 再重新 additive increase,此时展出来的 XXX 宽度至少 2 个 rtt,rtt 越大,情况越糟。

如果只是随机丢包,噩梦将在 prr 过程中开始,在 cwnd 达到 ssthresh 时结束,在漫长的 additive increase 中惊魂未定。

对 prr 做一番修改是高尚的,尽量截止住微弱丢包对 cwnd 的影响,但在丢包加剧时迷途知返而不是一意孤行。文章开头提到链接里 “让 cwnd 先慢后快收敛到 ssthresh” 是个主意,但还有更简单的,即 “只有在有‘足够’报文被 mark lost 时才执行 prr”。

如果只 mark lost 了一个报文,prr 只将 cwnd 拉低一点点,如果继续 mark lost,则继续 prr 降 cwnd,这样就将丢包数量和丢包频度和 prr 过程关联起来,至于 ‘足够’ 是多少,调参。

另一个高尚的修改有关 undo。采集丢包时的 srtt,若 srtt 方差 ‘足够小’,绝对值与 open 状态相比 ‘足够小’,即可直接 undo,而不是缓慢 additive increase,至于 “足够小” 是多小,调参。

看图,虚划线是原始的,粗实线是改后的:
在这里插入图片描述
总结:

  • 用丢包过程(数量和频度)驱动 prr 过程;
  • 结合丢包时 srtt 决定恢复后是否 undo。

PS:你要把 bbr 的缺陷全克服了,它的吞吐就会变的和 cubic 差不多,最多只是 bugfix 级提升,且 bbr 已经这么做了,参考 bbr3。怎么会这样?因为 tcp ack 只带回那么些信息,信息量作用力有上限。带宽 x 的链路,必须用掉至少 a% 带宽作为代价做拥塞控制,有效吞吐最多 x - xa%,不要指望 a 能足够小,它其实是个确定数值,要做的是逼近 x - xa%,而不是 x。bbr 想多了。

但也不针对 bbr,所有 tcp 拥塞控制算法优化到极致后都存在不太高的上限,但它们的下限又足够低,所以提供了足够的岗位供我们瞎折腾,我们对此表示感谢🙏 。

如果你想提高上限,就要减小 a,但 a 是针对 tcp 的,所以,若要提高上限,必须往协议头里加东西,至于下限,无底线,有空比试比试看谁的吞吐低,但稳定。这并不是一件简单事,考 99 分很难,但不多也不少考 9 分也不容易。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++ STL 之栈—— stack 详解

vector 是 stl 的一个关联容器,名叫“栈”,何为“栈”?其实就是一个数组,但有了数组何必还需栈,这是一个高深的问题。 一、简介 1. 定义 栈,是一个柔性数组(可变长数组),可以变大变小…

【qt】纯代码界面设计

界面设计目录 一.界面设计的三种方式1.使用界面设计器2.纯代码界面设计3.混合界面设计 二.纯代码进行界面设计1.代码界面设计的总思路2.创建项目3.设计草图4.添加组件指针5.初始化组件指针6.添加组件到窗口①水平布局②垂直布局③细节点 7.定义槽函数8.初始化信号槽9.实现槽函数…

最新!TOP200高校!5月ESI排名,公布!

【SciencePub学术】5月9日,ESI数据库更新了2024年5月最新ESI数据。据统计,全球共有9019家科研机构上榜,其中有449所中国内地高校。 ESI(基本科学指标数据库)是目前世界范围内普遍用以评价高校、学术机构、国家或地区国…

JavaScript 动态网页实例 —— 事件处理应用

前言 事件处理的应用很广泛。在事件处理的应用中,鼠标事件的应用是最常用到的。本章给出几个鼠标事件处理应用的示例,包括:页面预览、图像切换、点亮文本、鼠标跟随、鼠标感应和禁用鼠标按键。在这些示例中,有的可以直接拿来应用,有的则只提供了一种应用的方法,稍加拓展,…

深入解析RedisSearch:全文搜索的新维度

码到三十五 : 个人主页 在当今的数据时代,信息的检索与快速定位变得尤为关键。Redis,作为一个高性能的内存数据库,已经在缓存和消息系统中占据了重要地位。然而,Redis并不直接支持复杂的搜索功能。为了填补这一空白&am…

QT7_视频知识点笔记_3_自定义控件,事件处理器⭐,定时器,QPainter,绘图设备,不规则窗口

第三天: 自定义控件,事件处理器⭐,定时器,QPainter,绘图设备,不规则窗口实现 1.自定义控件: 创建新的QT控件类,然后再需要使用的地方--》提升为 来使用如何使用基础控件的信号和槽函数&…

Flutter-Statewidget 创建State过程State<XXXX> createState() => _XXXXState()的解释

文章目录 创建widget 的状态对象示例代码解析 完整的代码示例总结 创建widget 的状态对象 今天有个同学问了我下State createState() > _XXXXState()时什么意思。这个代码在flutter开发中一直看到,很多人都不关心这个,直接当模板使用。今天来介绍下这…

Python中tkinter编程入门3

在使用tkinter创建了窗口之后,可以将一些控件“放置”到窗口中。这些控件包括标签、按键以及输入框等。 1 在窗口中“放置”标签 在窗口中“放置”标签主要有两个步骤,一是创建标签控件,二是将创建好的标签“放置”到窗口上。 1.1 创建标签…

Maven- Profile详解

前言 Profile能让你为一个特殊的环境自定义一个特殊的构建&#xff1b;profile使得不同环境间构建的可移植性成为可能。 <project><profiles><profile><build><defaultGoal>...</defaultGoal><finalName>...</finalName><…

通过自建镜像方式搭建RabbitMQ集群

通过自建镜像方式搭建RabbitMQ集群 1. 应用准备1.1 应用目录结构1.2 配置文件1.2.1 .erlang.cookie1.2.2 hosts1.2.3 rabbitmq.conf1.2.4 rabbitmq-env.conf 2. 编写DockerFile2.1 将所有本地文件拷贝到工作目录2.2 拷贝文件到源目录&增加执行权限2.3 安装Erlang & rab…

WAAP全站防护理念,发现和保护敏感数据

数据是现代企业的新石油&#xff1a;正确使用它可以促进公司的发展并帮助企业在竞争中领先。就像石油一样&#xff0c;原始数据和未被发现的数据是毫无用处的&#xff0c;企业将无法从中受益&#xff1b;在最坏的情况下&#xff0c;它可能会导致安全事件。这也是企业投资敏感数…

Python | Leetcode Python题解之第75题颜色分类

题目&#xff1a; 题解&#xff1a; class Solution:def sortColors(self, nums: List[int]) -> None:n len(nums)p0, p2 0, n - 1i 0while i < p2:while i < p2 and nums[i] 2:nums[i], nums[p2] nums[p2], nums[i]p2 - 1if nums[i] 0:nums[i], nums[p0] num…

R语言数据探索与分析-碳排放分析预测

# 安装和加载需要的包 install.packages("readxl") install.packages("forecast") install.packages("ggplot2") library(readxl) library(forecast) library(ggplot2)# 数据加载和预处理 data <- read_excel("全年数据.xlsx") co…

全新神经网络架构KAN——本文用于学习与探索

论文地址&#xff1a;https://arxiv.org/pdf/2404.19756 Github&#xff1a;GitHub - KindXiaoming/pykan: Kolmogorov Arnold Networks 文档说明&#xff1a;Welcome to Kolmogorov Arnold Network (KAN) documentation! — Kolmogorov Arnold Network documentation 本文仅…

A计算机上的程序与B计算机上部署的vmware上的虚拟机的程序通讯 如何配置?

环境&#xff1a; 在A计算机上运行着Debian11.3 Linux操作系统&#xff1b;在B计算机上运行着Windows10操作系统&#xff0c;并且安装了VMware软件&#xff0c;然后在VMware上创建了虚拟机C并安装了CentOS 6操作系统 需求&#xff1a; 现在A计算机上的程序需要同虚拟机C上的软…

【RAG 论文】Contriever:对比学习来无监督训练文本嵌入模型

论文&#xff1a;Unsupervised Dense Information Retrieval with Contrastive Learning ⭐⭐⭐⭐⭐ Facebook Research, arXiv:2112.09118 Code&#xff1a;github.com/facebookresearch/contriever 一、论文速读 本文使用对比学习的方法来对文本检索模型做无监督学习训练&am…

MySQL-索引篇

文章目录 什么是索引&#xff1f;索引的优缺点索引底层数据结构选型Hash表二叉查找树AVL树红黑树B树&B树 索引类型总结主键索引二级索引聚集索引与非聚集索引聚集索引非聚集索引 覆盖索引与关联索引覆盖索引联合查询最左前缀匹配原则 索引下推如何正确使用索引选择合适的字…

信息检索(35):LEXMAE: LEXICON-BOTTLENECKED PRETRAINING FOR LARGE-SCALE RETRIEVAL

LEXMAE: LEXICON-BOTTLENECKED PRETRAINING FOR LARGE-SCALE RETRIEVAL 标题摘要1 引言2 相关工作3 LEXMAE&#xff1a;词典瓶颈屏蔽自动编码器3.1 语言建模编码器3.2 词典瓶颈模块3.3 弱化掩蔽式解码器3.4 词汇加权检索器的预训练目标和微调 4 实验4.1 主要评估4.2 效率分析与…

「云渲染教程」3D渲染时GPU内存不足怎么解决?

在进行三维场景渲染时&#xff0c;如果遇到模型较为复杂&#xff0c;用户们可能会面临图形处理单元&#xff08;GPU&#xff09;内存不足的挑战。这种情况通常意味着现有的硬件配置不足以满足渲染任务的需求。为了缓解GPU的工作压力&#xff0c;可以采取一些策略来优化资源的分…

如何使用联合体判断一个机器是大端还是小端

如何使用联合体判断一个机器是大端还是小端 #include<iostream> using namespace std; union Checker//联合体中的数据共享内存 {int val;char ch[2]; }; int main() {Checker checker;checker.val 0x1234;if (checker.ch[0] 0x34)//数组中的数据是由低地址往高地址存放…