0%

使用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项目github主页
TCP-BBR项目开发论坛(英文)
TCP-BBR快速使用手册(英文)

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, 在文件末尾加上下面两行

/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则说明启用成功.