标签归档:BBR

Linode CentOS 7应用BBR算法

在之前的文章《在Linode上应用BBR算法》中,介绍了如何在Linode VPS上更新内核应用BBR算法。那篇文章中使用的是Ubuntu 16.04。这里把CentOS 7该如何操作进行介绍。方法基本相同,所以其中步骤就简单描述了。

首先更新内核(el7地址):

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-ml -y

在执行最后一条命令时,可能出现如下报错,

grubby fatal error: unable to find a suitable template

但最终会显示安装完成:

Installed:
  kernel-ml.x86_64 0:4.10.1-1.el7.elrepo
Complete!

出现这个错误的原因是grub没有生成对应的配置文件,导致配置出错。只需再执行以下命令即可,命令以及输出如下:

[root@centos ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.10.1-1.el7.elrepo.x86_64
Found initrd image: /boot/initramfs-4.10.1-1.el7.elrepo.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-514.10.2.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-514.10.2.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-514.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-514.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-4f09fa5fdd3642fa85221d7c11370603
Found initrd image: /boot/initramfs-0-rescue-4f09fa5fdd3642fa85221d7c11370603.img
done

现在再查看一下现在的grub配置

[root@centos ~]# egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \'
CentOS Linux (4.10.1-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (3.10.0-514.10.2.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-514.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-4f09fa5fdd3642fa85221d7c11370603) 7 (Core)

第一个就是刚刚添加的新内核,现在把它设置为默认。

grub2-set-default 0

“0”表示选择第一个配置文件。

接下来,将linode主机中的启动方式修改为grub2,具体的方法在之前的文章里有详细描述,这里就不重复了。重启:

reboot

重启后,查看是否已经更新为新的内核

[root@centos ~]# uname -r
4.10.1-1.el7.elrepo.x86_64

此时,再按照前篇文章所说,执行

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

确认bbr已经配置成功后,监测是否运行

[root@centos ~]# lsmod |grep bbr
tcp_bbr                16384  0

出现以上tcp_bbr服务信息即已成功。

参考:

在Linode上应用BBR算法

2017-3-13更新


评论中有反馈说直接使用linode提供的4.9.7也能成功开启,但是lsmod命令并不显示加载了tcp_bbr。刚好我也有个朋友做了相关的测试:

我测试了下,lsmod |grep bbr确实没有输出。但是,根据wget测速,BBR应该是生效了的,这是测试结果:

开启BBR:

关闭BBR:

清空/etc/sysctl.conf时的下载速度过慢以至于无法完成下载,只能截屏即时速度。

所以这就很奇怪了,lsmod |grep bbr的输出与否与BBR开启是否有关系?

所以,结论是,使用Linode提供的4.9.7内核可以开启bbr,但是lsmod并不会显示Module。

在网上查了一下,有一种说法是:

Linode自带的内核都是把模块都编译一块的,所以lsmod里看不到正常,lsmod是看额外加载的模块的。

我认为可能答案就是这样了。

以下是原文


在之前的文章使用BBR算法加速shadowsocks中描述了如何在已经配置好内核的机器上启用TCP BBR。但是在实际应用到Linode的VPS时出现了问题,最后一步执行

lsmod |grep bbr

时,并没有找到tcp_bbr服务,也就是说,服务启动失败。寻找原因之后发现,应该是我直接使用了Linode提供的4.9.7内核,而这个内核并不支持BBR。所以,还是需要手动更换内核。

首先,wget最新的Linux内核(Ubuntu 4.9.x Kernel)

wget -O linux-image-4.9.0-amd64.deb http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.9/linux-image-4.9.0-040900-generic_4.9.0-040900.201612111631_amd64.deb

安装内核

dpkg -i linux-image-4.9.0-amd64.deb

安装grub2引导

dpkg -i linux-image-4.9.0-amd64.deb

修改grub文件

vim /etc/default/grub

将文件内的字段中与下面不同的进行替换和增加

GRUB_TIMEOUT=10
GRUB_CMDLINE_LINUX="console=ttyS0,19200n8"
GRUB_DISABLE_LINUX_UUID=true
GRUB_SERIAL_COMMAND="serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1"
GRUB_TERMINAL=serial

更新grub

update-grub

显示在最顶端的kernel就是即将启动的kernel。如果没显示在最顶端,就把其余的kernel删掉(一般都在最顶端):

apt-get purge OLD_KERNEL_NAME

然后进入linode的dashboard,点击edit:

选择Grub2引导方式,点击保存

保存后,重启主机。此时查看系统内核,应该已经变成4.9了

root@ubuntu:~# uname -r
4.9.0-040900-generic

此时,再按照前篇文章所说,执行

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

确认bbr已经配置成功后,监测是否运行

root@ubuntu:~# lsmod |grep bbr
tcp_bbr                20480  5

出现以上tcp_bbr服务信息即已成功。

使用BBR算法加速shadowsocks

Google 开源了其 TCP BBR 拥塞控制算法,并提交到了 Linux 内核,最新的 4.9 版内核已经已经支持了这个算法。对于这个算法,在知乎问题《Linux Kernel 4.9 中的 BBR 算法与之前的 TCP 拥塞控制相比有什么优势?》中,李博杰博士给出了如下解释:

TCP BBR 致力于解决两个问题:

  1. 在有一定丢包率的网络链路上充分利用带宽。
  2. 降低网络链路上的 buffer 占用率,从而降低延迟。

这些,对于shadowsocks这类的应用来说无疑都是十分需要的。不重复造轮子,github上果然有人已经先行实践了 —— 开启TCP BBR拥塞控制算法

那么,我们就拿来用吧,我的shadowsocks服务器放在Linode上,由于Linode的dashboard可以直接修改kernel版本,BBR算法需要至少4.9以上的内核,那么我们就将VPS的kernel版本调整为最新的4.9.7。修改完成后reboot。

此时查看内核版本:

root@ubuntu:~# uname -r
4.9.7-x86_64-linode80

已经是4.9.7了,然后执行

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

保存生效。

sysctl -p

执行

sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control

如果结果都有bbr, 则证明你的内核已开启bbr。

这里可以再次reboot,确保更改生效。

执行

lsmod | grep bbr

看到有 tcp_bbr 模块即说明bbr已启动。