tcp bbr pacing 的对与错

前面提到 pacing 替代 burst 是大势所趋,核心原因就是摩尔定律逐渐失效,主机带宽追平交换带宽,交换机不再能轻易吸收掉主机突发,且随着视频类流量激增,又不能以大 buffer 做带宽后备。因此,主机必须 pacing。

再看一下到底什么是 bufferbloat。bufferbloat 不是一个瞬时行为,而是持续行为。举个例子就能明白。为什么中国大河流域大湖少,因为中国地形东西落差太大,百川东到海,势能足够,吞吐就够大,足以抹平任何堰塞:
在这里插入图片描述

对任何流体,特别是大突发流体,buffer 一旦填充,除非上游主动排空,buffer 很难排空,只要有填充态 buffer 就必然增加时延。一般倾向是,buffer 无论多大,若不加干涉,总会被填满。不加干涉的流体本质就是 capacity-seeking,不信你自己挖一个水平的渠道,中间某些地方加宽一点,然后从一端灌水观察一下。

aimd 只能事后解决 bufferbloat 后的可用性收敛问题,解决不了 bufferbloat 本身,即使在大流量下,统计意义上,所需 buffer 数量也和流数量的 1/2 次方成正比,而且还要配合复杂的 red aqm 等技术。

所以,解决 bufferbloat 要么下游加大带宽,要么上游减少突发。端到端标准建议是后者,即从主机开始就 pacing,而 bbr 是一个 “如何计算主机 pacing rate” 的一个实例。至于加大带宽,端到端无力干涉,未来可能会是链路并行化,而这必然导向多路径,但这是后话,本文不谈。

说到底,主机似乎必须 pacing。但这引入另一个关于 bbr 的问题:

  • 端到端的全链路是 n 跳而非 1 跳链路,而主机 pacing 只能影响第一跳 buffer 状态,但 bbr pacing 计算则基于全链路 bottleneck 带宽。

很简单的一个 use case:如果共享第一跳 a 的流 1 的 bottleneck bw 大于 流 2 的 bottleneck bw,它们都在 a 获得 bottleneck bw,而流 2 和流 3 共享最后一跳 b:
在这里插入图片描述

除非所有 bbr 一起 probe,否则 bbr 的状态机非常脆弱,它不是稳定的。bbr probe 效果并非如论文所说为探测空闲资源,现实中,在多流共享全链路场景不得已的行为,系统本身不稳定,bbr 需要不停 probe 扶正,而计算的代价非常大,这也不是算不算的准的问题,而是不得不计算,胡乱写一个 probe gain 系数都 ok,但必须做。

主机 pacing 的问题在于,一旦堆积 buffer,pacing rate 越小 buffer 占比越低,结果是获得带宽越小。交换机要考虑多流带宽复用,让交换机根据 buffer 状态和排队规则分配带宽才是正解,因为主机计算的 pacing rate 到了交换机并不算数,交换机根本无视这个 pacing rate,它是无效的。

为什么我说每条流跟踪 max(bw / rtt)->b 和 minrtt 并基于此控制自己的 inflight 是对的:

  • b * minrtt 意味着不主动堆 buffer,b 不一定最大,但 b / rtt 一定最优;
  • inflight += (minrtt / rtt) * beta 增加固定余量动态发现带宽变化,这 buffer 堆积算是动态自适应的代价;
  • (minrtt / rtt) 修正 minrtt 本身的 buffer 堆积,因为 minrtt 本身也是统计最小值,不意味着不排队。

理论上,所有流的 (minrtt / rtt) * beta 就是整个网络中所有 buffer 的和,至于每条流的 bdp 余量到底堆积在哪,由整个网络的当前状态决定,这个状态是个统计状态,本质上是概率问题,上述三点保证全网收敛,但千万别精确计算。

去掉 bbr 不合理的假设就都合理了,也变简单了。bbr 的问题在于试图在统计环境中通过计算描述一个确定状态,相当于控制风力和风向时计算每个空气分子动量,显然,只需要控制单位面积的空气分子总量和外力方向就可以了。

那主机可以不 pacing 吗,显然不可以,为了降低第一跳突发减少第一跳 bufferbloat,所有主机固定 pacing 也不是不行,比如 500mbps pacing,而不是以主机能力突发。至于后面的跳,主机控制不了,只能交换机做。如果交换机为提高出口能效,塞住出口 10ms,buffer 占有率达到一定量再批量发送,拦了一座大坝,那就谁也没办法。

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

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

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

相关文章

A-1:树状数组

A-1:树状数组 1.介绍Q1:树状数组解决什么问题?Q2:树状数组的使用1.前置知识:lowbit(x)2.单点修改3.求[1,n]的和4.区间查询5.hh Q3:树状数组是否优化了Q4:上图上例子解释上面说的东西(Important) 2.习题练习 1.介绍 树状数组是一个比较难以理解的高级数据…

C语言---单链表(二)

文章目录 前言1.准备工作2,打印链表、创建新的节点、销毁链表2.1.打印链表2.2.创建节点2.3.销毁链表 3.尾插、头插、尾删、头删3.1.尾插3.2.头插3.3.尾删3.4.头删 4.在特殊位置之前、之后插入、删除以及查找节点4.1.查找节点4.2.在指定位置之前插入4.3.在指定位置之后插入数组4…

亚信安全入选中国数据安全市场图谱

近日,全球领先的IT市场研究和咨询公司IDC发布了《IDC Market Glance:中国数据安全市场图谱,2024》报告(以下简称“报告”),报告展示了中国数据安全市场的构成和格局,遴选出不同细分市场领域的主…

C语言中的结构体:从定义到传递

前言 结构体是C语言中一种重要的数据类型,它允许我们将不同类型的数据组合成一个整体,并以自定义的方式进行操作。通过结构体,我们可以更加灵活地管理和处理复杂的数据结构,从而提高程序的可读性和可维护性。本篇博客将从结构体的…

jetcache fastjson 泛型复杂对象JSON序列 ,反序列化

Jetcache fastjson 泛型复杂对象JSON序列 ,反序列化 默认的FastJson2 序列化存在问题增强FastJson 支持Encode 编码器Decode 解码器 默认的FastJson2 序列化存在问题 默认的序列化不能转换List 中的泛型数据类型, 从缓存拿取的list集合对象数据全部都转换成了JSONObject 增强F…

nginx--Nginx转发真实的IP

Nginx转发真实的IP 前言给nginx.conf 设置proxy_set_headerjava 程序里获取 前言 在使用nginx的时候可能会遇到判断是不是本机在做操作,这样的话web端我们是可以通过ip和端口进行远程连接的这样的话我们就需要从后端获取到真实ip来判断是不是指定的机器了&#xff…

Linux 序列化、反序列化、实现网络版计算器

目录 一、序列化与反序列化 1、序列化(Serialization) 2、反序列化(Deserialization) 3、Linux环境中的应用实例 二、实现网络版计算器 Sock.hpp TcpServer.hpp Jsoncpp库 Protocol.hpp 类 Request 类 Response 辅助函…

稳压二极管仿真实验

稳压二极管仿真实验 1、稳压管稳压实验 用Multisim搭建如下的仿真电路图,选用5.1V的稳压管,12V的直流电源,开启仿真后,12V电压将稳压管击穿,稳压管将两端的电压稳压到5.07V,该电压与限流电阻R1的阻值有关…

跟着Carl大佬学leetcode之977 有序数组的平方

来点强调,刷题是按照代码随想录的顺序进行的,链接如下https://www.programmercarl.com/本系列是记录一些刷题心得和学习过程,就看到题目自己先上手试试,然后看程序员Carl大佬的解释,自己再敲一遍修修补补,练…

msyql中SQL 错误 [1118] [42000]: Row size too large (> 8126)

场景: CREATE TABLE test-qd.eqtree (INSERT INTO test.eqtree (idocid VARCHAR(50) NULL,sfcode VARCHAR(50) NULL,sfname VARCHAR(50) NULL,sfengname VARCHAR(50) NULL,…… ) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_general_ci;或 alter table eqtre…

Token 在 LLM

大语言模型不能理解原始文本,所以需要把原始文本转换成大语言模型可以理解的数字表示形式,经过大模型处理以后,需要将该数字表示形式转换为人可以理解的文本。 原始文本到 token 原始文本转换为token序列的过程通常是在LLM的预处理阶段完成的。 在大型语言模型(LLM)中,tok…

力扣:LCR 022. 环形链表 II

力扣:LCR 022. 环形链表 II 给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链…

学习java时候的笔记(十九)

正则表达式 作用: 校验字符串是否满足规则在一段文本中查找满足要求的内容 字符类(只匹配一个字符) 说明[abc]只能是a,b或c[^abc]除了a,b,c之外的任何字符[a-zA-Z]a 到 z, A 到 Z(范围)[a-d[m-p]]a 到 d, 或 m 到 p[a - z && [def]]a 到 z和def的交集。为: d, e, f…

【树莓派学习】系统烧录及VNC连接、文件传输

【树莓派学习】系统烧录及VNC连接、文件传输 Raspberry Pi is a series of small single-board computers (SBCs) developed in the United Kingdom by the Raspberry Pi Foundation in association with Broadcom. Since 2013, Raspberry Pi devices have been developed and…

Ubuntu20.4版本安装ROS教程

一、配置源 安装成功的Ubuntu系统自带的工具下载速度慢,不太好用,所以我们可以使用国内稳定高速且免费的镜像网站。 清华源:https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云:https://mirrors.aliyun.com/pypi/simple 中科大&…

启动 UE4编辑器报 加载 Plugin 失败

启动 UE4编辑器报 加载 Plugin 失败,报如下错误: Plugin ‘SteamVR’ failer to load because module ‘SteamVR’ could not be found. Please ensure the plugin is properly installed, otherwise consider disabling the plugin for this project. …

TorchEEG文档_学习笔记1【代码详解】

文章目录 一、用户文档1.安装Pytorch2.安装TorchEEG3.安装与图算法的插件 二、教程1.使用TorchEEG完成深度学习工作流程2datasets模块3.transforms模块4.models模块5.trainer模块6.使用Vanilla PyTorch训练模型 一、用户文档 1.安装Pytorch TorchEEG依赖于PyTorch,根据系统、…

MYSQL之增删改查(下)

前言: 以下是MySQL最基本的增删改查语句,很多IT工作者都必须要会的命令,也 是IT行业面试最常考的知识点,由于是入门级基础命令,所有所有操作都建立在单表 上,未涉及多表操作。 4.3 高级查询 4.3.1 聚合函…

Navicat 干货 | 了解 PostgreSQL 规则

PostgreSQL 是一个强大的开源关系型数据库管理系统,为增强数据管理和操作提供了丰富的功能。这些功能中包含了规则,这是一种用于控制数据库内部查询和命令处理方式的机制。本文将探讨 PostgreSQL 规则的工作原理,以及它们与触发器的区别&…

实验室三大常用仪器1---示波器的基本使用方法(笔记)

目录 示波器的作用 示波器的基础操作方法 示波器测量突变脉冲 示波器的作用 示波器能帮助我们干什么? 比如说某个电源用万用表测量是稳定的5V输出 但是用示波器一看确实波涛汹涌 这样的电源很可能回导致系统异常工作 又比如电脑和单片机进行串口通信时&#xf…