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_ml
以 ml
结尾,但它提供的是最新稳定版的主线内核 (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 包含四个频道 elrepo
、elrepo-testing
、elrepo-kernel
、elrepo-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 已成功开启。