bbr :TCP拥塞控制算法
传统 TCP 拥塞控制算法,基于丢包反馈的协议。
基于「丢包反馈」的协议是一种 被动式 的拥塞控制机制,其依据网络中的丢包事件来做网络拥塞判断。即便网络中的负载很高时,只要没有产生拥塞丢包,协议就不会主动降低自己的发送速度。
这种协议可以最大程度的利用网络剩余带宽,提高吞吐量。然而,由于基于丢包反馈协议在网络近饱和状态下所表现出来的侵略性,一方面大大提高了网络的带宽利用率;但另一方面,对于基于丢包反馈的拥塞控制协议来说,大大提高网络利用率同时意味着下一次拥塞丢包事件为期不远了,所以这些协议在提高网络带宽利用率的同时也间接加大了网络的丢包率,造成整个网络的抖动性加剧。
还有谁导致了丢包?
丢包并不总是拥塞导致,丢包可能原因是多方面,比如:
全球最牛的防火墙 GWF 的随机丢包策略
网路中由于多路径衰落(multi-path fading)所造成的信号衰减(signal degradation)
通道阻塞造成的丢包(packet drop),再者损坏的封包(corrupted packets)被拒绝通过
有缺陷的网路硬件、网路驱动软件发生故障
信号的信噪比(SNR)的影响
Google BBR 的出现
我们自然不喜欢 GWF 这种人为的随机丢包策略,当路过 GWF 时,数据被丢包,我们在此时应该立刻重新发包,增大发送的频率,而不希望降低速度,也就是不希望传统的 TCP 拥塞算法去控制。
由此,就出现了基于不丢包的拥塞控制算法 CDG, 以 延迟 作为判断依据,延迟增大说明拥塞, 数据开始在路由器的缓冲中积累. 降低发送 窗口。然而 CDG 算法与基于丢包的算法不兼容, 只有全球的设备都换上 CDG,但这是不可能的,目前市面上的设备不可能一下子都切换到 CDG,因此 Google 就不开心了,Google 的科学家们开发了一种过渡算法来解决这个问题,这个算法的名字就是 BBR(Bottleneck Bandwidth and RTT),它是一种全新的 拥塞控制算法,BBR 同 CDG 一致的思想是不以丢包作为拥塞控制信号,但是和 CDG 不同的是,BBR 能和 cubic 和 reno 共存。
使用BBR前后网络吞吐量对比图 / By Google
BBR 由 Google 开发,供 Linux 内核的 TCP 协议栈使用,有了 BBR 算法,Linux 服务器可以显著提高吞吐量并减少连接延迟,简单来说 BBR 能加速网络传输速度。此外,部署 BBR 也很容易,因为该算法只需要发送方,而不需要网络或接收方的支持。
环境准备:
YUM安装
安装elrepo并升级内核
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
注意centos版本!!!!!!
centos8
yum install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
centos7
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
# 安装 ML 版本
yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y
# 安装 LT 版本,K8S全部选这个
yum --enablerepo=elrepo-kernel install kernel-lt-devel kernel-lt -y
安装完成后使用下面命令查看当前已安装的内核
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
返回
0 : CentOS Linux (5.17.4-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1160.62.1.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-6e98720bd59a4953b058c3a9d5c9da15) 7 (Core)
5、把CentOS Linux (5.17.4-1.el7.elrepo.x86_64) 7 (Core)内核设置为默认
grub2-set-default 0
6、重启服务器
reboot
RPM安装
1、查找版本
因 ELRepo 源都是最新版本,所以旧版本内核只能手动下载。
查找 kernel rpm 历史版:http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/
2、共需要下载三个类型 rpm
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.203-1.el7.elrepo.x86_64.rpm
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-headers-5.4.203-1.el7.elrepo.x86_64.rpm
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.203-1.el7.elrepo.x86_64.rpm
3、安装内核
rpm -ivh kernel-lt-5.4.203-1.el7.elrepo.x86_64.rpm
rpm -ivh kernel-lt-devel-5.4.203-1.el7.elrepo.x86_64.rpm
或者
#一键安装所有
rpm -Uvh *.rpm
4、确认已经安装的内核版本
[root@ecs-2b3c ~]# rpm -qa | grep kernel
kernel-lt-devel-5.4.203-1.el7.elrepo.x86_64
kernel-devel-3.10.0-1160.53.1.el7.x86_64
kernel-lt-5.4.203-1.el7.elrepo.x86_64
kernel-3.10.0-1127.el7.x86_64
kernel-devel-3.10.0-1127.el7.x86_64
kernel-headers-3.10.0-1160.53.1.el7.x86_64
kernel-3.10.0-1160.53.1.el7.x86_64
kernel-tools-libs-3.10.0-1160.53.1.el7.x86_64
kernel-tools-3.10.0-1160.53.1.el7.x86_64
5、设置启动
# 查看启动顺序
[root@ecs-2b3c ~]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux (5.4.203-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (3.10.0-1160.53.1.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-1127.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-c9b49c6c11334518a7adc404ff6315b6) 7 (Core)
# 设置启动顺序
[root@ecs-2b3c ~]# grub2-set-default 0
# 重启生效
[root@ecs-2b3c ~]# reboot
设置BBR
1、编辑sysctl配置文件
echo 'net.core.default_qdisc=fq' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv4.tcp_congestion_control=bbr' | sudo tee -a /etc/sysctl.conf
2、加载系统参数(正常情况下会输出我们之前添加的内容)
sysctl -p
返回
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
验证BBR是否已经开启
1、输入
sysctl net.ipv4.tcp_available_congestion_control
如果返回
net.ipv4.tcp_available_congestion_control = reno cubic bbr
则安装 成功
2、输入
lsmod | grep bbr
如果返回
tcp_bbr 20480 1
则安装成功
删除无用的旧内核(可选)
升级内核之后,往往老旧的内核也保留下来了,执行以下命令,将自动筛选并删除当前无用的系统内核版本。
yum remove $(rpm -qa | grep kernel | grep -v $(uname -r))