BBR是谷歌开发的新的TCP加速算法,在网络状况不好的服务器上开启TCP的bbr,可以在无需增加任何硬件投入的情况下实现网络加速,并且客户端无需做任何配置,因此使用起来非常的方便。TCP加速对网络状况较好的内网环境,或者大带宽的境内服务器优化效果不明显,对于境外的VPS则有较好的加速效果。

开启BBR的前提是linux的内核版本要高于4.8(高版本的内核已经默认集成了BBR模块),目前centos7.9默认安装的内核版本是3.10,因此Centos7.9要开启TCP BBR加速首先要升级centos7 的内核。

以下的操作都是在centos7.9操作系统之上的,使用命令cat /etc/redhat-release命令可以查看当前系统的版本信息。

cat /etc/redhat-release

centos 内核对应版本 centos7.9 内核版本_tcp/ip


使用命令uname -ra可以查看当前系统的内核版本信息。

uname -ra

centos 内核对应版本 centos7.9 内核版本_tcp/ip_02

1.升级Centos7内核

1.1查找版本

因 ELRepo 源都是最新版本,所以旧版本内核只能手动下载。

查找 kernel rpm 历史版本:http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/

1.2下载内核 RPM

共需要下载三个类型 rpm

kernel-lt-devel-5.4.226-1.el7.elrepo.x86_64.rpm

kernel-lt-headers-5.4.226-1.el7.elrepo.x86_64.rpm

kernel-lt-5.4.226-1.el7.elrepo.x86_64.rpm

cd /home
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.226-1.el7.elrepo.x86_64.rpm
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-headers-5.4.226-1.el7.elrepo.x86_64.rpm
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.226-1.el7.elrepo.x86_64.rpm

1.3安装内核

rpm -ivh kernel-lt-5.4.226-1.el7.elrepo.x86_64.rpm
rpm -ivh kernel-lt-devel-5.4.226-1.el7.elrepo.x86_64.rpm

centos 内核对应版本 centos7.9 内核版本_hive_03

1.4确认已安装内核版本

[root@localhost kernel]# rpm -qa | grep kernel
kernel-devel-3.10.0-1160.102.1.el7.x86_64
kernel-devel-3.10.0-1160.el7.x86_64
kernel-lt-devel-5.4.226-1.el7.elrepo.x86_64
kernel-headers-3.10.0-1160.102.1.el7.x86_64
abrt-addon-kerneloops-2.1.11-60.el7.centos.x86_64
kernel-3.10.0-1160.el7.x86_64
kernel-tools-3.10.0-1160.102.1.el7.x86_64
kernel-3.10.0-1160.102.1.el7.x86_64
kernel-lt-5.4.226-1.el7.elrepo.x86_64
kernel-devel-3.10.0-1160.99.1.el7.x86_64
kernel-tools-libs-3.10.0-1160.102.1.el7.x86_64
kernel-3.10.0-1160.99.1.el7.x86_64

centos 内核对应版本 centos7.9 内核版本_网络_04

1.5设置启用新内核

# 查看启动顺序
[root@localhost alfiy]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux (3.10.0-1160.105.1.el7.x86_64) 7 (Core)
CentOS Linux (5.4.226-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (3.10.0-1160.102.1.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-1160.99.1.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-4f159f5c7c9a4d2aa7ea785de06efbaf) 7 (Core)

# 设置启动顺序 启动顺序从0排序,比如上面列表中0代表的是CentOS Linux (3.10.0-1160.105.1.el7.x86_64) 7 (Core)
# 1代表的是CentOS Linux (5.4.226-1.el7.elrepo.x86_64) 7 (Core)
[root@localhost ~]# grub2-set-default 1

# 重启生效
[root@localhost ~]# reboot

centos 内核对应版本 centos7.9 内核版本_网络协议_05


💁♂ 如果grub2.cfg文件为空,则上述命令不会生效,需要执行grub2-mkconfig生成一个新的grub2.cfg文件.

grub2-mkconfig -o /etc/grub2.cfg

然后再执行前面的命令。

2.安装BBR

echo 'net.core.default_qdisc=cake' | tee -a /etc/sysctl.conf
echo 'net.ipv4.tcp_congestion_control=bbr' | tee -a /etc/sysctl.conf
sysctl -p

centos 内核对应版本 centos7.9 内核版本_tcp/ip_06

👿 实测net.core.default_qdisc=cake的效果要比`net.core.default_qdisc=fq的效果好一些,但是cake好像在4.9内核上不支持,在5.4内核上就支持了。

💁♂ 其实上述步骤等同于直接修改/etc/sysctl.conf文件,如果多次执行上述命令时,再使用sysctl -p命令检查时会出现重复项,大家重新编辑/etc/sysctl.conf文件把重复项删除掉就可以了。

👿 如果你的系统报net.core.default_qdiscnet.ipv4.tcp_congestion_control不存在时,说明内核目前并不支持后面选项,需要检查确认内核版本。

3.检测

使用lsmod命令可以列出内核自启的模块,具体用法如下。

lsmod | grep bbr

如果出现下图所示内容,说明内核已经启用bbr模块。

centos 内核对应版本 centos7.9 内核版本_centos 内核对应版本_07


也可以使用sysctl -p命令查看内核是否已经启用BBR,如果命令行打印出下图内容说明内核已经启用了BBR了,使用reboot命令重启服务器就可以了。

centos 内核对应版本 centos7.9 内核版本_hive_08

4.创建安装脚本

如果你有多台VPS并且都是相同的发行版本,那么需要重复前面1-3步的过程,是不是感觉有点太麻烦了?好吧,接下来我们将为前面的步骤开发一个简单的安装脚本。

思路如下,先提取前面步骤中所必需的安装命令。在前面1-3步中基本上使用了以下命令。

# 进入一个准备下载rpm包的目录 这里我们使用了家目录
cd /home

# 在当前目录下,下载所需的内核安装包
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.226-1.el7.elrepo.x86_64.rpm
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-headers-5.4.226-1.el7.elrepo.x86_64.rpm
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.226-1.el7.elrepo.x86_64.rpm

# 通过rpm安装器安装下载的包 这里我们只安装了基础包和开发包,head包并没安装,如果有些程序需要head包可以再进入这个目录进行安装
rpm -ivh kernel-lt-5.4.226-1.el7.elrepo.x86_64.rpm
rpm -ivh kernel-lt-devel-5.4.226-1.el7.elrepo.x86_64.rpm

# 设置启用新内核
grub2-set-default 'CentOS Linux (5.4.226-1.el7.elrepo.x86_64) 7 (Core)'

# 启用Tcp的bbr加速
echo 'net.core.default_qdisc=cake' | tee -a /etc/sysctl.conf
echo 'net.ipv4.tcp_congestion_control=bbr' | tee -a /etc/sysctl.conf

# 重启生效
reboot

以上过程就基本上是我们手动安装的过程,由于我们要创建自动安装脚本,所以其中有些安装检查步骤就省略了。依照上面的流程,我们就可以编写自动安装脚本 了。

首先新建一个脚本文件,这里我就以tcp.sh为例。

vim tcp.sh

tcp.sh文件中添加以下内容:

#!/bin/bash

# 1. 创建目录
cd /home
mkdir bbr
cd bbr
# 2. 下载内核
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.226-1.el7.elrepo.x86_64.rpm &
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-headers-5.4.226-1.el7.elrepo.x86_64.rpm &
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.226-1.el7.elrepo.x86_64.rpm &
wait
# 3. 安装内核
rpm -ivh kernel-lt-5.4.226-1.el7.elrepo.x86_64.rpm &
rpm -ivh kernel-lt-devel-5.4.226-1.el7.elrepo.x86_64.rpm &
wait
# 4. 设置启动
# 设置启动顺序 
grub2-set-default 'CentOS Linux (5.4.226-1.el7.elrepo.x86_64) 7 (Core)'
wait
# 5. 安装BBR
echo 'net.core.default_qdisc=cake' | tee -a /etc/sysctl.conf &
echo 'net.ipv4.tcp_congestion_control=bbr' | tee -a /etc/sysctl.conf &
# sysctl -p
wait
# 6. 重启系统
reboot

保存退出tcp.sh文件,并给tcp.sh文件赋可执行权限。

chmoe +x tcp.sh

然后执行tcp.sh文件。

重启系统后你会发现系统已经使用新的内核,并在内核中启用了bbr了。

💁♂ 在脚本文件中,使用了&后台运行命令,以及wait命令,这两个命令的使用能够让脚本顺序执行,也就是说上一步骤执行完成后,再执行下一步的命令。

👿 学会举一反三:上面的脚本都是写死的,所以只能在特定的发行版本上运行,大家还可以在此基础上进行完善,比如写一个判断语句,判断当前的系统的发行版本,判断当前的内核版本,以及一些友好的提示等。

5.一键安装脚本

有心的同学,如果认真实现了前面的4步,我想肯定会有很多收获,可是也有偷懒的同学,好吧下面就给出一个可用的一键安装脚本。

yum -y update && yum install -y wget && bash <(curl -s -L https://raw.githubusercontent.com/alfiy/centos7-bbr-enable/main/tcp.sh)

💁♂ 其实我只是把脚本放在了一个网络上可以下载的地方,大家可以沿着这个思路生成自己的一键安装脚本,自己写的脚本适应性可能不是太强,但对自己可能更加有用。