前言

如果你有订阅一些科技新闻,应该会有看过内核在4.9当中加入了一个新的算法,来解决在有一定的丢包率的情况下的带宽稳定的问题,这个是谷歌为我们带来的干货,新的 TCP 拥塞控制算法 BBR (Bottleneck Bandwidth and RTT),谷歌一向的做法是,先上生产,然后发论文,然后有可能开源,所以这个已经合并到了内核4.9分支当中,算法带来的改变在出的测试报告当中有很详细的数据展示,这个看多了可能反而不知道到底会有什么明显改变,特别是对于我们自己的场景

那么本篇就是来做一个实践的,开看看在通用的一些场景下,这个改变有多大,先说下结果,是真的非常大

实践

还是我的两台机器lab8106和lab8107,lab8106做一个webserver,lab8107模拟客户端,用简单的wget来进行测试,环境为同一个交换机上的万兆网卡服务器

我们本次测试只测试一种丢包率的情况就是1%,有兴趣的情况下,可以自己去做些其他丢包率的测试,大多数写在丢包率20%以上的时候,效果可能没那么好,这个高丢包率不是我们探讨的情况,毕竟不是常用的场景

安装新内核

内核可以自己选择4.9或者以上的进行安装,也可以用yum安装,这里只是测试,就yum直接安装

yum --enablerepo=elrepo-kernel install kernel-ml

修改启动项

grub2-editenv list
grub2-set-default 'CentOS Linux (4.9.5-1.el7.elrepo.x86_64) 7 (Core)'
grub2-editenv list

准备下载数据

准备一个web服务器然后把一个iso丢到根目录下,用于客户端的wget

设置丢包率

这里用tc进行控制的,也就是一条命令就可以了,这个还可以做其他很多控制,可以自行研究

tc qdisc add dev enp2s0f0 root netem loss 1%

如果需要取消限制

tc qdisc del root dev enp2s0f0

设置新的算法

讲下面的两个配置文件添加到/etc/sysctl.conf

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

然后执行sysctl -p让它生效

检查是参数是否生效

[root@lab8106 rpmbuild]# sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = bbr cubic reno

检查模块是否开启

[root@lab8106 rpmbuild]# lsmod | grep bbr
tcp_bbr 16384 0

如果需要恢复成默认的就修改成下面这个值,然后执行sysct -p恢复默认

net.ipv4.tcp_congestion_control = cubic
net.core.default_qdisc = pfifo_fast

开始测试

为了避免磁盘本身的写入速度的影响,我们直接将数据wget到内存当中去

[root@lab8107 ~]# cd /dev/shm

写入到这个目录当中的数据就是直接写入内存的

我们先来对比下没有丢包的时候的速度

默认算法,无丢包率

 wget http://192.168.8.106/FreeBSD-10.2-RELEASE-amd64-dvd1.iso
2017-01-24 12:34:01 (909 MB/s) - ‘FreeBSD-10.2-RELEASE-amd64-dvd1.iso’ saved

BBR算法,无丢包率

wget http://192.168.8.106/FreeBSD-10.2-RELEASE-amd64-dvd1.iso
2017-01-24 12:36:21 (913 MB/s) - ‘FreeBSD-10.2-RELEASE-amd64-dvd1.iso’ saved

上面的两组数据基本一样,没有什么差别

下面的测试将丢包率控制到1%,然后继续测试

默认算法,1%丢包率

wget http://192.168.8.106/FreeBSD-10.2-RELEASE-amd64-dvd1.iso
2017-01-24 12:38:47 (142 MB/s) - ‘FreeBSD-10.2-RELEASE-amd64-dvd1.iso’ saved

可以看到在1%丢包率下,速度已经降为正常的1/6左右了,是一个很大的衰减

BBR算法,1%丢包率

wget http://192.168.8.106/FreeBSD-10.2-RELEASE-amd64-dvd1.iso
2017-01-24 12:40:25 (896 MB/s) - ‘FreeBSD-10.2-RELEASE-amd64-dvd1.iso’

可以看到在1%丢包率下,还能维持接近900MB/s的下载速度,相对于默认算法,相差了真是非常非常的大,google在很多情况下技术甩了其他公司真的是几条街了

总结

上面的测试通过一个简单的场景来验证了bbr算法对于丢包情况下的带宽的优化,这个对于一些提供下载服务,并且有一定的丢包率的场景的情况下,能够有很大的改善,所以算法对于技术的改变还是非常大的,很多时候就是这种异常情况下的差别,才是真正的差别

顺便提一句微博的技术经理@来去之间说的一句话:

曾经有同事问我,为啥有些新业务给老员工做,交学费,而不是市场上招人更有效率。。。俺说渣浪业务起起伏伏,如果所有战线都用雇佣兵,顺的时候势如破竹,逆的时候兵败山倒了。。公司和员工都是相互扶持的,有些新业务,员工有能力做,只是经验不足,公司多付出一些,就当给未来不顺的时候上一份保险了

相关链接

Linux Kernel 4.9 中的 BBR 算法与之前的 TCP 拥塞控制相比有什么优势?

Linux 升级内核开启 TCP BBR 实现高效单边加速

变更记录

Why Who When
创建 武汉-运维-磨渣 2017-01-24

Linux 升级内核开启 TCP BBR 有多大好处的更多相关文章

  1. TCP BBR - 一键安装最新内核并开启 TCP BBR

    原文地址: https://teddysun.com/489.html 最近,Google 开源了其 TCP BBR 拥塞控制算法,并提交到了 Linux 内核,从 4.9 开始,Linux 内核已经 ...

  2. Linux kernel 4.9及以上开启TCP BBR拥塞算法

    Linux kernel 4.9及以上开启TCP BBR拥塞算法 BBR 目的是要尽量跑满带宽, 并且尽量不要有排队的情况, 效果并不比速锐差 Linux kernel 4.9+ 已支持 tcp_bb ...

  3. 开启TCP BBR拥塞控制算法

    原文来自:https://github.com/iMeiji/shadowsocks_install/wiki/%E5%BC%80%E5%90%AFTCP-BBR%E6%8B%A5%E5%A1%9E% ...

  4. Linux升级内核教程(CentOS7)

    1.查看当前内核版本 uname -r 2.通过yum升级内核 通过yum升级内核是最保险的升级方式,因为安装的是操作系统发行厂商验证过兼容性的rpm包,升级风险一般很小. yum install - ...

  5. CentOS Linux 升级内核步骤和方法(转)

    当前系统为CentOS Linux release 6.0 (Final),内核版本为2.6.32-71.el6.i686.由于最近内核出现最新的漏洞(linux kernel 又爆内存提权漏洞,2. ...

  6. Linux升级内核总结

    Linux内核升级总结. 一.编译内核步骤 1.#uname –r 确定系统的原内核版本,然后下载较新版本的Linux内核源码包 http://www.kernel.org/pub/linux/ker ...

  7. RedHat Linux升级内核

    操作系统:Red Hat 6.4 内核文件:linux-3.10.1.tar.gz  https://www.cnblogs.com/cherish-sweet/p/newyum.html uname ...

  8. centos6.5中 linux 升级内核

    需要使用安装docker ,但是docker 需要版本在3.1及以上.但是虚拟机的是2.6所以需要升级 记录以下升级的时候报错以及解决的办法 遇到的错误有: 1.出现curl: (35) SSL co ...

  9. linux升级内核

随机推荐

  1. jmeter_02_目录文档说明

    jmeter目录文档说明 bin目录是可执行文件 jmeter.bat 是启动文件 可以启动jmeter. 使用notpad++ 等文本编辑器打开 bat文件 可以配置jvm的参数 比如堆内存[Hea ...

  2. JS获取指定月份的天数几种方法

    最近看到一个有意思的试题,正好在需求中也碰到类似的问题,即计算某个月的天数问题.碰到类似问题也许大部分会想是不是还要判断闰年.平年,如果这样想的话就复杂了,下面给出具体的计算方法. 获取月份天数方法一 ...

  3. spring boot:thymeleaf模板中insert/include/replace三种引用fragment方式的区别(spring boot 2.3.3)

    一,thymeleaf模板中insert/include/replace三种引用fragment方式的区别 insert: 把整个fragment(包括fragment的节点tag)插入到当前节点内部 ...

  4. centos8平台使用ulimit做系统资源限制

    一,ulimit的用途 1, ulimit 用于shell启动进程所占用的资源,可用于修改系统资源限制 2, 使用ulimit -a 可以查看当前系统的所有限制值 使用ulimit -n <可以 ...

  5. 【服务总线 Azure Service Bus】ServiceBus 队列中死信(DLQ - Dead Letter Queue)问题

    Azure Service Bus 死信队列产生的原因 服务总线中有几个活动会导致从消息引擎本身将消息推送到 DLQ. 如 超过 MaxDeliveryCount 超过 TimeToLive 处理订阅 ...

  6. 如何快速在vscode配置C/C++环境

    目录 1.卸载重装vscode 2.下载vscode 3.下载MinGW 4.配置环境变量 5.配置c/c++环境 6.超完整的配置文件 7.常用扩展推荐 8.注意 9.后记 相信许多刚开始使用vsc ...

  7. pv操作是否会造成死锁呢?

    看了一些pv操作的例子,有一些基本原理不是想得很清楚. 有一个进程 while(true) { p(s); ...... v(s); } s的初值为1. 那么我的问题是,当多个该进程需要执行时,是否会 ...

  8. java安全编码指南之:线程安全规则

    目录 简介 注意线程安全方法的重写 构造函数中this的溢出 不要在类初始化的时候使用后台线程 简介 如果我们在多线程中引入了共享变量,那么我们就需要考虑一下多线程下线程安全的问题了.那么我们在编写代 ...

  9. 看完本文若不能让你学通“Python”,我将永远退出IT界

    学Python,切忌今天这学一点,明天那里学一点,零零散散没有系统的学习.这样不仅耽搁大家时间,久而久之也会消磨大家学习的兴致!这里给大家总结了一张系统的Python学习路线图!希望大家共勉! Pyt ...

  10. Lambda表达式(三)

    public class Test04 { public static void main(String[] args) { /* * Java8中,有一个新的类:Stream类型,它代表一个数据加工 ...