在Linode节点上开启BBR算法

BBR是Google开源的TCP拥堵控制算法,与2016年9月开源。BBR的目的是要尽量跑满带宽, 并且尽量不要有排队的情况, 其使用效果并不比速锐差。

Linux kernel 4.9+ 已支持 tcp_bbr。我在Linode安装了4.10.10内核,可以开启BBR。但是Linode自带的4.9无法开启。

1. BBR简介

关于其具体原理及各种分析可以看知乎上的讨论贴,很有技术含量。这里只做简单介绍。BBR试图解决两个问题:

  1. 在有一定丢包率的网络链路上充分利用带宽。非常适合高延迟、高带宽的网络链路:
    标准TCP算法在只要有万分之一的丢包率情况下,带宽就只剩 30%;千分之一丢包率时只剩 10%;有百分之一的丢包率时几乎就卡住了。而 TCP BBR 在丢包率 5% 以下几乎没有带宽损失,在丢包率 15% 的时候仍有 75% 带宽。

  2. 降低网络链路上的 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。因此需要安装新内核。

安装方法比较简单:

1
2
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.10/linux-image-4.10.10-041010-generic_4.10.10-041010.201704120813_amd64.deb
dpkg -i linux-image-4.10.10-041010-generic_4.10.10-041010.201704120813_amd64.deb

这样就安装了新版本的内核。

然后在Linode管理控制台里面选择Boot Settings中的Kernel选择GRUB 2即可。选择之后,重启机器即可。

2.2 启用BBR

重启之后首先查看内核是否正确:

1
2
root@localhost:~# uname -a
Linux 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模块:

1
2
root@localhost:~# lsmod | grep tcp_bbr
tcp_bbr 6015 13

如果没有启用bbr则上面没有输出或者报错。

上面条件都满足之后就可以开启BBR了。

1
2
3
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

然后执行以下命令查看是否启用成功:

1
2
3
4
root@localhost:~# sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_controlnet.ipv4.tcp_available_congestion_control = bbr cubic reno
root@localhost:~# sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = bbr

如果结果都有bbr, 则证明你的内核已开启BBR。

2.3 效果

在我的Linode fremon节点上,开启之后大概能带来几倍的差距。开启后可以看1440p,1080p很流畅。
BBR有点不足的地方是使用中总是要缓冲一段时间然后才能够达到慢速,不会一下子达到。可能是因为我这边网络延迟有点大,毕竟有250-300ms了。

附录A. 参考资料

热评文章