BBR是Google开源的TCP拥堵控制算法,与2016年9月开源。BBR的目的是要尽量跑满带宽, 并且尽量不要有排队的情况, 其使用效果并不比速锐差。
Linux kernel 4.9+ 已支持 tcp_bbr。我在Linode安装了4.10.10内核,可以开启BBR。但是Linode自带的4.9无法开启。
1. BBR简介
关于其具体原理及各种分析可以看知乎上的讨论贴,很有技术含量。这里只做简单介绍。BBR试图解决两个问题:
-
在有一定丢包率的网络链路上充分利用带宽。非常适合高延迟、高带宽的网络链路: 标准TCP算法在只要有万分之一的丢包率情况下,带宽就只剩 30%;千分之一丢包率时只剩 10%;有百分之一的丢包率时几乎就卡住了。而 TCP BBR 在丢包率 5% 以下几乎没有带宽损失,在丢包率 15% 的时候仍有 75% 带宽。
-
降低网络链路上的 buffer 占用率,从而降低延迟。非常适合慢速接入网络的用户 延迟越高的用户,采用 TCP BBR 后的延迟下降比例越高,原来需要 10 秒的现在只要 2 秒了。
2. 启用BBR
目前VPS供应商的默认内核应该还没有这么新。即使是Linode提供了4.9.15,但是应该没有编译tcp_bbr模块进去,所以照样无法开启BBR功能。因此启用BBR需要首先安装新内核,然后开启相关配置即可。
2.1 更新内核
启用BBR需要替换内核。我用的VPS是Linode的。而Linode提供了一个比较方便的方式来切换内核,大大降低了新手操作的风险。它可以在管理后台选择需要启动的内核。通常我们可以新安装一个内核,而不用删除原有内核,在管理后台选择GRUB2启动我们新安装的内核即可,方便又安全。这样就有机会切换回原有的内核,而不用重新安装整个系统。
我在Linode的节点使用的Ubuntu 16.04LTS。这个版本默认内核可以选择到4.9.15。但是依然不支持BBR。因此需要安装新内核。
安装方法比较简单:
1wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.10/linux-image-4.10.10-041010-generic_4.10.10-041010.201704120813_amd64.deb
2dpkg -i linux-image-4.10.10-041010-generic_4.10.10-041010.201704120813_amd64.deb
这样就安装了新版本的内核。
然后在Linode管理控制台里面选择Boot Settings
中的Kernel
选择GRUB 2即可。选择之后,重启机器即可。
2.2 启用BBR
重启之后首先查看内核是否正确:
1root@localhost:~# uname -a
2Linux localhost 4.10.10-041010-generic #201704120813 SMP Wed Apr 12 12:15:07 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
表明已经升级到了4.10.10版本的内核。
然后查看是否编译了tcp_bbr
模块:
1root@localhost:~# lsmod | grep tcp_bbr
2tcp_bbr 6015 13
如果没有启用bbr则上面没有输出或者报错。
上面条件都满足之后就可以开启BBR了。
1echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
2echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
3sysctl -p
然后执行以下命令查看是否启用成功:
1root@localhost:~# sysctl net.ipv4.tcp_available_congestion_control
2sysctl net.ipv4.tcp_congestion_controlnet.ipv4.tcp_available_congestion_control = bbr cubic reno
3root@localhost:~# sysctl net.ipv4.tcp_congestion_control
4net.ipv4.tcp_congestion_control = bbr
如果结果都有bbr, 则证明你的内核已开启BBR。
2.3 效果
在我的Linode fremon节点上,开启之后大概能带来几倍的差距。开启后可以看1440p,1080p很流畅。 BBR有点不足的地方是使用中总是要缓冲一段时间然后才能够达到慢速,不会一下子达到。可能是因为我这边网络延迟有点大,毕竟有250-300ms了。