TCP BBR 加速

由于最近严峻的疫情,不得不开始在家办公了,那么高效的外网访问就成了一个必须要解决的问题。手里有 DigitalOcean 的 VPS 可以使用,但是速度一直很一般。昨天折腾了下,发现了 BBR 这神奇的货,开启后速度提升了至少一个数量级,Youtube 直接从最低画质提升到稳定的720P,厉害了~

TCP BBR

TCP BBR(TCP Bottleneck Bandwidth and RRT)是 Google 开发的一个 TCP 阻塞控制算法(CCA, Congestion Control Algorithm),致力于充分利用现有带宽,降低延迟。具体的论文可以在 https://research.google/pubs/pub45646/ 找到,说人话就是能有效提高代理服务器的数据发送速度,更详细的解读可以参考知乎的这个回答 https://www.zhihu.com/question/53559433

安装并启用 BBR

BBR 已由 Google 提交到了 Linux 内核,版本在4.9及其以上的系统都已经默认包含此算法。所以需要先确定当前系统的内核版本:

1
$ uname -r

如果小于4.9,恭喜,需要折腾一下下,通过升级内核来获取新算法。Ubuntu 的内核升级相对简单:

1
2
3
$ apt-get update
# 也可以运行 apt-get dist-upgrade 更新内核及各种相关应用包
$ apt-get install linux-image-generic # 只单独更新内核,还可以选择 linux-virtual

如果以上命令无法升级到4.9以上,那么再次恭喜,你和我一样还得继续折腾,猜测原因可能是 Ubuntu 的发行版本太低,无法自动更新到最新的内核。最好的解决方案应该是直接升级 Ubuntu 的发行版本:

1
$ do-release-upgrade

不过事情总是事与愿违,反正我是没成功的… 下一步应该考虑直接创建一个新的 VPS 从头来过。但目前的 VPS 上有太多乱七八糟的东西,一时半会儿还不太好迁移,而且新 VPS 必定有新 IP ,域名修改、HTTPS 证书更新还有一堆事儿。算了还是直接手动更新内核吧,鲁莽了点(后续也证明确实有潜在的问题)但是现在流畅的梯子更为重要,以后有时间再从头来过吧。

更新 找到一种更简单、安全的升级方式:HWE(Hardware Enablement),这是专门适配老系统的内核更新,为 Ubuntu LTS 版本生命周期内提供新内核支持,可以简单的通过 apt-get 直接安装,比如16.04的系统:

1
$ apt-get install linux-generic-hwe-16.04

坏处是没法自由选择内核版本,不过相对的也会更稳定。对于早已成为历史的16.04而言,官方最新的内核是4.15,这个也足够开启 BBR 了。可以从 https://packages.ubuntu.com/search?keywords=linux-image-generic 找到各 LTS 版本对应的 HWE 内核版本信息。

手动更新内核

⚠️ 如果不是尝鲜追求最新内核还是老老实实使用上面提高到 HWE 内核更好。

可以从 https://kernel.ubuntu.com/~kernel-ppa/mainline/ 获取到所有的内核,索性找了一个最新的5.5.1。需要根据机器架构选择相应版本的内核,大部分的 VPS 应该都是x86架构64位,那选择amd64就好,具体有4个 deb 包需要下载,分别是:

然后直接通过 dpkg 安装

1
$ dpkg -i *.deb

一切顺利就O了,不过我总是最悲催的,安装过程中提示“linux-headers”安装失败,原因是依赖的libssl版本不匹配,需要升级。那好,只有一个依赖而已,简单,下载新版,安装,搞定…然而并没有,libssl又告知libc6版本太低,需要升级,这下麻烦大了。继续升级下去,估计得被各种依赖坑死,好在内核是安装成功了的,那就先不理会这个了,反正都是凑合着先用一下。

最后重启系统

1
$ reboot

启动 BBR

其实就是修改相应的网络配置,在/etc/sysctl.conf中启用 BBR,如下:

1
2
$ echo "net.core.default_qdisc=fq" | tee -a /etc/sysctl.conf
$ echo "net.ipv4.tcp_congestion_control=bbr" | tee -a /etc/sysctl.conf

重启后测试下:

1
$ sysctl net.ipv4.tcp_congestion_control

输出应该是:

1
net.ipv4.tcp_congestion_control = bbr

搞定,散花~

删除多余内核

如果不是跟我一样作死先安装了最新版本内核,然后又想使用更稳定的 HWE 版本的话,这部分可以直接跳过~

Ubuntu 会默认使用已安装的最高版本内核,所以 HWE 版本安装完成后也不会默认使用此内核,需要手动修改 grub 设置来切换内核:

1
2
# vim /etc/default/grub
GRUB_DEFAULT=0

其中0表示默认的启动项,也就是最高版本的内核。而1表示更多启动选项,我们需要的就是从这些更多的启动项中选择需要的内核,具体的启动项可以在/boot/grub/grub.cfg中找到,搜索submenu,其后紧接的每一个menuentry就是一个独立的启动项,编号从0开始,比如说:

1
2
# vim /etc/default/grub
GRUB_DEFAULT="1>3"

表示使用更多选项中的第四个启动项,修改完成后运行:

1
2
3
4
# 更新 grub 配置
$ update-grub
# 重启
$ reboot

还没完,目前只是切换了内核,5.5.1版本的内核还在那儿,得删掉才算完整。那么就:

1
2
3
$ apt-get purge linux-image-unsigned-5.5.1-050501-generic
$ apt-get purge linux-headers-5.5.1-050501
$ apt-get purge linux-modules-5.5.1-050501-generic

然后再检查下:

1
$ dpkg -l | grep 5.5.1

应该就看不到5.5.1内核相关内容了。这下搞完了吗?可惜还没有,还记得之前我们修改了 grub 的配置莫?删除了内核后启动项也相应的发生了变化,之前的启动项设置就不再有效了,我们得再改一改:

1
2
# vim /etc/default/grub
GRUB_DEFAULT=0

这次改回0就好,因为我们想使用的就是目前已有的最高版本内核。最后别忘了重启一下 :)

后记,关于线路选择

在选择 VPS 供应商时,除了价格最主要考察的就是对方机房与你所在网络的联通情况。国内三大宽带网络服务商(电信、联通、移动)各有优势,可以通过这篇知乎专栏文章 https://zhuanlan.zhihu.com/p/64467370 大致了解下各家出口线路的基本情况。以 DigitalOcean 为例,在创建 VPS 时有多个不同地区的数据中心可供选择,其中新加坡就是个不错的选择,目前国内的出口网关都集中在北上广,如果能从广州出经香港直达新加坡,物理路程最短,效果应该是最好的。不过具体还是得实际测试才知道。可以尝试创建多个不同地区的 VPS 然后通过 trace route 比较路由过程(推荐 https://tools.ipip.net/traceroute.php 能生成可视化的地图,方便~)来确定最佳线路。