BBR (Bottleneck Bandwidth and RTT) 是由 Google 发表的 TCP 拥塞算法,在一定场景下可以提高服务器的下载速率。Linux 4.9 及以后的内核版本中默认包含此算法。但对于目前大部分 Linux 系统来说,内核版本还停留在 3.10 及以前,所以需要先升级内核,然后开启 BBR。

注意: 由于非发行版默认的内核可靠性不高,所以切勿在生产环境中使用。

根据 Linux 内核的开发状态,可以分为主线版(mainline)、稳定版(stable)和长期维护版(longterm)。主线版是当前发布的最新版本的内核,由于它只代表了一个时间状态,所以它既可能是预览版,也可能是稳定版或者长期维护版。我们要安装的是最新稳定版或者最新的长期维护版。需要再次重申的是,即便是稳定版,它的稳定性也是相对的,所以切勿在生产环境中使用。有关内核启动项设置的 grub2 的详细信息可以查看 CentOS 官方指南鸟哥的文章

一、使用 YUM 安装新内核

ELRepo 是一个第三方 YUM 源,主要关注与硬件有关的内核、驱动等,可以使用它来安装最新的内核。ELRepo 提供 kernel_ml (最新稳定版)和 kernel_lt (长期维护版)两个内核安装包。由于 kernel_lt 目前只提供到 4.4 版本(原因),未达到我们需求的 4.9 版本,所以只能安装 kernel_ml。虽然 kernel_mlml 结尾,但它提供的是最新稳定版的主线内核 (the latest stable mainline kernels)。

1.1 安装 ELRepo

引入公钥:

$ sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

安装:

  • CentOS 7
$ sudo rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
  • CentOS 6
$ sudo rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm

1.2 配置 YUM 源文件

首先,启用 ELRepo 的 elrepo-kernel 频道:

ELRepo 包含四个频道 elrepoelrepo-testingelrepo-kernelelrepo-extras,默认情况只有下 elrepo 频道是开启的,而我们更新内核只需要使用它的 elrepo-kernel 频道。所以需要关闭 elrepo 频道并开启 elrepo-kernel 频道。

编辑文件 ELRepo 的配置文件 /etc/yum.repos.d/elrepo.repo

$ sudo vi /etc/yum.repos.d/elrepo.repo

[elrepo] 下的 enable 的值改为 0[elrepo-kernel] 下的 enable 的值改为 1,保存退出。

可以使用下面的命令查看所有已启用和已禁用的 YUM 源:

$ yum repolist all

然后,禁止 CentOS 默认 YUM 源更新内核:

如果 CentOS 发行版的默认内核有更新,那么在使用 yum update 命令时就会更新内核,但通过 CentOS 默认 YUM 源更新的内核是最稳定的 3.10,这会影响我们后面的内核排序。

编辑系统默认的 YUM 配置文件/etc/yum.repos.d/CentOS-Base.repo

$ sudo vi /etc/yum.repos.d/CentOS-Base.repo

[updates]下面添加一行并保存退出:

exclude=kernel*

* 是通配符,这一行表示忽略以 kernel 开头的 RPM 包的安装及更新。

1.3 安装内核

安装最新稳定版内核:

$ sudo yum -y install kernel-ml

查看内核启动启动项:

$ sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

输出:

0 : CentOS Linux 7 Rescue 2b1ba0f6601543b5950d0dead0fc147f (4.17.1-1.el7.elrepo.x86_64)
1 : CentOS Linux (4.17.1-1.el7.elrepo.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-862.3.2.el7.x86_64) 7 (Core)
3 : CentOS Linux (3.10.0-862.el7.x86_64) 7 (Core)
4 : CentOS Linux (0-rescue-4bbda2095d924b72b05507b68bd509f0) 7 (Core)

由于第一个是救援系统,可见,安装新内核后需要重新生成启动配置:

$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg

再次查看输出:

0 : CentOS Linux (4.17.1-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-862.3.2.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-862.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-4bbda2095d924b72b05507b68bd509f0) 7 (Core)
4 : CentOS Linux (0-rescue-2b1ba0f6601543b5950d0dead0fc147f) 7 (Core)

从上面的排序可以看出来,最新安装的内核在最上面,第一个的序号为 0,依次类推。设置 grub2 引导程序默认由编号为 0 的内核启动。

$ sudo grub2-set-default 0

也可以指定内核名:

$ sudo grub2-set-default "CentOS Linux (4.17.1-1.el7.elrepo.x86_64) 7 (Core)"

设置后可以查看是否设置成功:

$ sudo grub2-editenv list

再次更新配置文件:

$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg

重启服务器:

$ sudo reboot

在重启系统,重新登录后,查看新内核是否生效:

$ uname -r

由于重启了服务器,别忘了把没有开机启动的服务重新启动。

二、更改内核配置以启用 BBR

打开系统内核配置 /etc/sysctl.conf 文件:

$ sudo vi /etc/sysctl.conf

在末尾追加以下两行:

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

重新加载系统内核配置:

$ sudo sysctl -p

查看内核中可用的拥塞控制算法:

$ sysctl -n net.ipv4.tcp_available_congestion_control

-n 选项表示只用输出内核参数值,而不用输出内核参数名。

输出:

reno cubic bbr

查看内核当前的拥塞控制算法:

$ sysctl -n net.ipv4.tcp_congestion_control

输出:

bbr

查看系统是否已载入 BBR 模块:

$ lsmod | grep bbr

输出:

tcp_bbr                20480  1

如上所示,输出中都显示了 bbr 字样,说明 BBR 已成功开启。

(完)