BBR学习笔记--什么是BBR、可调整的参数
Reno、Cubic都是基于丢包的拥塞控制算法,Cubic适用场景是高带宽的,但现在丢包不一定是发生拥塞了,比如Bufferbloat(缓冲区膨胀),路由器的缓冲区满了的丢包。
一 基于模型的拥塞控制,分别测BltBw--瓶颈带宽、RTprop--即RTT。
图是google论文里的。
分为:应用受限--测RTT--管道没满、
带宽受限--测BltBw--管道满了,缓存没满,
缓存受限--管道满了,缓存满了。
(tcp_bbr.c的英文注释挺有帮助的。)
On each ACK, update our model of the network path:
bottleneck_bandwidth = windowed_max(delivered / elapsed, 10 round trips)
min_rtt = windowed_min(rtt, 10 seconds)
pacing_rate = pacing_gain * bottleneck_bandwidth
cwnd = max(cwnd_gain * bottleneck_bandwidth * min_rtt, 4)
//最后作用于发送拥塞窗口。/*A BBR flow starts in STARTUP, and ramps up its sending rate quickly.* When it estimates the pipe is full, it enters DRAIN to drain the queue.* In steady state a BBR flow only uses PROBE_BW and PROBE_RTT.* A long-lived BBR flow spends the vast majority of its time remaining* (repeatedly) in PROBE_BW, fully probing and utilizing the pipe's bandwidth* in a fair manner, with a small, bounded queue. *If* a flow has been* continuously sending for the entire min_rtt window, and hasn't seen an RTT* sample that matches or decreases its min_rtt estimate for 10 seconds, then* it briefly enters PROBE_RTT to cut inflight to a minimum value to re-probe* the path's two-way propagation delay (min_rtt). When exiting PROBE_RTT, if* we estimated that we reached the full bw of the pipe then we enter PROBE_BW;* otherwise we enter STARTUP to try to fill the pipe.
*/
二 四种状态机:
1 Startup:快速增速,使管道充满数据。3次增速不超过25%,进入Drain。
static const u32 bbr_full_bw_thresh = BBR_UNIT * 5 / 4;
2 Drain:清空Startup阶段多余的队列数据。inflight<=BDP,进入Probe_BW。
BDP=瓶颈带宽*RTT。
3 Probe_BW:大部分处于这个稳定状态,10s,min_rtt不变,进入Probe_RTT。
4 Probe_RTT:探测带宽是最大值,回到Probe_BW。持续200ms,snd_cwnd=4。
static const u32 bbr_cwnd_min_target = 4;
static const u32 bbr_probe_rtt_mode_ms = 200;
static const u32 bbr_min_rtt_win_sec = 10;
三 调整参数
pacing_gain=2.89,这个值变化过,优化后取2,因为接收方不是一收到数据就给一个确认。
Startup:pacing_gain= cwnd_gain=2.89。
Drain:pacing_gain =0.35,cwnd_gain=2.89。
Probe_bw:pacing_gain =[1.25,0.75,1,1,1,1,1,1],cwnd_gain=2。
Probe_rtt:pacing_gain= cwnd_gain=1,cwnd固定为4。
Probe_bw如何探测?
一组8个节拍
pacing_gain=1.25,RTT没变大,BltBW更新为更大的速率。RTT变大,BltBW不变。
pacing_gain=0.75,0.75倍BDP,放空管道的buffer。
bbr_is_next_cycle_phase(struct sock *sk,
const struct rate_sample *rs)
满足条件,cycle_idx+1,bbr_check_full_bw_reached、bbr_check_drain、bbr_update_min_rtt、
bbr_update_gains。
如何pacing?
/* NOTE: BBR might be used with the fq qdisc ("man tc-fq") with pacing enabled,
* otherwise TCP stack falls back to an internal pacing using one high
* resolution timer per TCP socket and may use more resources.
*/
1 tcp主动pacing,设置为SK_PACING_NEEDED。耗cpu,默认方式。
cmpxchg(&sk->sk_pacing_status, SK_PACING_NONE, SK_PACING_NEEDED);
2 依赖tc-fq的pacing。
tc qdisc add dev xxx root fq //enable fq
四 其它
RTT状态下不参与BW最大值计算。
当监测到使用令牌桶算法时,直接使用长期采样,避免频繁采样。
函数是bbr_lt_bw_sampling。
疑问:windows端到linux服务器,这部分怎么优化?
还是网络延时主要是服务器之间传输的优化?
五 BBR2优化点
1 bbr v1和reno一起,抢占带宽太厉害了,从90%到50%。
Drain排空一次到位。
退出Startup条件:1 丢包大于1%且丢包8个,进入drain。
2 路由器标记ECN的比例超过50%。
2 cwnd=4太影响体验了,改为:inflight = 0.75 bdp,在Probe_RTT状态。
进入Probe_RTT改为:2.5秒没有探测到更小的min_rtt,原来是10s。
3 Probe_BW细分up、down、cruise—巡航、refill。
BBR学习笔记--什么是BBR、可调整的参数相关推荐
- [python教程入门学习]python学习笔记(CMD执行文件并传入参数)
本文章向大家介绍python学习笔记(CMD执行文件并传入参数),主要包括python学习笔记(CMD执行文件并传入参数)使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋 ...
- ROS学习笔记六:理解ROS服务和参数
ROS学习笔记六:理解ROS服务和参数 主要介绍ROS服务和参数,同时使用命令行工具rosservice和rosparam. ROS service service是节点之间互相通信的另一种方式,se ...
- PyTorch学习笔记(六)——Sequential类、参数管理与GPU
系列文章\text{\bf 系列文章}系列文章 PyTorch学习笔记(一)--Tensor的基础语法 PyTorch学习笔记(二)--自动微分 PyTorch学习笔记(三)--Dataset和Dat ...
- Dynamic CRM 2013学习笔记(一)插件输入实体参数解析
1. 问题描述 最近新建了一个post事件的插件,传入的参数处理如下: 1: if (context.InputParameters.Contains("Target") & ...
- ESP8266学习笔记7:保存和读取自定义参数
我整理了从2015年至今关于ESP8266的学习笔记,梳理出来了开发环境.基础功能.进阶学习三大部分,方便自己和他人.可点此查看,欢迎交流. 前言 这几天正在使用ESP8266接入机智云,需要保存一些 ...
- OpenCvSharp 学习笔记6 --图像亮度和对比度调整
一 理论: 图像变换有两种操作: 1:点操作 – 像素变换 2:区域操作 --邻域像素操作,图像周围的像素操作 调整图像亮度和对比度属于像素变换的点操作. g(x,y)=αf(x,y)+βg(x,y) ...
- PS学习笔记——通过三种方式调整人像照片亮度
第一种方案: 在图像--调整菜单,有一个亮度/对比度选项.打开这个菜单可以通过简单的拖移滑杆来对图像亮度进行调整. 第二种方案: 依然在图像--调整菜单,使用色阶菜单.与第一种方案有何区别呢?第一种方 ...
- FFmpeg学习笔记--FFplay播放控制、FFplay基本命令参数、FFplay高级命令参数
目录 1--FFplay播放控制 2--FFplay命令参数 1 强制显示宽高,用于调整窗口大小 2 设置帧尺寸,仅适用于没有包含帧大小的视频 3 设置像素格式 4 以全屏模式启动 5 禁用音频.视频 ...
- JVM学习笔记(三):JVM基本参数
1 来源 来源:<Java虚拟机 JVM故障诊断与性能优化>--葛一鸣 章节:第三章 本文是第三章的一些笔记整理. 2 GC日志:-Xlog:gc 要打印GC日志的话,可以加上-Xlog: ...
最新文章
- php 操作分表代码
- MATLAB语法基础
- Spring MVC整合Velocity
- UVa11038 - How Many O's?(统计0的个数)
- IT-标准化-系列-0.课程-V1.0
- 全球及中国生物医药产业供给需求前景与运营风险分析报告2022版
- sicily vector有序插入
- Java操作数据库Sqlite样例代码
- python函数作为参数例题_笨办法学Python 习题 19: 函数和变量
- 我的程序人生以及一些杂项
- 闲谈:我为什么热爱开源
- java 第三方序列化,11.既然有第三方的序列化方式,说明java官方提供的序列化方式应该有一些很明显或者很致命的缺点……...
- c语言设计二级考试程序修改题,全国计算机二级考试C语言复习题与答案解析
- 5G时代到来,那我们现在用的4G手机怎么办?
- 自加++(Java版本)
- ClassNotFoundException和NoClassDefError之间的区别
- c语言 链接器 原理,新手向的链接器知识普及/////就是这样的说
- 画五角星中间没有填充_冷军画两个白色五角星,卖出230万,专家大呼:这不是画...
- 基于改进的残差网络的指纹识别算法
- linux 强制结束任务管理器,结束拒绝访问的进程 cmd下结束进程 强行结束进程
热门文章
- ROC曲线绘制(详细)以及模型选择
- 富可视m310 android 4.4,富可视 M310 4.2.1 ROM刷机包 版本发布公告
- nokia x7 android 9.0,诺基亚X7升级Android 9.0系统 HDR拍照画质大幅提升
- JavaScript函数(看这个就可以了)
- mysql语法大全和jdbc知识汇总
- 用pycharm写python_在PyCharm中使用VPython
- xadmin报cannot import name ‘DEFAULT_FORMATS‘ from ‘import_export.admin‘/cannot import name ‘SKIP_ADMI
- centos 7.2执行yum -y install报错Metadata file does not match checksum
- 计算机软件相关参考文献,计算机软件论文参考文献范文.doc
- linux中find命令详解,Linux下的find指令详解