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[必填] 源图像缓冲区&…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
