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 | $ apt-get update |
如果以上命令无法升级到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 包需要下载,分别是:
- linux-headers-5.5.1-050501_5.5.1-050501.202002011032_all.deb
- linux-headers-5.5.1-050501-generic_5.5.1-050501.202002011032_amd64.deb
- linux-image-unsigned-5.5.1-050501-generic_5.5.1-050501.202002011032_amd64.deb
- linux-modules-5.5.1-050501-generic_5.5.1-050501.202002011032_amd64.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 | # vim /etc/default/grub |
其中0
表示默认的启动项,也就是最高版本的内核。而1
表示更多启动选项,我们需要的就是从这些更多的启动项中选择需要的内核,具体的启动项可以在/boot/grub/grub.cfg
中找到,搜索submenu
,其后紧接的每一个menuentry
就是一个独立的启动项,编号从0开始,比如说:
1 | # vim /etc/default/grub |
表示使用更多选项中的第四个启动项,修改完成后运行:
1 | # 更新 grub 配置 |
还没完,目前只是切换了内核,5.5.1版本的内核还在那儿,得删掉才算完整。那么就:
1 | $ apt-get purge linux-image-unsigned-5.5.1-050501-generic |
然后再检查下:
1 | $ dpkg -l | grep 5.5.1 |
应该就看不到5.5.1内核相关内容了。这下搞完了吗?可惜还没有,还记得之前我们修改了 grub 的配置莫?删除了内核后启动项也相应的发生了变化,之前的启动项设置就不再有效了,我们得再改一改:
1 | # vim /etc/default/grub |
这次改回0
就好,因为我们想使用的就是目前已有的最高版本内核。最后别忘了重启一下 :)
后记,关于线路选择
在选择 VPS 供应商时,除了价格最主要考察的就是对方机房与你所在网络的联通情况。国内三大宽带网络服务商(电信、联通、移动)各有优势,可以通过这篇知乎专栏文章 https://zhuanlan.zhihu.com/p/64467370 大致了解下各家出口线路的基本情况。以 DigitalOcean 为例,在创建 VPS 时有多个不同地区的数据中心可供选择,其中新加坡就是个不错的选择,目前国内的出口网关都集中在北上广,如果能从广州出经香港直达新加坡,物理路程最短,效果应该是最好的。不过具体还是得实际测试才知道。可以尝试创建多个不同地区的 VPS 然后通过 trace route 比较路由过程(推荐 https://tools.ipip.net/traceroute.php 能生成可视化的地图,方便~)来确定最佳线路。