dctcp 和 l4s tcp prague

时延的罪与罚。

dctcp 为 dcn 而生,专注于避免吞吐优先的长流阻塞延迟敏感的短流。在最坏情况下,没有任何额外队列规则辅助时,即使长流短流排入唯一的 fifo,也要能做到这点。

为此,必须由交换机辅助实现普遍低时延,在队列长度超过一个足够低值 k 时开始标记 ecn,理论上把这部分 ecn 标记的发送量排除掉就能将队列长度降低到 k 以下。 显然的算法就是:

cwnd = cwnd * (1 - mark_rate)

而 mark_rate = (一轮周期中标记 ecn 的 ack) / (一轮周期中所有 ack )。但由于 dctcp 仍以标准 tcp(reno,cubic 等变体) 为底色,标准 tcp 执行 aimd,它以系数 1 / 2 而不是 1 执行 md 响应拥塞,为拟合标准 tcp:

cwnd = cwnd * (1 - mark_rate / 2)

此外,为排除噪声抖动,mark_rate 需某种平均计数,dctcp 设 alpha 作为 mark_rate 移指平均(连续采样最简单的平均算法):

alpha = (1 - g) * alpha + g * F
cwnd = cwnd * (1 - alpha / 2)

其中 F 即 (一轮周期中标记 ecn 的 ack) / (一轮周期中所有 ack )。当无拥塞 or 轻微拥塞,alpha 很小,cwnd 倾向于不变,最严重情况下 alpha 为 1,即全部标记,此时 dctcp 的 cwnd 减半,其行为拟合标准 tcp。

由此,适用于 dcn 的低时延 cc 出炉,这就是 dctcp 的全部。

但如 rfc8257 所述的部署问题,dcn 为保证极低时延,交换机拥塞阈值配置非常低,dctcp 与标准 tcp 对拥塞的反应在这种情况下导致不公平,标准 tcp 的 aimd 在浅 buffer 本就效率低下,遇到缓慢适配带宽的 dctcp 更加低效,这意味着二者需要隔离。

dctcp 是一个非常简洁的算法,妙处在于它构建于 aimd 标准 tcp 上,实属 tcp 的增强。如果将标准 tcp 视作盲目反应协议,它只要足够公平收敛就足够,那么 dctcp 则以明确的显式 ecn 反馈消除了一大部分盲目损耗,正所谓信息消除不确定性。

但如 tcp 的拧巴属性,假设 dctcp 果真能解决时延问题(事实上已经解决了很大问题),那它一定揭露了另一个问题。

默认 aimd 行为中,排队时延约 20ms 量级,无论传播时延 100us 还是 100ms,栽进 buffer 就引入 20ms,排队时延掩盖了真实时延差异,100us 和 100ms 相差 1000 倍,排队时延遮掩下成了 20.1ms 和 120ms 相差不到 6 倍。

如果 dctcp 把排队时延消除了,它还能构建于 aimd tcp 之上吗?显然不行。

aimd 速率公式: 吞吐 = α R T T 1 p 吞吐=\dfrac{\alpha}{RTT}\sqrt{\dfrac{1}{p}} 吞吐=RTTαp1 ,rtt 越大,吞吐越小,aimd 的公平是 bdp 公平,把 rtt 乘过去就公平了,但网络讲究的不是 bdp,而是吞吐。

不过 dcn rtt 不公平并不明显,同属一个机房不跨核心,传播时延相差普遍不到 10 倍,20us 到 200us,这是光速和物理距离决定的,但在广域网这问题就非常明显。

作为把交换机 ecn 标记和 dctcp 搬到广域网的尝试,l4s 框架配合可扩展算法实例 tcp prague,将 rtt 公平性作为算法的内置,解除了算法和 rtt 的关联,即 rtt-independence。

tcp prague 以非常随意但十分精巧的方式引入虚拟 rtt:

virt_rtt = max(srtt, 25ms)

如果 srtt 小于 25ms 就以 25ms 计,依据是 “rtt 越小越强势”,因此把 rtt 最小值限制在 25ms(经验),这和 “不可扩展 aimd 算法” 引入的排队时延异曲同工,遏制了小 rtt 的侵略性。

在不影响 aimd 的 bdp 公平性前提下做这个调整非常具有技巧性,只需 “长宽缩放面积不变”,virt_rtt 相比 actual_rtt 扩大多少倍,virt_cwnd 就缩小多少倍,这相当于把一个 rtt 极小,吞吐很大的细高长方形拉扯延展成一个等面积扩大的宽胖长方形。为此,引入 m = virt_rtt / srtt。

按照 aimd,在 ai 阶段每个 rtt cwnd 增加 1,引入 virt_rtt 后即每个 virt_rtt virt_cwnd 增加 1:

cwnd += (1 / m) (1 / virt_cwnd) = (1 / m) (1 / (m cwnd)) = (1 / m^2) (1 / cwnd)

这只对 rtt < 25ms 的流有影响。可见,在 tcp prague 眼里,所有流的 rtt 都大于 25ms,在没有排队时延假设的前提下,世界上最大的传播时延在 200ms 左右,与 25ms 相差 10 倍而已,rtt 不公平性被限制在合理范围。

tcp prague 有个细节值得一提。上述 rtt-independence 特性限制了 rtt 公平性问题的扩散,但它无疑损害了小 rtt 的流,如果这条流同时也很短,它出让的本该属于它的吞吐无法从 RTT-InDependence 获得任何益处,哪怕只是好的名声。

在公平性之外,按照 stcf(shortest time-to-completion first) 原则,确实要给短流一些优先权,因此 rtt-independence 只在 d(默认 500) 轮 rtt 后才开启。

dctcp/tcp prague 的思路和 vegas 不同,前者属于为 aimd 注入额外信息消除不确定性进行优化,后者属于直接试图避免拥塞并维持公平(bbr 也一样,但 bbr 在理论上做不到)。但 vegas 也有问题,它为每条流在 buffer 中保留 alpha 个段,如果 buffer 很浅, 流很多时仍然避免不了 buffer overflow 而丢包,如何处理丢包和重传就是 vegas 必须要做的,论文的时间序重传很好,然而在 linux 实现上却回退了,以下来自 linux vegas 的注释:

We do not change the loss detection or recovery mechanisms of Linux in any way. Linux already recovers from losses quite well, using fine-grained timers, NewReno, and FACK.

也许是作者没有真正理解 vegas 时间序重传的重要性。也许 vegas + l4s 框架,根据反馈信息不断调整 alpha,beta 或许能真实现完全的拥塞避免,但 dctcp/tcp prague 在强化 aimd 的路上应该也不会有所区别。

好了,这就是今天要讲的 dctcp 和 tcp prague 的故事。

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

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

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

相关文章

Eureka注册及使用

一、Eureka的作用 Eureka是一个服务注册与发现的工具&#xff0c;主要用于微服务架构中的服务发现和负载均衡。其主要作用包括&#xff1a; 服务提供者将自己注册到Eureka Server上&#xff0c;包括服务的地址和端口等信息。服务消费者从Eureka Server上获取服务提供者的地址…

Go(Golang)的10个常见代码片段用于各种任务

探索有用的Go编程代码片段 提供“前10名”Go&#xff08;Golang&#xff09;代码片段的明确列表是具有挑战性的&#xff0c;因为代码片段的实用性取决于您试图解决的具体问题。然而&#xff0c;我可以为您提供十个常用的Go代码片段&#xff0c;涵盖了各种任务和概念&#xff1…

【驱动序列】简单聊聊开发驱动程序的缘由和驱动程序基本信息

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》&#xff0c;这是《驱动程序》专栏序列文章。 这是2024年第4篇文章&#xff0c;此篇文章是结合了C#知识点实践序列文章&#xff0c;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xf…

树莓派4B-Python使用PyCharm的SSH协议在电脑上远程编辑程序

目录 前言一、pycharm的选择二、添加SSH的解释器使用总结 前言 树莓派的性能始终有限&#xff0c;不好安装与使用高级一点的程序编辑器&#xff0c;如果只用thonny的话&#xff0c;本人用得不习惯&#xff0c;还不如PyCharm&#xff0c;所以想着能不能用电脑中的pycharm来编写…

IO作业2.0

思维导图 1> 使用fread、fwrite完成两个文件的拷贝 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) {if(argc ! 3) //判断外部参数 {printf("The terminal format is incorrect\n");r…

OpenGL FXAA抗锯齿算法(Qt,Consloe版本)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 之前已经提供了使用VCG读取Mesh的方式,接下来就需要针对读取的网格数据进行一些渲染操作了。在绘制Mesh数据时总会遇到图形的抗锯齿问题,OpenGL本身已经为我们提供了一种MSAA技术,但该技术对于一些实时渲染性能有…

《C语言中的基石:库函数与自定义函数的深度解析与实践》

引言 各位少年&#xff0c;大家好。我是博主那一脸阳光。在深入探讨C语言编程的浩瀚世界时&#xff0c;我们会频繁接触到两大类函数——库函数和自定义函数。它们如同构建复杂程序大厦的砖石&#xff0c;各自发挥着不可替代的作用。本文将详尽介绍这两种函数的特点、使用方式以…

从零开发短视频电商 爬虫在爬取时注意 robots.txt 和 sitemap.xml

文章目录 1. robots.txt&#xff1a;2. sitemap.xml&#xff1a; 当我们爬取一个网站时&#xff0c;通常首先查看网站根目录下的两个重要文件&#xff1a; robots.txt 和 sitemap.xml。这两个文件提供了关于网站爬取行为和结构的重要信息。 1. robots.txt&#xff1a; robot…

计算机组成原理——冯诺依曼计算机硬件框图

存储器&#xff1a;存放数据和程序 运算器&#xff1a;算术运算和逻辑运算 控制器&#xff1a;指挥程序的运算 输入设备&#xff1a;将信息转化成机器能识别的形式 输出设备&#xff1a;将结果转化成人们熟悉的形式

Centos安装Kafka(KRaft模式)

1. KRaft引入 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。其核心组件包含Producer、Broker、Consumer&#xff0c;以及依赖的Zookeeper集群。其中Zookeeper集群是Kafka用来负责集群元数据的管理、控制器的选举等。 由…

使用Apache Commons SCXML实现状态机管理

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;咱们程序员在开发过程中&#xff0c;经常会遇到需要管理不同状态和状态之间转换的场景。比如&#xff0c;一个在线购物的订单&#xff0c;它可能有“新建订单”、“已支付”、“配送中”、“已完成”等状态。在这…

[嵌入式AI从0开始到入土]9_yolov5在昇腾上推理

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…

uniapp运行到开发者工具中

uniapp 项目在微信开发者工具中运行&#xff0c;用于开发微信小程序。 微信 appid 获取地址&#xff1a;微信公众平台 运行到微信开发者工具中 一、进入微信公众平台、微信扫码登录、选择开发管理、选择开发设置、复制 appid 。 二、打开 manifest.json 配置文件、选择微信小…

居家康养领导品牌“颐家”完成B轮融资,商业化进程再加速

近日&#xff0c;颐家&#xff08;上海&#xff09;医疗养老服务有限公司&#xff08;以下称“颐家”“公司”&#xff09;宣布引入战略股东。此次融资额达数千万元人民币&#xff0c;资金将主要用于公司业务数智化升级及自费业务产品开发、团队扩展和业务渠道的开拓。本轮融资…

闭包,垃圾回收机制

1.垃圾回收机制 当函数执行完毕后,函数内部的变量就会被销毁。 代码&#xff1a; function fn() {var a 10;a;return a;}console.log(fn()); 输出的结果: 11 持续调用的结果: 2.变量的私有化 代码: function fn() {var a 10;return function fn1() {return a;}…

Redis——centos7环境安装Redis6.2.14版本,make命令编译时报错:jemalloc/jemalloc.h:没有那个文件或目录

一、报错原因 在redis-6.2.14文件夹下有一个README.md文件&#xff0c;有如下一段话&#xff1a; 在构建 Redis 时&#xff0c;通过设置 MALLOC 环境变量来选择非默认的内存分配器。Redis 默认编译并链接到 libc malloc&#xff0c;但在 Linux 系统上&#xff0c;jemalloc 是…

SunTorque智能扭矩系统:扭矩测量都有哪些?

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 扭矩测量是工程领域中一项重要的测量参数&#xff0c;它反映了转矩作用在旋转轴上的力矩大小。扭矩测量方法有很多种&#xff0c;以下介绍几种常用的测量方法&#xff1a; 一、扭力扳手 扭力扳手是一种常见的扭矩测量…

行测小技巧

1. 前推后还是后推前&#xff1f; 前推后&#xff1a; 如果……那么…… 只要……就…… 凡是……都…… 为了……一定…… 必然/必须/不能不 意味着/说明了/关键是后推前&#xff1a; 只有……才…… ……是……必不可少的 ……是……必须的 ……是……的必要前提 除非……&a…

c语言内嵌汇编知识点记录

内容在飞书云文档&#xff0c;点击打开即可。 Docshttps://r0dhfl3ujy9.feishu.cn/docx/EaVIdjGVeoS6fUxiKWkcjAq8nWg?fromfrom_copylink

2024 Win 安装Oracle12C

文章目录 一、下载1.1 官方下载1.2 官方Archive下载1.3 博主提供 二、安装2.1 解压2.2 安装 三、连接3.1 SQL Plus3.2 切换到容器数据库orclpdb3.3 查询SID 四、查看数据4.1 SQL Develop 连接4.2 创建新用户4.3 develop 直接创建新用户4.3.2 SQL 错误: ORA-65096: 公用用户名或…