鉴赏 tcp vegas

news2024/11/16 17:58:30

优秀的 vegas 之后,再鉴赏一下迄今唯一像那么回事的拥塞控制算法 vegas。

从下图可看出所有的(对,所有的) aimd 都毫无伸缩性(z:吞吐,x:rtt,y:丢包率,由 buffer_size 直接决定):
在这里插入图片描述

一下就可看出 rtt 和 buffer 主宰了效率,所有的 aimd 定制算法都在调节 alpha 拧巴这两者,比如照顾大 rtt 或浅 buffer,本质上就是在调整 ai 和 md 的系数,最终调整 alpha 展开成别的算法,cubic,scalable,htcp 等无不如此。

aimd 是个非常公平的控制算法,但它对于拥塞控制确实也只是公平收敛的意义,它甚至不控制拥塞,相反,对于大多数 aimd 实例,比如 reno,cubic,它控制拥塞的手段是制造拥塞。

vegas 直接控制拥塞,而不搞别的那些复杂玩意儿。vegas 监控两个变量:

  • expected = delivered / basertt,以全局最小 basertt 追踪,它表示无拥塞吞吐。
  • actual = delivered / lastrtt,实测吞吐。

expected - actual 自然就是实测吞吐和期望吞吐的差异,拥塞控制的目标就是追平这个差异,不同的追平方案就是不同的拥塞控制算法。vegas 的方法既有效又巧妙。

vegas 定义 diff = (expected - actual) * basertt,很显然,它的意思是实际和预期的报文数量。如果实际和预期有差异,多出来的报文一定在 buffer 中,巧妙之处在于:

  • diff < beta 避免了拥塞。
  • diff > alpha 兼备了探测。
  • alpha,beta 只和 basertt 和 lastrtt 比例有关,公平收敛。

观察 diff < beta,其中 diff 具有全局意义,vegas 巧妙地将全局的 queuing 时间转换成单独流 actual 的下降,而 actual 下降本就由全局拥塞导致。

actual 下降由两种原因导致,自己造成或它者造成,要么由于自己 cwnd 冲高导致 expected 过高而显得 actual 相对下降,这种情况下 cwnd 需要降低,要么由于有其它流量侵入导致带宽被分享,这种情况下 cwnd 降低体现收敛,无论哪种情况都避免了拥塞。

diff 计算出来的是全局的 buffer 占率,而不是单独一条流的,vegas 所有计算都在全局意义上进行:
在这里插入图片描述
所以,vegas 的公平收敛非常完美:
在这里插入图片描述

再看 diff > alpha,它确保 buffer 中始终有一些报文以及时感知带宽变化。bbr 操作点选在 rtt,带宽正交点实际上是个错误,完全清空 buffer,如果有流量退出,bbr 不得不采用定时 probe 的方式发现新带宽,而 vegas 则能自动发现。alpha 越大,其探测性越强,但代价是 queuing 时间,这正解释了 bbr 论文中 rtt 和带宽的正交性导致的测不准原理。

干嘛不松弛一下,索性利用这个测不准呢。

有趣的是,vegas 没被推广正是因为 “不公平”,vegas 面对 aimd 流排队会不断退让。然而除了实验室数据理论分析,没有任何成规模的现网数据佐证它。全局统计意义上,只要 aimd 流足够多(足够异步),虽然每一条流都经历锯齿起伏,但整体队列长度是稳定的,这意味着 vegas 调整好 alpha,beta 以适配这个队列,结果就 ok,因为不存在不断增加的队列。

最后谈一下实现。linux kernel 的 tcp vegas 其实是个瘸子,它没有实现精准测量,相反,它采用了 2.6 内核粗糙的计数方法。任何 delay-based 算法正确实现方式都该使用 net/ipv4/tcp_rate.c 里 rs->delivered 与 rs->interval_us 做除法才算数,而不是直接 cwnd / srtt。此外,linux tcp 也没有实现 vegas 独特的时间序重传算法以及慢启动算法,这种重传算法和 bbr 依赖的 rack,pacing control 几乎一致了,缺失的本质原因在于 linux 内置了 loss-based cc 状态机,非常难改。

为什么写这个文章重复讲一个不被看好的 vegas,毕竟以前写过好多次 vegas 了。因为我看到 windows 竟然支持 bbr 了,有个评论提到了 vegas 是好的:
在这里插入图片描述

我也是这么认为的,所以难免想单独再多说几句,就写了本文。

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

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

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

相关文章

关于折线回归

一、说明 今天的帖子主要是关于使用折线回归找到最佳值。即将某条曲线分解成包络线段&#xff0c;然后用分段回归方式优化。但它也涉及使用 SAS 和 R 的剂量反应研究和样条曲线。这不是第一篇关于这些主题的文章&#xff0c;但我确实想在其中添加折线。只是因为它还在使用。 二…

Axure中继器完成表格的增删改查的自定义元件(三列表格与十列表格)

目录 一、中继器 1.1 定义 1.2 特点 1.3 适用场景 二、三列表格增删改查 2.1 实现思路 2.2 效果演示 三、十列表格增删改查 3.1 实现思路 3.2 效果演示 一、中继器 1.1 定义 在Axure中&#xff0c;"中继器"通常指的是界面设计中的一个元素&#xff0c;用…

Redis 6 性能大揭秘:如何优化缓存命中率?

Redis 6的性能优化&#xff0c;特别是关于如何优化缓存命中率。 这篇文章会包含10个代码示例&#xff0c;帮助深入理解和应用相关的技巧 1、 监控缓存命中率 在优化之前&#xff0c;首先要了解当前的缓存命中率。Redis提供了INFO命令来查看性能指标&#xff0c;包括命中率。…

深度学习中的张量维度

1 深度学习中的张量 在深度学习框架中&#xff0c;Tensor&#xff08;张量&#xff09;是一种数据结构&#xff0c;用于存储和操作多维数组。张量可以被视为一种扩展的矩阵&#xff0c;它可以具有任意数量的维度。 在深度学习中&#xff0c;张量通常被用来表示神经网络的输入…

easylogging 的笔记

学习总结 应用在c的工程里 easylog是一个用于记录日志的工具&#xff0c;其中分出了7种级别&#xff1a;分别是INFO&#xff1b;DEBUG&#xff1b;WARNING&#xff1b;TRACE&#xff1b;VERBOSE&#xff1b;ERROR&#xff1b;FATAL。其中FATAL这个log的输出会导致程序运行的退…

剑指 Offer(第2版)面试题 41:数据流的中位数

剑指 Offer&#xff08;第2版&#xff09;面试题 41&#xff1a;数据流的中位数 剑指 Offer&#xff08;第2版&#xff09;面试题 41&#xff1a;数据流的中位数解法1&#xff1a;优先队列解法2&#xff1a;有序集合 双指针 剑指 Offer&#xff08;第2版&#xff09;面试题 41…

控制理论simulink+matlab

这里写目录标题 根轨迹二级目录三级目录 根轨迹 z [-1]; %开环传递函数的零点 p [0 -2 -3 -4]; %开环传递函数的系统极点 k 1; %开环传递函数的系数&#xff0c;反映在比例上 g zpk(z,p,k); %生成开环传递函数%生成的传递函数如下 % (s1) % -------------…

【HarmonyOS开发】ArkUI中的自定义弹窗

弹窗是一种模态窗口&#xff0c;通常用来展示用户当前需要的或用户必须关注的信息或操作。在弹出框消失之前&#xff0c;用户无法操作其他界面内容。ArkUI 为我们提供了丰富的弹窗功能&#xff0c;弹窗按照功能可以分为以下两类&#xff1a; 确认类&#xff1a;例如警告弹窗 Al…

GitBook安装及使用——使用 Markdown 创建你自己的博客网站和电子书

目录 前言一、依赖环境二、gitbook安装使用1.安装 gitbook-cli2.安装 gitbook3.Gitbook初始化4.创建你的文章5.修改 SUMMARY.md 和 README.md6.编译生成静态网页7.运行以便在浏览器预览8.运行效果 前言 GitBook是一个命令行工具&#xff0c;用于使用 Markdown 构建漂亮的博客网…

npm login报错:Public registration is not allowed

npm login报错:Public registration is not allowed 1.出现场景2.解决 1.出现场景 npm login登录时,出现 2.解决 将自己的npm镜像源改为npm的https://registry.npmjs.org/这个&#xff0c;解决&#xff01;

鸿蒙4.0核心技术-WebGL开发

场景介绍 WebGL主要帮助开发者在前端开发中完成图形图像的相关处理&#xff0c;比如绘制彩色图形等。 接口说明 表1 WebGL主要接口列表 接口名描述canvas.getContext获取canvas对象上下文。webgl.createBuffer(): WebGLBuffernullwebgl.bindBuffer(target: GLenum, buffer: …

服务器数据恢复-EMC存储raid5磁盘物理故障离线的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台emc某型号存储服务器&#xff0c;存储服务器上组建了一组raid5磁盘阵列&#xff0c;阵列中有两块磁盘作为热备盘使用。存储服务器在运行过程中有两块磁盘出现故障离线&#xff0c;但是只有一块热备盘激活&#xff0c;最终导致该ra…

Gin之GORM多表关联查询(多对多;自定义预加载SQL)

数据库三个,如下: 注意:配置中间表的时候,表设计层面最好和配置的其他两张表契合,例如其他两张表为fate内的master和slave;要整合其对应关系的话,设计中间表的结构为master_id和slave_id最好(不然会涉及重写外键的操作) 重写外键(介绍) 对于 many2many 关系,连接表…

智能优化算法应用:基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黑寡妇算法4.实验参数设定5.算法结果6.参考文…

Jenkins Docker Cloud在Linux应用开发CI中的实践

Jenkins Docker Cloud在Linux应用开发CI中的实践 背景 通过代码提交自动触发CI自动构建、编译、打包是任何软件开发组织必不可少的基建&#xff0c;可以最大程度保证产物的一致性&#xff0c;方便跨组跨部门协作&#xff0c;代码MR等。 Docker在流水线中越来越重要&#xff…

iPhone手机开启地震预警功能

iPhone手机开启地震预警功能 地震预警告警开启方式 地震预警 版权&#xff1a;成都高新减灾研究所 告警开启方式

蜘点云原生之 KubeSphere 落地实践过程

作者&#xff1a;池晓东&#xff0c;蜘点商业网络服务有限公司技术总监&#xff0c;从事软件开发设计 10 多年&#xff0c;喜欢研究各类新技术&#xff0c;分享技术。 来源&#xff1a;本文由 11 月 25 日广州站 meetup 中讲师池晓东整理&#xff0c;整理于该活动中池老师所分享…

YOLOv8改进 | 主干篇 | 轻量级网络ShuffleNetV2(附代码+修改教程)

一、本文内容 本文给大家带来的改进内容是ShuffleNetV2&#xff0c;这是一种为移动设备设计的高效CNN架构。其在ShuffleNetV1的基础上强调除了FLOPs之外&#xff0c;还应考虑速度、内存访问成本和平台特性。(我在YOLOv8n上修改该主干降低了GFLOPs,但是参数量还是有一定上涨&am…

【Docker】基础篇

文章目录 Docker为什么出现容器和虚拟机关于虚拟机关于Docker二者区别&#xff1a; Docker的基本组成相关概念-镜像&#xff0c;容器&#xff0c;仓库安装Docker卸载docker阿里云镜像加速docker run的原理**为什么容器比虚拟机快**Docker的常用命令1.帮助命令2.镜像相关命令3.容…

C语言—每日选择题—Day51

第一题 1. 对于函数void f(int x);&#xff0c;下面调用正确的是&#xff08;&#xff09; A&#xff1a;int y f(9); B&#xff1a;f(9); C&#xff1a;f( f(9) ); D&#xff1a;xf(); 答案及解析 B 函数调用要看返回值和传参是否正确&#xff1b; A&#xff1a;错误&#xf…