BBR 为什么没有替代 CUBIC 成为 Linux 内核缺省算法
自 2017 年底 bbr 发布以来,随着媒体的宣讲,各大站点陆续部署 bbr,很多网友不禁问,bbr 这么好,为什么不替代 cubic 成为 linux 的缺省算法。仅仅因为它尚未标准化?这么好的算法又为什么没被标准化?
首先,如何定义 “好”。包括我自己在内的几乎所有人都用过一种错误方法度量 bbr 的 “好”:搭建一跳转发的模拟环境,用 tc 配置丢包,时延,用 iperf 对比 bbr 和 cubic,得到结论,bbr 的吞吐比 cubic 大好多倍,所以 bbr 好。幸运的是,我很快意识到错误并改正,但直到现在很多领域专家(自诩的专家,实际上只是经理)仍在用 tc + iperf 验证 bbr。
通过下面一篇文章可继续领略什么是 “好”:Evaluating BBRv2 on the Dropbox Edge Network
bbr 是个拥塞控制算法,它的部署环境是统计复用的去中心分布式网络,任何一种拥塞控制算法在部署之前都要至少自证两件事:
- 不会引发拥塞崩溃;
- 网络流量公平收敛。
正如你所见,这是最小约束。不必要求一个算法可以解决拥塞,但求不添乱。这很容易理解,如果一个算法没用,自然选择会淘汰它,但一个算法有副作用,便会带来灾难。很遗憾,bbr 一个也证明不了。
bbr 的正确性依赖高精度的准确的对 bandwidth 和 rtt 的测量,而高精度取决于实现,准确性则依赖网络本身。我频繁啰嗦的那句 “统计复用网络本身不可精确测量” 不管你信不信它就是无法精确测量,异构性只是最不重要的方面,不可测量的核心来自于统计律本身,正如你无法把握某个空气分子的动量但却能测量一坨空气的温度一样。
统计律只能按统计的方法来,而任何统计方法都有滞后性,对反馈响应之前的这段时间可能就是灾难酝酿的时间,而随后的响应并不覆盖灾难,系统可能滑向不稳定状态,这种不稳定状态包括拥塞崩溃。不管 bbr 官方的论述还是我个人所做的仿真,大前提都是网络可精确测量,这显然把最难的部分绕过去了。
反过来看看 cubic。cubic 无疑是最小依赖的,仅依赖丢包事件。如范雅各布森所说,任何主动的显式机制都可能被误用,但丢包不会。如果有一种显式拥塞通知机制,但它故障了,发生拥塞时并没发出通知,网络就可能崩溃,然而丢包就是丢包,任何行为都无法做到 buffer 溢出而不丢包,你能谎称丢包,但结果还是收敛。
cubic 的误判对拥塞属反向激励,对拥塞的反应 “宁可错杀,但绝不遗漏”,但 bbr 对带宽的过估或低估带来的结果将不可控。看一个 bbr 双流相图:
如图所示,请问 4 怎么画?4 的位置取决于你对系统的测量结果。为什么说误估导致的行为不可控?
bbr 本身是个非线性系统,不能用线性的思维去简单表达,换句话说,这件事本身就凌乱复杂,没有简单到能让人快速画线获得直感的方法。而衍自 reno 的 cubic 则是线性的,线性可叠加性让系统问题变得和单体问题一样可控,不管是同步流还是异步流。
大道至简,最小依赖,少即是多,这是 cubic 作为缺省算法的理由:
- 缺省算法不一定甚至一定不是性能最高的,但一定是普适不挑环境的;
- 缺省算法的公平性一定是可自证的,无论与自身还是与异构流量共存;
- 缺省算法的收敛速度一定是可预期的,线性系统最符合这个期望;
- 缺省算法一定是稳定的,没有任何正反馈可将系统带到崩溃状态;
- 缺省算法一定经历了广泛使用和长期验证,具备设备兼容性;
- 缺省算法一定是保守的。
bbr 属于特定网络场景的优化算法,如果在稳定的长肥管道,bbr 无疑是福音,但在抖动不受控的网络环境比如无线场景,bbr 就不如预期,甚至无法预期。
bbr 属于 1988 算法后的一个新路子,为应对 buffer 增长给出的负向反馈。bbr1 首先用激进的方式应对,它只是个 demo,能进 linux 内核但进不了 rfc,bbr2 开始考虑公平性和保守性,只要这样才会使 bbr 具备普遍性而被标准化,但迭代到 bbr3 的状态依然停留在 draft BBR Congestion Control。
虽然 bbr 在某些情况下表现优异,它没有取代 cubic 的原因主要是在于标准化,稳定性,成熟度,兼容性,以及网络环境的多样性等因素。随着 bbr 的发展和进一步的优化,可能有机会在更多系统中被采用。
而在 l4s 已被标准化的今天,bbr 可能真的只是一个引子。谁说 aimd 不能做高带宽低时延,配合 ecn 就行,aimd + ecn 是多么的简单,线性可控。
但 linux 内核早被各厂经理污染,妹忒内儿卷客大行其道,如果哪天来自某大厂的经理妹忒内儿力排众议非要把 bbr 设置为 linux 内核的缺省算法,也是说不准的事。
浙江温州皮鞋湿,下雨进水不会胖。
相关文章:
BBR 为什么没有替代 CUBIC 成为 Linux 内核缺省算法
自 2017 年底 bbr 发布以来,随着媒体的宣讲,各大站点陆续部署 bbr,很多网友不禁问,bbr 这么好,为什么不替代 cubic 成为 linux 的缺省算法。仅仅因为它尚未标准化?这么好的算法又为什么没被标准化ÿ…...
Git忽略规则原理和.gitignore文件不生效的原因和解决办法
在使用Git进行版本控制时,.gitignore文件扮演着至关重要的角色。它允许我们指定哪些文件或目录应该被Git忽略,从而避免将不必要的文件(如日志文件、编译产物等)纳入版本控制中。然而,在实际使用过程中,有时…...
MySQL-数据库设计
1.范式 数据库的范式是⼀组规则。在设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数 据库,这些不同的规范要求被称为不同的范式。 关系数据库有六种范式:第⼀范式(1NF)、第⼆范式(…...
Unity开发绘画板——04.笔刷大小调节
笔刷大小调节 上面的代码中其实我们已经提供了笔刷大小的字段,即brushSize,现在只需要将该字段和界面中的Slider绑定即可,Slider值的范围我们设置为1~20 代码中只需要做如下改动: public Slider brushSizeSlider; //控制笔刷大…...
./mnt/container_run_medium.sh
#!/bin/bash# 清理旧的日志文件 rm -f *.log rm -f nohup.out rm -f cssd.dat# 启动 pwbox_simu 和 MediumBoxBase nohup /mnt/simutools/pwbox_simu /mnt/simutools/pw_box.conf > /dev/null 2>&1 & nohup /mnt/mediumSimu/MediumBoxBase /mnt/mediumSimu/hynn_…...
数学建模研赛总结
目录 前言进度问题四分析问题五分析数模论文经验分享总结 前言 本文为博主数学建模比赛第五天的内容记录,希望所写的一些内容能够对大家有所帮助,不足之处欢迎大家批评指正🤝🤝🤝 进度 今天已经是最后一天了…...
通信工程学习:什么是TCF技术控制设施
TCF(Technical Control Facility):技术控制设施 首先,需要明确的是,通信工程是一门涉及电子科学与技术、信息与通信工程和光学工程学科领域的基础理论、工程设计及系统实现技术的学科。它主要关注通信过程中的信息传输…...
stm32 bootloader跳转程序设计
文章目录 1、bootloader跳转程序设计(1)跳转程序(2)、app程序中需要注意<1>、在keil中ROM起始地址和分配的空间大小<2>、在system_stm32f4xx.c中设置VECT_TAB_OFFSET为需要偏移的地址<3>、main函数中使能中断 总…...
科技赋能环保:静电与光解技术在油烟净化中的卓越应用
我最近分析了餐饮市场的油烟净化器等产品报告,解决了餐饮业厨房油腻的难题,更加方便了在餐饮业和商业场所有需求的小伙伴们。 随着环保政策的不断升级,餐饮行业的油烟治理成为重要课题。油烟净化器的技术革新不仅提升了净化效率,…...
FCA-FineBI试卷答案
1、【判断题】FineBI数据加工建模中只支持文本、数值、日期三种数据类型。 正确答案:A A. 正确 B. 错误 2、【判断题】Excel 支持批量导入,可以一次导入多个 sheet 或 Excel? 正确答案:A A.正确 B. 错误 3、【判断题】FineBI V6.…...
Spring - @Import注解
文章目录 基本用法源码分析ConfigurationClassPostProcessorConfigurationClass SourceClassgetImportsprocessImports处理 ImportSelectorImportSelector 接口DeferredImportSelector 处理 ImportBeanDefinitionRegistrarImportBeanDefinitionRegistrar 接口 处理Configuratio…...
新能源汽车储充机器人:能源高效与智能调度
新能源汽车储充机器人:开启能源高效利用与智能调度的未来之门 随着全球能源危机的日益加剧和环境污染问题的不断恶化,新能源汽车成为了未来交通领域的重要发展方向。然而,新能源汽车的普及不仅需要解决电池技术的瓶颈,还需要构建一…...
【Linux网络】详解TCP协议(2)
🎉博主首页: 有趣的中国人 🎉专栏首页: Linux网络 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好,本片文章将会讲解 TCP协议的三次握手和四次挥手 的相关内容。 如果看到最后您觉得…...
STM32DMA学习日记
STM32 DMA学习日记 写于2024/9/28晚 文章目录 STM32 DMA学习日记1. DMA简介2. I/O方式2.1 程序查询方式2.2 程序中断方式2.3 DMA方式 3.DMA框图4. 相关寄存器4.1 DMA中断状态寄存器(DMA_ISR)4.2 DMA中断标志清除寄存器(DMA_IFCR)…...
【高性能内存池】page cache 5
page cache 1 page cache的框架2 central cache从page cache申请n页span的过程3 page cache 的结构3.1 page cache类框架3.2 central cache向page cache申请span3.3 获取k页的span page cache的结构和central cache是一样的,都是哈希桶的结构,并且挂载的…...
Vue 3 魔法揭秘:CSS 解析与 scoped 背后的奇幻之旅
文章目录 一、背景二、源码分析transformMain 返回值transformStyle 方法compileStyleAsync 方法scopedPlugin 方法template 添加 __scopeId 三、总结 一、背景 Vue 3 文件编译流程详解与 Babel 的使用 上文分析了 vue3 的编译过程,但是在对其中样式的解析遗留了一…...
如何获取钉钉webhook
第一步打开钉钉并登录 第二步创建团队 并且 添加自定义 机器人 即可获取webhook...
网页WebRTC电话和软电话哪个好用?
关于WebRTC电话与软件电话哪个更好用,这实际上取决于多个因素,并没有一个绝对的答案。不过,我可以根据WebRTC技术的一些特点,以及与传统软件电话相比的优劣势,为你提供一个清晰的对比。 首先,让我们了解一下…...
MySQL Mail服务器集成:如何配置发送邮件?
MySQL Mail插件使用指南?怎么优化 MySQL发邮件性能? MySQL Mail服务器的集成,使得数据库可以直接触发邮件发送,极大地简化了应用架构。AokSend将详细介绍如何配置MySQL Mail服务器,以实现邮件发送功能。 MySQL Mail&…...
【Rockchip系列】官方函数:imcopy
imcopy 函数原型 IM_STATUS imcopy(const rga_buffer_t src,rga_buffer_t dst,int sync 1,int *release_fence_fd NULL);功能说明 imcopy函数用于执行单次快速图像拷贝操作,将图像从源缓冲区拷贝到目标缓冲区。 参数说明 参数描述src[必填] 源图像缓冲区&…...
Matlab实现鲸鱼优化算法优化回声状态网络模型 (WOA-ESN)(附源码)
目录 1.内容介绍 2部分代码 3.实验结果 4.内容获取 1内容介绍 鲸鱼优化算法(Whale Optimization Algorithm, WOA)是一种基于座头鲸捕食行为的群智能优化算法。该算法通过模仿座头鲸使用螺旋形路径和包围猎物的策略来探索和开发解空间,以找到…...
迈威通信闪耀工博会,以创新科技赋能工业自动化
昨日,在圆满落幕的第24届中国国际工业博览会上,迈威通信作为工业自动化与智慧化领域的先行者,以“创新打造新质通信,赋能工业数字化”为主题精彩亮相,向全球业界展示了我们在工业自动化领域的最新成果与创新技术。此次…...
C# DotNetty客户端
1. 引入DotNetty包 我用的开发工具是VS2022,不同工具引入可能会有差异 工具——>NuGet包管理器——>管理解决方案的NuGet程序包 搜索DotNetty 2.新建EchoClientHandler.cs类 用于接收服务器返回数据 public class EchoClientHandler : SimpleChannelIn…...
4G模组SIM卡电路很简单,但也要注意这些坑
上次水SIM卡相关的文章,还是上一次; 上一篇文章里吹牛说,跟SIM卡相关的问题还有很多,目的是为下一篇文章埋下伏笔;伏笔埋是埋下了,但如果债老是不还,心里的石头就总悬着,搞不好老板…...
常见电脑品牌BIOS设置与进入启动项快捷键
常见电脑品牌BIOS与引导项快捷键速查表 | 电脑品牌 | BIOS快捷键 | 引导项快捷键 | 备注 ||------------|------------|--------------|------------------------------ || 联想 | F2/F1 | F12 | 笔记本通常为F2,台式机通常为F1 || IBM/ThinkPad | F1 | 未知 | ||…...
C语言中的日志机制:打造全面强大的日志系统
前言 在软件开发中,良好的日志记录机制对于调试、监控程序状态和维护系统的稳定性至关重要。本文将介绍如何在C语言中构建一个全面强大的日志系统,并提供一些示例代码。 1. 日志的基本概念 日志级别:用于分类日志信息的重要性,…...
局域网广域网,IP地址和端口号,TCP/IP 4层协议,协议的封装和分用
前言 在古老的年代,如果我们要实现两台机器进行数据传输, A员工就得去B员工的办公电脑传数据(B休息,等A传完),这样就很浪费时间 所以能不能不去B的工位的同时,还能传数据。这时候网络通信就出来…...
LabVIEW项目编码器选择
在LabVIEW项目中,选择增量式(Incremental Encoder)和绝对式(Absolute Encoder)编码器取决于项目的具体需求。增量式编码器和绝对式编码器在工作原理、应用场景、精度和成本等方面存在显著差异。以下从多方面详细阐述两…...
Spring Boot实现房产租赁业务逻辑
1 绪论 1.1 研究背景 中国的科技的不断进步,计算机发展也慢慢的越来越成熟,人们对计算机也是越来越更加的依赖,科研、教育慢慢用于计算机进行管理。从第一台计算机的产生,到现在计算机已经发展到我们无法想象。给我们的生活改变很…...
汽车3d动画渲染选择哪个?选择最佳云渲染解决方案
面临汽车3D动画渲染挑战?选择正确的云渲染服务至关重要。探索最佳解决方案,优化渲染效率,快速呈现逼真动画。 汽车3d动画渲染选择哪个? 对于汽车3D动画渲染,选择哪个渲染器取决于你的项目需求、预算和期望的效果。Ble…...
重庆铜梁网站建设公司/百度网盘登陆入口
我在SLURM集群上预留了一些节点,并且希望在这些节点上运行一个python脚本。在一个节点(服务器)上,python脚本应该填充作业队列并将这些作业分发给客户端。大多数情况下,这种方式可以正常工作,但偶尔脚本会停下来。当使用Ctrl C时…...
牡丹江网络推广/windows优化大师免费
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例: …...
郑州市建设网站/2023年8月份新冠症状
数据库的随机查询SQL 1. Oracle,随机查询20条 select * from ( select * from 表名 order by dbms_random.value ) where rownum < 20; 2.MS SQL Server,随机查询20条 select top 20 * from 表名order by newid() 3.My SQL:,随机查询20条 selec…...
网站制作怎么做语音搜索框/google app下载
最新版 Docker 安装 Nginx1、在Docker中查询Nginx2、选择最新版本安装3、查询Docker容器中的镜像4、启动Nginx5、查询是否启动Nginx镜像6、停止Nginx7、删除Nginx容器1、在Docker中查询Nginx [rootshiqi /]# docker search nginx #查询结果 NAME …...
动态网站制作教程/站长工具seo综合查询关键词
Java是一个安全的开发工具,它阻止开发人员犯很多低级的错误,而大部份的错误都是基于内存管理方面的。如果你想搞破坏,可以使用Unsafe这个类。这个类是属于sun.*API中的类,并且它不是J2SE中真正的一部份,因此你可能找不…...
wordpress 主题推荐/宁波网站建设与维护
1.深度优先搜索-dfs 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发…...