CentOS 7安装TCP BBR拥塞算法

➡️认识BBR拥塞算法

从 4.9 开始,Linux 内核已经用上了该算法。根据以往的传统,Google 总是先在自家的生产环境上线运用后,才会将代码开源,此次也不例外。
根据实地测试,在部署了最新版内核并开启了 TCP BBR 的机器上,网速甚至可以提升好几个数量级。

TCP BBR拥塞算法致力于解决两个问题:

  1. 在有一定丢包率的网络链路上充分利用带宽。
  2. 降低网络链路上的 buffer 占用率,从而降低延迟。

在标准TCP通讯的情况下,为了充分利用带宽所采用的方案是:不断增加发送窗口,直到开始丢包,然后较快地减小发送窗口。
这种做法在一般情况下没什么问题,但是在存在传输错误导致的丢包地情况下就没那么好使了。
在有一定的丢包率的延迟高、宽带大的链路上标准的TCP拥塞控制就会把发送窗口收敛到很小。
同时在网络中也有很多缓存空间用来吸收网络中的流量波动。由于标准的TCP拥塞控制是通过灌满带宽的方式来估算需要的发送窗口的,在连接的开始阶段,网络中的缓存空间就倾向于被占满。后续缓存空间会被逐渐释放,但并不会消失。客户端估计的水管容积总是略大于网络中除去缓存空间的实际容量。这个问题又被称之为缓存区膨胀
缓存区膨胀主要带来了两个问题:

  1. 增加网络延迟。
  2. 在连接数较多时容易导致缓存区被填满导致丢包。

TCP BBR是用以下方法解决这两个问题的:

  1. 既然分不清拥塞丢包和错误丢包那就不考虑丢包问题。
  2. 既然管满水管会导致缓存区膨胀那就估计带宽和延迟,不直接估计水管体积。

带宽和延迟本身是没法同时测量的,测量最大带宽就需要把缓存区填满,测量最低延迟就需要把缓存区清空。TCP BBR所采用的方案是交替测量,用一段时间内的最大带宽和另一段时间内的最低延迟作为估计值。
在连接刚开始建立时,它采用了和标准TCP类似的慢启动,指数增长发送速率。而标准的TCP拥塞控制会在遇到任何一个丢包就立刻开始减速,开始拥塞避免。这时,标准TCP拥塞控制本意是达到带宽的最大值开始进行网络控制,但是在有一定的丢包率的情况下也有可能是单纯的网络丢包,这时网络并没有达到带宽的最大值;如果网络中存在缓存区,它也会一直到把缓存区填满才会放弃。
TCP BBR则是根据收到的确认包,发现有效带宽不再增长时开始拥塞避免。这时,只要链路的丢包率不算特别高,对BBR就几乎没什么影响;当发送速率增长到开始占用缓存区时(这时可以通过延迟的增加判断出来),BBR就及时的放弃了(这时占用的是3倍带宽,相当于有2倍在占用缓存区,但BBR本身还有一个排空阶段,在排空阶段下它会指数降低发送速率),这样就不会把缓存区占满。
排空阶段过后就是稳定运行状态,交替探测带宽和延迟,以此来作为基准进行发包。

Post not found: https://www.zhihu.com/question/53559433 Linux Kernel 4.9 中的 BBR 算法与之前的 TCP 拥塞控制相比有什么优势?

➡️安装TCP BBR拥塞算法

1
cat /etc/redhat-release #查看系统版本,输出的release数值大于7.3即可。
  1. 自动安装,使用一键安装脚本
1
wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh
  1. 手动安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 使用下面命令安装elrepo并升级内核
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-ml -y
# 更新grub文件并重启(reboot后,ssh会断开,稍等一会儿重新连接)
egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \'
grub2-set-default 0
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
# 开机后查看内核是否已经升级
uname -r
# 启动BBR
echo "net.core.default_qdisc = fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf
sysctl -p

验证bbr是否已经开启

1
2
3
sysctl net.ipv4.tcp_available_congestion_control #验证当前TCP控制算法的命令
sysctl net.ipv4.tcp_congestion_control #验证BBR是否已经启动
lsmod | grep bbr #返回值有 tcp_bbr 模块即说明 bbr 已启动。