认识 bufferbloat

news2024/11/18 1:49:45

很多人并不理解 bufferbloat 的本质,我引用《计算机网络-自顶向下方法(第 8 版)》第四章的一个解释:
在这里插入图片描述

很形象的比喻,buffer 就像盐,不可或缺,适量增味,过量食物就不能吃了。高血压患者更有所感受,一旦摄入过量盐,排盐就不是大量喝水能解决的了。

一旦 buffer 里堆满了数据包,它们就很难排空了,特别是在 aimd 这种 capacity-seeking 的作用力下,下面水流的例子更为直观:
在这里插入图片描述

虽然流速一直保持为 v,但相比下图,水流在上图的宽敞处会减慢流速而造成时延增大,如果上游不主动减小流量,水库是不会排空的。

bbr 解决 bufferbloat 之道有两个方法:

  • 从模型上保证 inflight 收敛到 bdp;
  • 定时 probertt 排空 queue,确保基础 rtt。

为了直观看到这个事实,将模型具象化是高尚的,作为对比,单流 bbr 的 inflight 模型非常简单,设 x 为 bbr 单流 inflight,C 为瓶颈带宽,R 为传播时延,方程如下:

d x d t = C ⋅ R − x \dfrac{dx}{dt}=C\cdot R-x dtdx=CRx

这是一个典型的负反馈模型,当 x 大于 bdp,inflight 要减小,避免 bufferbloat,当 x 小于 bdp,inflight 要增大,提高带宽利用率。可见,bbr 专为解决 bufferbloat 而生,inflight 就是 bdp。
而 aimd 则是一个 bufferbloat 制造者模型,以下是一个 “连续 md” 的示例:

beta = 0.5
C, R = 50, 2

# x, z 分别为两条流的 cwnd
def dxdt(x, y, t):
    if y > 0:
        return - beta * x
    else:
        return 1

def dzdt(z, y, t):
    if y > 0:
        return - beta * z
    else:
        return 1

def ydt(a, b, t):
    buff = 2 * C * R
    if (a + b) > buff:
        return 1
    elif False and (a + b) > (buff - int(buff / 4)):
        ret = 2*random.random() - 1
        return ret
    return 0

t = np.linspace(0, 800, 8000)
x = np.zeros_like(t)
y = np.zeros_like(t)
z = np.zeros_like(t)

x[0], z[0] = 1, 250

for i in range(1, len(t)):
    dt = t[i] - t[i - 1]
    dxy = ydt(x[i - 1], z[i - 1], i)
    dzy = ydt(z[i - 1], x[i - 1], i)
    dx = dxdt(x[i - 1], dxy, t[i - 1])
    dz = dzdt(z[i - 1], dzy, t[i - 1])
    x[i] = x[i - 1] + (dx) * dt
    z[i] = z[i - 1] + (dz) * dt

下图可看出,n 条流的 inflight 之和收敛到 bdp + buffer:
在这里插入图片描述

RED 版本结果如下:
在这里插入图片描述

buffer 占量降低了,但带宽利用率是代价。

为了快速收敛,避免拥塞加剧,实践中采用离散 md,即经典的锯齿:

for i in range(1, len(t)):
    dt = t[i] - t[i - 1]
    dy = ydt(x[i - 1], y[i - 1], i)
    dx = dxdt(x[i - 1], dy, t[i - 1])
    dz = dzdt(z[i - 1], dy, t[i - 1])
    if dy > 0:
        x[i] = x[i-1] * (1 - beta)
    else:
        x[i] = x[i - 1] + (dx) * dt

这一次我直接用 bbr 和离散 aimd 对比。bbr 的仿真实现非常简单:

def dzdt(z, y, t):
    if y > 0: # 模拟 bbr 不完备实现,丢包时数据包守恒
        return 0
    inflt = C * R - z
    return inflt

下图是没有 RED aimd 支持的:
在这里插入图片描述

可见,aimd 不达 bdp + buffer 不罢休,而 bbr 止步于 bdp。这意味着,有多大 buffer,aimd 用多大 buffer,buffer 越大,时延越大,这就是 bufferbloat 的恶果。

RED 轻微缓解了这个问题,但也不很:
在这里插入图片描述

多流 bbr 场景,n 条 bbr 流的 inflight 之和收敛到 bdp + probe_size,多日之前我用微分方程建模 bbr 时说过这事(从微分方程组构建 bbr 模型):
在这里插入图片描述

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

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

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

相关文章

STM32是基于ARM架构的,那么ARM究竟是什么呢?

一、什么是ARM 首先,ARM是一家英国公司,全称Advanced RISC Machines,高级精简指令集机器,RISC意味着是精简指令集的芯片。同时也有复杂指令集CSIC的芯片,如X86,常以Intel和AMD为主。 其次,之后…

如何跳过极狐GitLab 密钥推送保护功能?

极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…

vue 子组件全局自动导入,不在需要每个组件import

main.js import vue from vue import App from ./App.vue import axios from axios axios.defaults.baseURL HTTP://LOCALHOST:3000/api/ Vue.prototype.$http axios; vue config.productionTip false; //子组件全局自动导入 const requireComponents require.cont…

MK米客方德推出新一代工业级SD NAND——更长寿命、更高速度、更优功耗

博客目录 关注我,不迷路,共学习,同进步一、产品封装与兼容性二、SLC 存储颗粒的使用三、高性能 IOPS 表现四、智能健康监测功能五、内嵌 ECC 校验、坏块管理和其他保护机制六、低功耗设计总结 作为 SD NAND 领域的领跑者,MK 米客方…

【Chromium】分享一个网址 Chromium Browser Snapshots

利用 Chromium Browser Snapshots 进行开发和调试 author: jwensh & chatgpt date:20240819 文章目录 利用 Chromium Browser Snapshots 进行开发和调试1. 获取最新的浏览器特性2. 测试和调试浏览器兼容性问题3. 开发和测试浏览器扩展4. 安全研究和漏洞分析5. 提前为新特性…

如何一键删除iPhone相册所有照片

拍照已成为我们记录日常生活的常态。但是,大量照片便会积累在设备上,这不仅占用了大量存储空间,而且随着时间的推移,管理这些照片也变得越来越困难。如果你决定清理旧照片,或者出于隐私考虑需要删除所有照片&#xff0…

2024:AI新纪元,轻松打造你的专属AI助手

引入 在数字化时代的潮流中,人工智能已经成为了我们生活中不可或缺的一部分。2024年被誉为“AI元年”,这不仅是因为人工智能技术的飞速发展,更是因为它已经渗透到我们的日常生活中,为我们带来了无数便利和可能性。在这个充满活力…

FPGA使用笔记:GPIO操作方式(用于测试设备io驱动性能)

一、前言 使用FPGA测试IO速率,用于后续驱动高速AD/DA等高速芯片做铺垫,很多芯片的驱动都是使用并行接口,不是使用专用接口的,这样采样速率的快慢就有CPU的时许周期决定了。 本文测试FPGA和STM32,后续如果用到更快的芯…

探索大模型时代:全面解析Agent智能体的奥秘

前言: 在2024年,大模型圈子的Agent是一个绝对热门的话题,agent也被各种各样的公众人物所追捧 Agent智能体能够最大化的激发大模型潜能还有人说agent智能体式大模型时代的APP,也有人说agent是在toB场景落地的主要方式之一 无论任…

信创(国产化)方案

信创 信创,即信息技术应用创新,旨在实现信息技术自主可控 openEuler openEuler是一款开源、免费的操作系统,由openEuler社区运作,前身为运行在华为公司通用服务器上的操作系统EulerOS。openEuler作为一款开源、免费的操作系统&…

QT6.0如何开启白名单保活

1. 概述 使用Qt开发android应用往往会存在这样一个问题:我们的android应用和后台需要时刻保持通信,但是往往我们在切换任务或者息屏,将我们开发的应用变更为后台应用的时候,由于android的电池策略,会将后台的应用关闭掉从而释放资源供其他应用使用.会给应用带来不好的使用…

Dubbo从入门到应用:实战技巧和最佳实践

远程调用 一、Dubbo快速上手提供者DubboService 调用者DubboReference 开启Dubbo调用EnableDubbo 二、Dubbo快速入门1、添加 Dubbo 相关的 maven 依赖。2、定义服务接口3、 定义服务端的实现4、配置服务端及消费端 Yml 配置文件5、基于 Spring 配置服务端及消费端启动类6、消费…

每日学习笔记:C++ STL之堆栈容器stack

目录 stack定义 核心接口 stack class声明 stack class定义 用户自定义的Stack Class C11特色的插入元素的新形式 运用实例 stack定义 核心接口 stack class声明 stack class定义 用户自定义的Stack Class C11特色的插入元素的新形式 运用实例

springboot+vue 初始

1.控制器 2.文件上传拦截器 #过滤规则 # 默认访问static下面的文件http://localhost:8009/4.jpeg, # 带上static-path-pattern/static/**后,http://localhost:8009/static/4.jpeg spring.mvc.static-path-pattern/static/**#静态资源位置 spring.web.res…

【可能是全网最丝滑的LangChain教程】二十一、LangChain进阶之Memory

人生和电影不一样,人生要辛苦多了。 01 Memory介绍 Memory(记忆)是LangChain中的一个重要组成部分,它允许模型在处理请求时能够访问历史对话记录或其他相关上下文信息,从而使得对话更加连贯和自然。 LangChain Memor…

STM32标准库学习笔记-5.定时器-输出比较

参考教程:【STM32入门教程-2023版 细致讲解 中文字幕】 输出比较OC OC(Output Compare)输出比较输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波…

vue使用海康视频web插件如何实现自适应

如果要实现自适应的话&#xff0c;就需要在不同的分辨率内设置不同的宽度和高度&#xff0c;可以监听当前屏幕的宽度和高度(可视区域的宽高)&#xff0c;划分不同的显示阶段 通过设置父级元素的宽度和高度实现子级视频的自适应 index.vue <template><div class&quo…

《机器学习》一元、多元线性回归的实现 No.4

一、一元线性回归实现 先直接看完整代码&#xff1a; import pandas as pd import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegressiondate pd.read_csv(data.csv) #导入数据plt.scatter(date[广告投入],date[销售额]) # 用散点图展示数据 plt.sh…

【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)

前言 终于到了之前C语言没有讲过的数据结构了&#xff0c;那就是二叉树了&#xff0c;关于二叉树的学习难度确实比前面学习的数据结构都要难一点&#xff0c;所以我们这个关于二叉树的博客大概率是有好几篇的。如有哪里出现错误也欢迎指出唔。 二叉树的概念 Java 中的二叉树是…

【Oracle点滴积累】解决ORA-20000: ORA-12899: value too large for column错误的方法

广告位招租&#xff01; 知识无价&#xff0c;人有情&#xff0c;无偿分享知识&#xff0c;希望本条信息对你有用&#xff01; 今天和大家分享ORA-20000: ORA-12899: value too large for column错误的解决方法&#xff0c;本文仅供参考&#xff0c;谢谢&#xff01; A fatal…