劣币驱良币的 pacing 之殇

都说 pacing 好 burst 孬(参见:为啥 pacing),就像都知道金币好,掺铁金币孬一样。可现实中掺铁的金币流通性却更好,劣币驱良币。劣币流通性好在卖方希望收到别人的良币而储存,而自己作为买方只使用劣币。

burst 和 pacing 的关系也一样,都希望别人采用 pacing 策略,一旦有人 pacing,自己却 burst 加塞。在高速公路上,都希望别人 200 米车距,自己去加塞。仔细比较这些对弈双方,结论很有趣。

善者假设适用于自主系统,具有同类约定或共识,无罪则无罚,这是不稳定系统,因为一旦有投机者进入系统,假设无罪无罚的善者只能被毒打,而投机假设则适用于几乎所有自组织系统,只有贪婪自私和罪与罚,最后系统收敛到收益和代价之间,这是稳定系统,新来者进入这个系统,最终都会收敛。

我们的世界到处都是活泼开放的投机系统,善者系统反是非常态,死气沉沉。在一个活泼开放的系统中,到处都是投机,试探,收获,遇险,大概都是窦唯《高级动物》里的词,多是贬义,这是劣币之劣,但却是世界的本真。

本文侧重分析 burst 和 pacing 间劣币驱良币的过程。

reno/cubic 的 aimd 行为会被 pacing 改变。aimd + pacing 将形成一个闭环反馈:pacing_rate = cwnd / rtt,等号两边相生。

pacing_rate 达到瓶颈带宽后将稳定下来。增加 cwnd 将带来 queuing delay 等比例增加而维持 pacing_rate 不变,pacing_rate = link_rate 趋于排空 buffer,最终 inflight = pacing_rate * rtt,reno/cubic 等 aimd 流跳出 cwnd limited,cwnd 不再增加。

因此,reno/cubic + pacing 流不再填充 buffer,不再产生 buffer overflow 信号以驱动 aimd。

若有流量退出腾出共享带宽,由于 pacing_rate 和 inflight 相生,没有任何信号触发当前 aimd 流增加 inflight,也就无法 probe 空闲带宽,趋向死寂。

若有新流侵入却不至于丢包的 queuing 情形,本地维护的 cwnd 不变,pacing_rate = cwnd / rtt 由于 rtt 增加而减小意味着发得慢了,进而 inflight 减少,pacing_rate 继续减少。

这表明,根本轮不到 ai 激发 md,背景流作用下,这个闭环反馈自己懂松弛,自动退却。

全链路常规 aimd burst 流量的 buffer overflow 在整个时间序列呈类泊松分布,但无论哪种统计分布,采样次数越多,遭遇 buffer overflow 概率越大,而 pacing 将所有报文在时间序列均匀分布,遭遇 buffer overflow 概率最大,每次都会导致其 cwnd 比例降低,如前述,pacing_rate = cwnd / rtt 这个闭环稳定在 cwnd limited 外,cwnd 在丢包恢复后无法增加。

无论哪种情形,pacing_rate 只能单调递减,趋向跌 0。结论是,pacing 流无法与 aimd 行为相匹配,pacing_rate 与 inflight 相生,阻止 cwnd 的 ai,匡谈 md。

为解决这问题,Linux 引入 net.ipv4.tcp_pacing_ca_ratio 内核参数(即使非 Linux 实现,也必须有类似的措施):

pacing_rate = net.ipv4.tcp_pacing_ca_ratio * (cwnd / rtt)

tcp_pacing_ca_ratio 引入一种 probe 机制,可想而知,它不能比 1 小,甚至不能等于 1,否则 cwnd 将完全无用,但即使大于 1,测量和计算的精度问题以及抖动依然可能将其效果带到 1 以下,pacing_rate 将滑落。默认 1.2,带来非常保守的 probe 效果。

这个 probe 机制以驱动 aimd 运行。但并没解决遭遇 buffer overflow 概率影响 cwnd 增长的问题,增加的 pacing_rate 让 pacing 分布更加密集,遭遇 buffer overflow 概率更大。没有反制拥塞丢包影响的措施,却又完全伸展自己惨烈相迎,自己一直按照 pacing_rate 无 queuing 传输,tcp_pacing_ca_ratio 也只保守 probe,常规的 aimd 退却是对 ai 行为的积累退却,相当于零存整取,但遭遇与自身行为无关(并没有进行有效的 ai)的 buffer overflow 后仍然依照 aimd 原则退就只能一退再退。

谈完 probe 和丢包影响问题,接下来看看被加塞的影响。

pacing 流遭遇 burst 流是个劣币驱良币过程。设带宽为 T,pacing 流连续 2 个报文之间被加塞 n 个 burst 报文,将对 pacing 流引入 (n * 1500) / T 的延时,显然和 burst 量成正比,将引起 inflight 迅速降低而跳出 cwnd limited,这很可怕。换句话说,即使存在 tcp_pacing_ca_ratio probe 参数(即使存在 > 1 的 probe 增益),pacing 流依然很容易跳出 cwnd limited 而进入闭环稳态。

综上,pacing 严重影响 aimd 流的吞吐性能,并使之偏离 aimd 预期行为,不再零存整取而存零整取,取的是代价,更别谈公平收敛,pacing_rate = cwnd / rtt 闭环阻止了自身的 bufferbloat 贡献,pacing 流本身便不会主动(一种忏悔)执行 md(multiplicative-decrease) 收敛动作,被动的 md 纯被欺负。

那么 what about bbr with pacing ?

bbr 自身有状态机驱动 probe 行为,每 8 个 rounds 以 5 / 4 pacing_rate 增益做 probe。但只要是 pacing 流,被 burst 加塞的后果都一样引入 (n * 1500) / T 的延时进而引发 delivery rate 的下滑,被加塞将破坏 bbr 状态机的基本假设以及后续转换,因此 bbr 在一个 window 中不理会实际的测量值,反而坚持该 window 内的 max bandwidth,以此抵抗被动引入的延时,目前这个 window 是 10 rounds。

通过对 reno/cubic,bbr 的 pacing 动力学分析,结合假期最后一天的 高速公路堵车动力学,表明这是个典型的劣币驱良币的 case。无论 reno/cubic 还是 bbr 都需要主动 probe 避免死寂,同时需要某种坚持(persist)缓解被 burst 加塞的伤害,但没有一种良性机制对抗 burst。无奈 pacing 本身就是有价值的松弛策略,面对 burst 被驱逐也是情理之中。

当为传输使能 pacing 时,明明一个好东西,性能却劣化了,大概就是以上原因,网络终究是个劣币驱良币的投机系统。

所以呢,别在 sender host 侧 pacing,pacing 留给网络转发节点做。不 pacing,岂不加重 bufferbloat?但两害相权取其轻,对一厢情愿的 pacing,buffer 不会过分 bloat,我并不是说把 gain * delivery_rate * delivery_interval 全部一次性 burst 出去,可以分多次,定制你自己的 pacing。重要的是,你要知道你在做什么,并知晓后果。

至于数据中心网络,那是另一个故事。rtt 足够小,局域范围,很容易约定并形成大家都遵守的共识,别说 pacing,SDN 可以控制一切,但在广域网,SDN 就不好使,因为 rtt 太长了,反馈周期太久,响应太慢,就不得不接受广域网是一个投机者组成的自组织系统。

皮鞋没有蹬上,露着白袜子。

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

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

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

相关文章

vue图表制作

Vue.js是一个非常流行的JavaScript框架,可以用于开发交互式Web应用程序。Vue.js的优点之一是它的灵活性和可扩展性。因此,可以使用Vue.js与许多其他库和框架集成,包括图表库。 下面是使用Vue.js制作图表的一些步骤: 1.选择一个适…

告前端同学书

告前端同学书 一年前,InfoQ的编辑约请我对前端技术做了些回顾总结,说了三个方面的话题:其一,前端过去的15年大致可以怎样划分;其二,前端的现状以及面临的挑战;其三,前端会有怎样的未…

LocalDate的用法

日期时间转换 2023-03-30 14:25:00.000 DateTimeFormat(pattern "yyyy-MM-dd HH:mm:ss:sss")private LocalDateTime requestTimeStamp; 2021-06-18T10:46:19.67378508:00 new SimpleDateFormat("yyyy-MM-ddTHH:mm:ss:sssXXX");yyyy-mm-dd hh:mm:ss.sss 05…

关于javascript数组方法reduce的理解

JavaScript中的 reduce 是一个数组方法,它用于对数组中的元素进行累积操作,将数组的每个元素应用到指定的累积器函数,然后返回累积的结果。 reduce 方法的技术原理可以简单地概括为以下几个步骤: (PS:累积器函数指的是…

解析找不到msvcp140.dll的5个解决方法,快速修复dll丢失问题

​在使用计算机过程中,我们也会遇到各种各样的问题。其中,找不到msvcp140.dll修复方法是一个非常普遍的问题。msvcp140.dll是一个动态链接库文件,它是Microsoft Visual C 2015 Redistributable的一部分。这个文件包含了许多用于运行C程序的函…

传输层 | UDP协议、TCP协议

之前讲过的http与https都是应用层协议,当应用层协议将报文构建好之后就要将报文往下层传输层进行传递,而传输层就是负责将数据能够从发送端传到接收端。 再谈端口号 端口号(port)标识了一个主机上进行通信的不同的应用程序,在TCP/IP协议中&…

进阶JAVA篇- LocalDate 类与 LocalTime 类、LocalDateTime 类的常用API(六)

目录 API 1.0 LocalDate 类与 LocalTime 类、LocalDateTime 类的API说明 1.1 如何创建LocalDate 类与 LocalTime 类、LocalDateTime 类的对象 1.2 LocalDate 类与 LocalTime 类、LocalDateTime 类中的以 get 开头实例方法 1.3 LocalDateTime 类中的 toLocalDat…

Vu3中样式穿透不生效处理

Vu3中样式穿透不生效处理 代码查看F12处理- 方法一父组件修改为单根组件 代码 App.vue <template><p>父组件</p><hello-world></hello-world> </template><script setup> import HelloWorld from "./components/HelloWorld.v…

蓝桥杯 第 1 场算法双周赛 第三题 分组【算法赛】c++ 贪心+双指针

题目 分组【算法赛】 难度: 中等 问题描述 蓝桥小学要进行弹弹球游戏&#xff0c;二年级一班总共有 n 个同学&#xff0c;要求分成 k 个队伍&#xff0c;由于弹弹球游戏要求队员的身高差不能太大&#xff0c;小蓝是班长&#xff0c;他对这个事情正在发愁&#xff0c;他想问…

【多媒体技术与实践】使用OpenCV处理图像(实验三.上)

1&#xff1a;图像直方图 将原彩色图像转成灰度图像&#xff0c;得到该灰度图像的灰度直方图&#xff0c;并对灰度直方图进行直方图均衡化&#xff0c;将原图、灰度图、直方图及均衡化后的直方图一起拼接为一张图片 import cv2 import numpy as np import matplotlib.pyp…

浅谈压力测试的作用是什么

随着现代应用程序变得越来越复杂&#xff0c;用户的期望也在不断提高&#xff0c;对性能和可靠性的要求变得更加苛刻。在应用程序开发和维护的过程中&#xff0c;压力测试是一项至关重要的活动&#xff0c;它可以帮助发现潜在的问题、评估系统的性能极限&#xff0c;以及确保在…

4、在 CentOS 8 系统上安装 pgAdmin 4

pgAdmin 4 是一个开源的数据库管理工具&#xff0c;专门用于管理和操作 PostgreSQL 数据库系统。它提供了一个图形用户界面&#xff08;GUI&#xff09;&#xff0c;使用户能够轻松地连接到 PostgreSQL 数据库实例&#xff0c;执行 SQL 查询&#xff0c;管理数据库对象&#xf…

MySQL简介

数据库管理系统 1、关系型数据库管理系统: Oracle:Oracle是一种商业级关系型数据库管理系统,支持高可用性、高安全性以及广泛的企业级应用需求。SQL Server:SQL Server是Microsoft开发的企业级关系型数据库管理系统,广泛应用于Windows环境下的软件开发。MySQL:MySQL是一…

智能指针与定制删除器

定制删除器 前面我们的智能指针就是&#xff1a; RAII。 像指针一样。 但是我们的智能指针的析构函数就只是 delete。 // 这里简单的看一下 shared_ptr 就知道了~shared_ptr(){if (--(*_pcount) 0){delete _ptr;delete _pcount;}} 那么如果我们想要 new[] 呢&#xff1f…

基于知识图谱建模、全文检索的智能知识管理库(源码)

一、项目介绍 一款全源码&#xff0c;可二开&#xff0c;可基于云部署、私有部署的企业级知识库云平台&#xff0c;一款让企业知识变为实打实的数字财富的系统&#xff0c;应用在需要进行文档整理、分类、归集、检索、分析的场景。 知识图谱提供了一种从海量文本和图像中抽取结…

2023大联盟2比赛总结

比赛链接 反思 T1 奇怪的贪心和构造题一直是我的软肋部分 T2 简单题 T3 也不难 T4 套路没学过&#xff0c;感觉还是太菜了 题解 A 考虑先给图随便染色&#xff0c;然后调整 因为每个点的度数为 3 3 3&#xff0c;所以如果有 x → u → v x\to u\to v x→u→v 的颜…

自定义类型:结构体,枚举,联合 (2)

2. 位段 位段的出现就是为了节省空间。 2.1 什么是位段 位段的声明和结构是类似的&#xff0c;有两个不同&#xff1a; 1.位段的成员必须是 int、unsigned int 或signed int 。 2.位段的成员名后边有一个冒号和一个数字。 比如&#xff1a; struct A {int _a:2;int _b:5;int…

Pygame中将鼠标形状设置为图片2-2

3 编写主程序 在主程序中&#xff0c;首先创建屏幕并且完成一些准备工作&#xff0c;之后在while循环中不断更新sprite实例即可。 3.1 创建屏幕及准备工作 创建屏幕及准备工作的代码如图5所示。 图5 创建屏幕及准备工作 其中&#xff0c;第20行代码调用pygame.mouse模块中的…

Hadoop3教程(五):NameNode和SecondaryNameNode

文章目录 &#xff08;59&#xff09;NN和2NN的工作机制&#xff08;60&#xff09;FsImage镜像文件&#xff08;61&#xff09;Edits编辑日志&#xff08;62&#xff09;Checkpoint时间设置参考文献 &#xff08;59&#xff09;NN和2NN的工作机制 NameNode的数据是存储在磁盘…

思维模型 正/反 木桶理论

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。 1 正/反 木桶理论的应用 1.1 木桶理论的应用 1.1.1 正木桶理论在考试中的应用 小明是一名理科高中生&#xff0c;他在学习过程中发现自己在数理化方面表现较好&#xff0c;但在语文和英…