BBR 与 AIMD 共存公平性探究

news2024/9/26 1:26:54

一个古已有之的结论:

  • deep buffer 场景,bbr 相对 reno/cubic 等 aimd 有优势,侵占性强;
  • shallow buffer 场景,aimd 有优势,bbr 带宽被挤占。

本文用实例分析 why 并给出 how。

先看 deep buffer 场景 bbr 单挑 aimd 双流的效果,下图是标准 bbr,被虐成经理:
在这里插入图片描述
下图是用 max(bw/delay) 替代 maxbw 后的效果(小尖角是 probertt):
在这里插入图片描述

是不是好很多?max(bw/delay) 替换 maxbw 后的代码如下:

for n in range(1, len(times)):
    if n > WIN + 1:
        sublistx = ex[n - WIN : n]
        sublisty = ey[n - WIN : n]
        sublistz = ez[n - WIN : n]
        max_ex = max(sublistx)
        max_ey = max(sublisty)
        max_ez = max(sublistz)
        idxx = sublistx.index(max_ex) + n - WIN
        idxy = sublisty.index(max_ey) + n - WIN
        idxz = sublistz.index(max_ez) + n - WIN
        print(idxx, idxy, idxz)
        print(max_ex, max_ey, max_ez)
        e_x = x[idxx]
        e_y = y[idxy]
        e_z = z[idxz]
    else:
        e_x = x[n-1]
        e_y = y[n-1]
        e_z = z[n-1]
    if n / RTTWIN > 1:
        Rmin = min(r[n - RTTWIN:n])
    else:
        Rmin = R
    x[n] = x[n-1] + dt * (C*(g*e_x*Rmin)/(g*e_x*Rmin + wy[n-1] + wz[n-1]) - x[n-1])
    y[n] = y[n-1] + dt * (C*(g*e_y*Rmin)/(g*e_y*Rmin + wx[n-1] + wz[n-1]) - y[n-1])
    z[n] = z[n-1] + dt * (C*(g*e_z*Rmin)/(g*e_z*Rmin + wx[n-1] + wy[n-1]) - z[n-1])
    # 瞬时模型方程为: x[n] = C*(g*e_x*Rmin)/(g*e_x*Rmin + wy[n-1] + wz[n-1])

    if n % RTTWIN == 0:
        wx[n] = 4
        wy[n] = 4
        wz[n] = 4
    else:
        wx[n] = wx[n-1] + dt * (x[n]*Rmin - wx[n-1])
        wy[n] = wy[n-1] + dt * (y[n]*Rmin - wy[n-1])
        wz[n] = wz[n-1] + dt * (z[n]*Rmin - wz[n-1])
        # 瞬时模型方程为:wx[n] = x[n]*Rmin
    r[n] = (wx[n] + wy[n] + wz[n]) / C
    if r[n] < R:
      r[n] = R
    ex[n] = x[n]/r[n]
    ey[n] = y[n]/r[n]
    ez[n] = z[n]/r[n]

但依然做不到随行,因为 max(bw/delay) 共识属于 “仁义” 共识,而 aimd 是富含侵略性的,max(bw/delay) 能确保统计作用下 minrtt 随行,但 aimd 流比较少时依然会受 probertt 本身影响,minrtt 轻微增长甚至不变,bbr 反而更加吃亏。

这里的随行讲的是 bbr 的 rtt 可以随行 aimd,一种显然的自适应的方法就是用 (r[n-1] + Rmin)/2 替换 Rmin,理由如下:

  • 如果纯 bbr 共存,r[n-1] 接近 Rmin,除以 2 后约等于 Rmin;
  • 如果与 aimd 共存,r[n-1] 增大周期比 Rmin 更小,攀升更快,bbr 随行计算 bdp。

一般将 buffer >= bdp 时称作 deep buffer,buffer 在 bdp 内的为 shallow buffer,详情可参考雅各布森管道的阐释。

上述算法在 buffer 大于 bdp 时随行收敛效果非常好,先看 2 倍 bdp deep buffer 场景:
在这里插入图片描述

5 倍 bdp 的 deep buffer 场景:
在这里插入图片描述

接着是 100 倍:
在这里插入图片描述

但在 shallow buffer 场景就看起来显示出了侵占性:
在这里插入图片描述

可这并不怪 bbr 的侵占性,因为按照雅各布森的管道理论,在 buffer 不足一个 bdp 时,经历一次 multiplicative decrease 后,其 inflt 一定会落到 bdp 之下,而 bbr 会趁机拿到这部分空闲资源,这并不怪 bbr,而是 aimd 本质决定的。

代码如下修改即可测试:

for n in range(1, len(times)):
    if n > WIN + 1:
        sublistz = ez[n - WIN : n]
        max_ez = max(sublistz)
        idxz = sublistz.index(max_ez) + n - WIN
        e_z = z[idxz]
    else:
        e_z = z[n-1]
    if n / RTTWIN > 1:
        Rmin = min(r[n - RTTWIN:n])
        Rmax = max(r[n - RTTWIN:n])
    else:
        Rmin = R
    x[n] = x[n-1] + dt * (C*(wx[n-1])/(wx[n-1] + wy[n-1] + wz[n-1]) - x[n-1])
    y[n] = y[n-1] + dt * (C*(wy[n-1])/(wy[n-1] + wx[n-1] + wz[n-1]) - y[n-1])
    z[n] = z[n-1] + dt * (C*(g*e_z*(Rmin+r[n-1])/2)/(g*e_z*(Rmin+r[n-1])/2 + wx[n-1] + wy[n-1]) - z[n-1])

    wx[n] = wx[n-1] + I
    wy[n] = wy[n-1] + I
    if n % RTTWIN == 0:
        wz[n] = 4
    else:
        wz[n] = wz[n-1] + dt * (z[n]*(r[n-1] + Rmin)/2 - wz[n-1])
    if wx[n] + wy[n] + wz[n] > B*C*R:
        wx[n] /= 2
        wy[n] /= 2
    r[n] = (wx[n] + wy[n] + wz[n]) / C
    if r[n] < R:
      r[n] = R
    ez[n] = z[n]/r[n]

但上述 (r[n-1] + Rmin)/2 替换 Rmin 的方法促进了 bbr 的侵略性,因为 bbr 几乎会占掉一半(偏少一点,恰好接近 1/3)的资源,剩余的由其它 aimd 均分,这就从 bbr 吃亏走向了 bbr 侵占的另一个极端。

希望 aimd 和 bbr 之间完全公平的企图是徒劳的,这二者完全是不同的机制,互不通有无,奈何?

在更符合现实的统计复用场景,同步 aimd 很少见,加入 red 会更加真实,剩下的就是调参:

  • 缩小 PROBERTT_WIN,提高 Rmin 灵敏性,有助于 bbr 的 rtt 随行;
  • 削弱但不取消 max(bw / delay) 共识,增加 bbr 随行概率但不增加侵占性。

当我将 probertt 周期缩减 10 倍(稍微极端点),bbr 单挑 3 条 aimd 流,效果如下:
在这里插入图片描述

当放大 RTTWIN 到 400 时,大概就无力回天了:
在这里插入图片描述

这不难解释,因为越大的 RTTWIN,越小的 Rmin 被记忆的时间越久,生效的时间越久,rtt 越难以随行。

而以下是 E_best window 分别为 3 和 15 时的效果,设得更小,效应越弱:
在这里插入图片描述

反之,在 E_best_WIN 很大时,谦让导致恶果:
在这里插入图片描述

这也不难解释,因为最大的 bw / delay 被记忆越久,对应的 bw 生效越久,而在 aimd 场景,buffer 占据是持续变化的,bbr 要跟随上去的唯一方式就是基于更新的最大 bw / delay 对应的 bw 尽快 probe,而不是用旧的。

之所以没有彻底干掉 E_best 共识,因为在 probe 正当时,bbr 需要适可而止,bbr 需要的是事后被动跟随,而不是主动引领(《道德经》二十九章,“…物或行或随…”),前者需要更小的 E_best_WIN,后者需要 E_best 本身。

以下是代码片段:

for n in range(1, len(times)):
    if n > WIN + 1:
        sublistz = ez[n - WIN : n]
        max_ez = max(sublistz)
        idxz = sublistz.index(max_ez) + n - WIN
        e_z = z[idxz]
    else:
        e_z = z[n-1]
    if n / RTTWIN > 1:
        Rmin = min(r[n - RTTWIN:n])
        Rmax = max(r[n - RTTWIN:n])
    else:
        Rmin = R
    x[n] = x[n-1] + dt * (C*(wx[n-1])/(wx[n-1] + wy[n-1] + wz[n-1] + wv[n-1]) - x[n-1])
    y[n] = y[n-1] + dt * (C*(wy[n-1])/(wy[n-1] + wx[n-1] + wz[n-1] + wv[n-1]) - y[n-1])
    v[n] = v[n-1] + dt * (C*(wv[n-1])/(wv[n-1] + wx[n-1] + wy[n-1] + wz[n-1]) - v[n-1])
    z[n] = z[n-1] + dt * (C*(g*e_z*(Rmin + r[n-1])/2)/(g*e_z*(Rmin + r[n-1])/2 + wx[n-1] + wy[n-1] + wv[n-1]) - z[n-1])

    wx[n] = wx[n-1] + I
    wy[n] = wy[n-1] + I
    wv[n] = wv[n-1] + I
    if n % RTTWIN == 0:
        wz[n] = 4
    else:
        wz[n] = wz[n-1] + dt * (z[n]*(r[n-1] + Rmin)/2 - wz[n-1])
    if wx[n] + wy[n] + wv[n] + wz[n] > B*C*R:
        if random.choice([0, 1]) == 1:
            wx[n] /= 2
        if random.choice([0, 1]) == 1:
            wy[n] /= 2
        if random.choice([0, 1]) == 1:
            wv[n] /= 2
    r[n] = (wx[n] + wy[n] + wz[n] + wv[n]) / C
    if r[n] < R:
      r[n] = R
    ez[n] = z[n]/r[n]

真理止于经理,狼狈始于西装。

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

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

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

相关文章

Rust的数据类型

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust到底值不值得学&#xff0c;之一 -CSDN博客 Rust到底值不值得学&#xff0c;之二-CSDN博客 3.5 数据类型的定义和分类 在Rust…

使用html+css+layui实现动态表格组件

1、概述 需求,表格第一列指标可配置通过后端api传进来,表格显示数据以及鼠标触摸后气泡弹出层提示信息都是从后端传过来,实现动态表格的组件!!实现效果如下: 接口标准数据格式如下: {"data": {"date": ["8.20","8.21","…

Cmd终端

组策略停止更新 windows用户的分类 system&#xff08;系统用户&#xff09; administrator&#xff08;管理员用户&#xff09; 普通用户 访客用户 网络管理类命令练习 ping&#xff1a;用于测试网络连接是否正常。通过发送ICMP&#xff08;Internet Control Message Protoco…

力扣 | 递归 | 区间上的动态规划 | 486. 预测赢家

文章目录 一、递归二、区间动态规划 LeetCode&#xff1a;486. 预测赢家 一、递归 注意到本题数据范围为 1 < n < 20 1<n<20 1<n<20&#xff0c;因此可以使用递归枚举选择方式&#xff0c;时间复杂度为 2 20 1024 ∗ 1024 1048576 1.05 1 0 6 2^{20…

Linux--目录与文件操作函数

一、目录和&#xff08;硬&#xff09;链接 可在 shell 中利用 ln 命令为一个业已存在的文件创建新的硬链接 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 2. 同一文件的所有名字&#xff08;链接&#xff09;地位平等—没有一个名字&#xff08;比如…

计应8-01-作业1-静态网页

IP C:\Users\WL>ipconfig // win 查看 ip Windows IP 配置以太网适配器 以太网: //连接特定的 DNS 后缀 . . . . . . . :本地链接 IPv6 地址. . . . . . . . : fe80::6c95:9da6:140c:c59e%13IPv4 地址 . . . . . . . . . . . . : 192.168.51.243//子网掩码 . . . .…

mysql阿拉伯数字转换中文数字函数

函数如下 1.中间一部分代码可以提取出来作为公共方法&#xff0c;我这里并没有提取&#xff0c;因为我是在代码中动态添加的 2.样式目前只做了&#xff1a;123转为一百二十三这类的 drop function if EXISTS zz_convert_number_chinese; create FUNCTION zz_convert_number_…

ELK系列之四---如何通过Filebeat和Logstash优化K8S集群的日志收集和展示

前 言 上一篇文章《日志不再乱: 如何使用Logstash进行高效日志收集与存储》介绍了使用ELK收集通用应用的日志&#xff0c;在目前大多应用都已运行在K8S集群上的环境&#xff0c;需要考虑怎么收集K8S上的日志&#xff0c;本篇就介绍一下如何使用现有的ELK平台收集K8S集群上POD的…

新型供应链攻击手法 — “Revival Hijack”

JFrog 的网络安全研究人员发现了一种名为“Revival Hijack”的新型 PyPI 攻击技术&#xff0c;该技术利用包删除策略绕过安全检查。据统计&#xff0c;超过 22,000 个程序包处于风险之中&#xff0c;可能会影响数十万名用户。 JFrog 的网络安全研究人员发现了一种用于攻击 Pyth…

易灵思时钟输出问题记录

在添加 GPIO时&#xff0c;设置Mode为clkout,并在output Clock中输入时钟名。 这里需要 注意的是&#xff0c; 1. 时钟名不能从core直接输出&#xff0c;而只能使用interface中使用的时钟&#xff0c;如PLL输出的时钟或者GCLK输入的时钟。 2. 易灵思输出时钟不能做其他用途&a…

2024中国产业园区运营商50强榜单揭晓:行业洗牌加速,数智化是关键!

近日&#xff0c;备受瞩目的“2024年度中国产业园区运营商50强”榜单正式揭晓&#xff0c;不仅照亮了行业内的领军之星&#xff0c;更为我们揭示了产业园区运营管理平台在推动经济转型升级中的关键力量与未来趋势的璀璨图景。 从以上产业园区运营商 50 强的角度来看&#xff0…

30岁程序员的焦虑:转行还是继续死磕?现在什么方向更有前景?

最适合转入AI大模型的莫过于程序员和在读大学生了吧。 对于程序员来说&#xff0c;码农之路并不是一帆风顺。对于每一个入行IT业的社会青年来说&#xff0c;谁不是抱着想要成为最高峰的技术大咖或者跃进管理岗的小目标&#xff1f; 然而往往更多的人并非互联网吹捧的如此耀眼…

云原生技术:‌引领数字化转型的新浪潮

云原生技术&#xff1a;‌引领数字化转型的新浪潮 在数字化转型的时代背景下&#xff0c;‌企业面临着前所未有的挑战与机遇。‌随着云计算技术的飞速发展&#xff0c;‌云原生技术作为一种新型的应用程序开发和部署方式&#xff0c;‌正逐步成为构建高可用、‌可扩展应用程序…

MySQL复习1

基本概念 OLTP OLTP&#xff08;On-Line transaction processing&#xff09;翻译为联机事物处理&#xff1b;主要对数据库增删改查。 OLTP 主要用来记录某类业务事件的发生&#xff1b;数据会以增删改查的方式在数据库中更新处理操作&#xff0c;要求实施性强&#xff0c;稳…

OS_程序的装入与链接

2024.09.05&#xff1a;操作系统程序的装入与链接学习笔记 第12节 程序的装入与链接 2.1 程序的装入2.1.1 绝对装入方式2.1.2 可重定位装入方式&#xff08;静态重定位&#xff09;2.1.3 动态运行时装入方式&#xff08;动态重定位&#xff09; 2.2 程序的链接2.2.1 静态链接方…

LIN总线CAPL函数—— 检查LIN报头的时间(ChkStart_LINHeaderToleranceViolation

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

高级算法设计与分析 学习笔记3 哈希表

首先我们要讨论一个把n个数据放到列表S里面的问题&#xff1a; 但很显然&#xff0c;这些数据的范围有多大这个T就得有多大&#xff0c;而实际上要放的数字可能就几个&#xff08;比如就放一个1和一个10000000&#xff0c;那我还是要准备一个巨大的T&#xff09;&#xff0c;不…

【STM32】cubemx配置GPIO

直接使用STM32CubeMX点灯 使用之前的工程 配置GPIO 对四个灯设置GPIO输出 close后直接打开keil 演示

基于LangChain+LLM的相关技术研究及初步实践

0 1 概述 大模型概述 大模型是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成&#xff0c;拥有数十亿甚至数千亿个参数。大模型的设计目的是为了提高模型的表达能力和预测性能&#xff0c;能够处理更加复杂的任务和数据。大模型在各种领…

提高 Facebook 参与度的 8个技巧

在社交媒体中&#xff0c;Facebook仍然是企业与受众建立联系的重要渠道。无论你是刚刚建立 Facebook 业务主页&#xff0c;还是经验丰富的营销人员&#xff0c;都必须了解人们如何跟你的主页互动。 一、什么是 Facebook 参与度&#xff1f; Facebook的参与度是指用户对你的 F…