目录

使用 TCP-BBR 优化服务器网络

Linux 内核中提供了若干套 TCP 拥塞控制算法,这些算法各自适用于不同的环境。 其中 Google 在 2016 年下半年提出的开源算法 TCP-BBR,格外引人注目,于是我在自己的 VPS 上开启了它。

之前 Linux 内核中已经提供了若干套 TCP 拥塞控制算法,这些算法各自适用于不同的环境,下面是他们各自的特点。

  1. reno 是最基本的拥塞控制算法,也是 TCP 协议的实验原型。
  2. bic 适用于 rtt 较高但丢包极为罕见的情况,比如北美和欧洲之间的线路,这是 2.6.8 到 2.6.18 之间的 Linux 内核的默认算法。
  3. cubic 是修改版的 bic,适用环境比 bic 广泛一点,它是 2.6.19 之后的 linux 内核的默认算法。
  4. hybla 适用于高延时、高丢包率的网络,比如卫星链路 —— 同样适用于中美之间的链路。

谷歌 TCP-BBR 拥堵算法

2016 年下半年,google 提出了开源算法 TCP-BBR, 并且已经提交到 Linux 新的内核,TCP BBR 可以在有一定丢包率的网络链路上充分利用物理带宽,它通过降低网络链路上的 buffer 占用率,从而降低网络延迟。可以起到单边加速 TCP 连接的效果,也就是不用客户端的配合。测试下来使用 BBR 的情况下带宽表现非常的优秀,强烈建议大家试一试。

注意 BBR 需要更改内核和全虚拟化的 VPS,因此和锐速一样不能用在 OpenVZ 的 VPS 机器上,所以搬瓦工等是用不了的。

TCP-BBR 目前已经在 YouTube 服务器和 Google 跨数据中心的内部广域网(B4)上部署,由此可见出该 TCP 加速算法优秀。

原理与优势

知乎上Linux Kernel 4.9 中的 BBR 算法与之前的 TCP 拥塞控制相比有什么优势?李博杰的回答很棒, 推荐阅读

在服务器配置

更新 linux 为最新内核

linux 内核版本在这里来查看和下载

Linux 从 4.9 的内核开始支持 TCP BBR,, 输入uname -r,查看当前内核是不是 >= 4.9,如果是的话可以跳过下面。

现在最新的内核版本是v4.13(2017.9.3 更新)

下载安装包:

1
2
3
sudo wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.13/linux-headers-4.13.0-041300_4.13.0-041300.201709031731_all.deb
sudo wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.13/linux-headers-4.13.0-041300-generic_4.13.0-041300.201709031731_amd64.deb
sudo wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.13/linux-image-4.13.0-041300-generic_4.13.0-041300.201709031731_amd64.deb

安装:

1
2
sudo dpkg -i linux-headers-*.deb
sudo dpkg -i linux-image-*.deb

查看当前系统中都有哪些内核:

1
dpkg -l | grep linux-image

输出的内容中可能会包括内核映像的如下三种状态:

  • rc:表示已经被移除
  • ii:表示符合移除条件(可移除)
  • iU:已进入 apt 安装队列,但还未被安装(不可移除) 删除旧的内核
1
sudo apt-get remove <old-kernel-image> --purge

例如:要移除状态为 ii 的旧版linux-image-4.4.0-21-generic内核,可以使用如下命令:

1
sudo dpkg --purge linux-image-4.4.0-21-generic

更新 grub 系统引导:

1
sudo update-grub

重启:

1
sudo reboot

查看当前内核版本:

1
uname -r

启用 TCP BBR

编辑/etc/sysctl.conf, 在文件末尾加上下面两行

1
2
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

保存退出后执行

1
sudo sysctl -p

使配置生效

检查是否设置成功

1
2
sysctl net.ipv4.tcp_available_congestion_control
# net.ipv4.tcp_available_congestion_control = bbr cubic reno
1
2
sysctl net.ipv4.tcp_congestion_control
# net.ipv4.tcp_congestion_control = bbr

执行

1
lsmod | grep bbr

如果看到tcp_bbr则说明启用成功.