BBR/CUBIC 共存时的 buffer 挤兑

2023-10-13 11:59
文章标签 共存 buffer bbr cubic 挤兑

本文主要是介绍BBR/CUBIC 共存时的 buffer 挤兑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

BBR 与 CUBIC 共存时的收敛图,理论情况:
在这里插入图片描述
理论上 BBR 不会挤占 buffer,inflight 保持为恒定的 BDP。 但 BBR 的 inflight 做不到恒定,多流共存时,依然会 “主动占用 buffer” 而相互挤兑带宽,而该行为是必须的。

BBR 的本意用 gain = 125% 去 probe,若带宽没增加,说明已挤占 buffer,然后以 gain = 0.75 将 queue 给 drain 回去。但现实中,多流共存时,只要以 gain > 1 执行 probe,就一定能挤兑出带宽,该更大的带宽会被 max-filter 记住作为新的 bw。

该行为乃 BBR 多流公平性所必须:带宽占比越大,MI(Multiplicative-Increase)加速比越小。
不利用 buffer 就无法收敛到公平,在实际中,由于带宽固定,buffer 无需大量占用即可收敛到公平,尚可。

BBR 和 BBR 共存时,靠 125% probe 挤兑 buffer 可公平收敛,但问题是,BBR 和 CUBIC 共存时,同样的行为反而破坏公平性:CUBIC 以 AI 增加 inflight,BBR 以 MI 增加 inflight,CUBIC 靠 buffer overflow 丢包 MD 收敛,可 BBR 呢?二者使用不同的策略。

即使在众所周知 AIMD 占绝对优势的深队列场景,BBR 的 125% probe 行为依然具有一定的抢占力:只要以 gain > 1 执行 probe,就一定能挤兑出带宽。

如果此次 probe 挤兑力依然大于 CUBIC 的 AI 挤兑力,BBR 的带宽就会增加,直到其带宽加速比小于一定的绝对值,该绝对值不足以对抗 CUBIC 的 AI 增益时,BBR 带宽才会下降。

好在 CUBIC 的 AI probe 曲线和 BBR 公平收敛的预设一致:AI 开始时 cwnd 很小,曲线上凸,达到 Last Max-cwnd 附近转为下凸,AI 变缓。与之配合,BBR 带宽很小时,加速比很大,带宽占比很大时,加速比变小,其变化曲线与 CUBIC 相一致。

综上分析,在深队列场景,CUBIC 并没有压倒性的优势,只是不那么糟糕。在实际中,无论哪种过多占用 buffer 的行为均会受到惩罚,BBR 自身采用 cwnd <= 2*BDP 作为约束,明示 buffer 不能占用超过 1 个 BDP(这已经够多了,Reno 也不过如此,是为上限)。在交换机侧,RED 和多异步流效果相当,参考多异步流平方反比律,这很明显减少了 buffer 的实际使用总量,等效于将深队列削减为中浅队列,从而让公平性更容易得到保障。

最近搜集混部公平性数据,实际网络测试,20Gbps,RTT=80us,4 BBR vs. 4 CUBIC,交换机 10MB buffer,远大于 BDP,属深队列,配置尾丢时并没有展示出 CUBIC 压倒性优势,发现是 gain=125% probe 作祟,改经过 25MB buffer,问题消除,CUBIC 力压 BBR,配置 wRED,无论多大的 buffer,CUBIC 均无优势。得此分析。

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

这篇关于BBR/CUBIC 共存时的 buffer 挤兑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/203078

相关文章

Java 文件读写最好是用buffer对于大文件可以加快速度

参考例子: FileReader fileReader = new FileReader(filename);BufferedReader bufferedReader = new BufferedReader(fileReader);List<String> lines = new ArrayList<String>();String line = null;while ((line =

【Node】Buffer 与 Stream

node 为什么会出现 Buffer 这个模块 在最初的时候,JavaScript 只运行在浏览器端, 对于处理 Unicode 编码的字符串很容易,但是对于处理二进制以及非 Unicode 编码的数据便无能为力。 不过对于 Server 端操作来说 网络I/O 以及 文件I/O 的处理是必须的,所以 Node 中便提供了 Buffer 类处理二进制的数据。 二进制缓冲区 Buffer

Windows 安装mysql 教程,mysql 多版本共存教程,傻瓜式安装教程

mysql 各版本官方下载地址:⬇ ⬇⬇⬇⬇⬇⬇⬇⬇⬇(点击下面链接前往)MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/  首先我本地安装了 mysql8.0版本了,通过msi 进行安装的也就是傻瓜式的点点。这里就不介绍了

【0324】Postgres内核 Shared Buffer Access Rules (共享缓冲区访问规则)说明

0. 章节内容 1. 共享磁盘缓冲区访问机制 (shared disk buffers) 共享磁盘缓冲区有两套独立的访问控制机制:引用计数(a/k/a pin 计数)和缓冲区内容锁。(实际上,还有第三级访问控制:在访问任何属于某个关系表的页面之前,必须持有该关系表的适当类型的锁。这里不讨论关系级锁。) Pins 在对缓冲区做任何操作之前,必须“对缓冲区pin”(即增加其引用计数, re

什么是银行挤兑

银行挤兑是指大量银行客户因为对银行失去信心,担心银行可能无法满足其提款需求,而纷纷在短时间内集中到银行提取现金或转账的行为。这种情况可能会导致银行现金储备迅速减少,进而影响银行的正常运营和金融市场的稳定。 银行挤兑通常发生在以下几种情况:1. 银行出现经营困难,如资产质量恶化、流动性不足等。2. 市场传言或负面消息导致公众对银行失去信心。3. 经济环境不稳定,如金融危机、经济衰退等。4. 政策变动

Java使用类加载器解决类冲突,多版本jar共存

Java使用类加载器解决类冲突 1、案例说明2、打包新版本POI并将要调用的方法封装2.1、POM文件2.2、封装的方法 3、要使用多个POI版本的项目3.1、打包前面的项目生成一个jar包3.1、POM文件3.2、类加载器代码3.3、Jar加载工具3.4、最终调用 1、案例说明 项目中已经有了一个旧版本的poi库,并且这个库的版本无法修改,现在需要引入新版本的poi库,调用其

Netty源码解析1-Buffer

大数据成神之路系列: 请戳GitHub原文: https://github.com/wangzhiwubigdata/God-Of-BigData 上一篇文章我们概要介绍了Netty的原理及结构,下面几篇文章我们开始对Netty的各个模块进行比较详细的分析。Netty的结构最底层是buffer机制,这部分也相对独立,我们就先从buffer讲起。 What:buffer简介 buffer中文

BBR 与 AIMD 共存公平性探究

一个古已有之的结论: deep buffer 场景,bbr 相对 reno/cubic 等 aimd 有优势,侵占性强;shallow buffer 场景,aimd 有优势,bbr 带宽被挤占。 本文用实例分析 why 并给出 how。 先看 deep buffer 场景 bbr 单挑 aimd 双流的效果,下图是标准 bbr,被虐成经理: 下图是用 max(bw/delay) 替代 ma

TCP拥塞控制算法BBR源码分析

BBR是谷歌与2016年提出的TCP拥塞控制算法,在Linux4.9的patch中正式加入。该算法一出,瞬间引起了极大的轰动。在CSDN上也有众多大佬对此进行分析讨论,褒贬不一。   本文首先对源码进行了分析,并在此基础上对BBR算法进行总结。 1.源码分析 /* Bottleneck Bandwidth and RTT (BBR) congestion control** BBR co

【LINUX】“dmesg: read kernel buffer failed: Operation not permitted“ 错误

出现 “dmesg: read kernel buffer failed: Operation not permitted” 错误通常是因为当前用户没有权限读取内核日志缓冲区 这可以通过修改内核参数 kernel.dmesg_restrict 来解决。 你可以尝试以下命令来允许非特权用户读取内核日志: sudo sysctl -w kernel.dmesg_restrict=0 这个命令