TCP单边加速–记一次基于centos7和elrepo 的主线内核的bbr模块部署与效果

  • A+
所属分类:系统运维

前言

其实本站是由一台vulter kvm vps进行反向代理,而将主要部分web、mysql数据库、后端存储放置在家中进行工作的vps加单物理机的逻辑集群,即便如此,日前改集群由本地路由器做端口映射的效果并不是很好,故一直抛弃kvm 负载均衡层而是用物理机上的主系统运行nginx完成第一次七层反向代理,经由路由器的端口映射后,再由vps做更前段的反向代理。这样做很低效且占用物理机系统的端口不好管理。恰巧“顺便”了解了关于vps科学上网加速的有关知识,经过尝试后豁然开朗。便将本次设置的方法做一个记录,方便以后使用。

TCP阻塞算法

BBR这是2016年9月份才开源的一个优化网络拥堵的算法。较为新版本的Linux内核(4.9-rc8后)中已经集成了该算法包含于tcp_bbr模块中。

我们知道, 网络层的IP协议是不可靠的,没有提供可靠数据传输的机制,而传输层的TCP在定义三次握手四次端口的可靠连接方式外,还负责提供了可靠数据传输的机制,依靠错误检测、超时、重传、流量控制和阻塞控制等等。由于发送端发送的报文速度要通常比接收端大。这样会造成网络阻塞的问题,如果不使用一定手段进行控制,就会造成死锁。当一下两种情况

1.网络传输TCP报文过程中发生丢失报文,2.报文需要重传。

时,显然网络出现了拥塞。默认常用的TCP阻塞控制有AIMD(Additictive-Increase, Multiplicative-Decrease)加法增大乘法减少,就是当没发生丢失(没有超时和收到三次重复ACK)时,(慢开始:慢开始门槛前阻塞窗口指数增长)阻塞窗口大小是线性累加的(通常是每个RTT增加1MSS),当发生丢失现象时(超时和三次重复ACK),阻塞窗口大小减为原来的一半。算法代价较大。表现为远距离传输时高丢包环境下50兆带宽只有几时kb的传送。

BBR加速

类似Zata-tcp和锐速(基于Zata-tcp)基于之流的tcp加速,就是通过智能的tcp阻塞算法,最大限度得利用带宽和传输能力,但双边加速一如finalspeed需要双边协商或者映射端口,而单边加速的则没有这个限制。

BBR的组成

bbr算法实际上非常简单,在实现上它由5部分组成:

1.即时速率的计算

计算一个即时的带宽bw,该带宽是bbr一切计算的基准,bbr将会根据当前的即时带宽以及其所处的pipe状态来计算pacing rate以及cwnd(见下文),后面我们会看到,这个即时带宽计算方法的突破式改进是bbr之所以简单且高效的根源。计算方案按照标量计算,不再关注数据的含义。在bbr运行过程中,系统会跟踪当前为止最大的即时带宽。

2.RTT的跟踪

bbr之所以可以获取非常高的带宽利用率,是因为它可以非常安全且豪放地探测到带宽的最大值以及rtt的最小值,这样计算出来的BDP就是目前为止TCP管道的最大容量。bbr的目标就是达到这个最大的容量!这个目标最终驱动了cwnd的计算。在bbr运行过程中,系统会跟踪当前为止最小RTT。

3.bbr pipe状态机的维持

bbr算法根据互联网的拥塞行为有针对性地定义了4中状态,即STARTUP,DRAIN,PROBE_BW,PROBE_RTT。bbr通过对上述计算的即时带宽bw以及rtt的持续观察,在这4个状态之间自由切换,相比之前的所有拥塞控制算法,其革命性的改进在于bbr拥塞算法不再跟踪系统的TCP拥塞状态机,而旨在用统一的方式来应对pacing rate和cwnd的计算,不管当前TCP是处在Open状态还是处在Disorder状态,抑或已经在Recovery状态,换句话说,bbr算法感觉不到丢包,它能看到的就是bw和rtt!

4.结果输出-pacing rate和cwnd

首先必须要说一下,bbr的输出并不仅仅是一个cwnd,更重要的是pacing rate。在传统意义上,cwnd是TCP拥塞控制算法的唯一输出,但是它仅仅规定了当前的TCP最多可以发送多少数据,它并没有规定怎么把这么多数据发出去,在Linux的实现中,如果发出去这么多数据呢?简单而粗暴,突发!忽略接收端通告窗口的前提下,Linux会把cwnd一窗数据全部突发出去,而这往往会造成路由器的排队,在深队列的情况下,会测量出rtt剧烈地抖动。
bbr在计算cwnd的同时,还计算了一个与之适配的pacing rate,该pacing rate规定cwnd指示的一窗数据的数据包之间,以多大的时间间隔发送出去。

5.其它外部机制的利用-fq,rack等

bbr之所以可以高效地运行且如此简单,是因为很多机制并不是它本身实现的,而是利用了外部的已有机制如-fq,rack。

更换内核和开启bbr

1,内核的更换

 

rpm --import 增加资源库 安装添加源的rpm包,启用源并安装mainline内核

2.以新内核启动

查看内核在grub中的顺序

grub2-set-default  "CentOS Linux (4.9.3-1.el7.elrepo.x86_64) 7 (Core)" #此时的内核最新版本为4.9.3

也可grub2-set-default 1,设定默认内核可选,需要重启使用新内核启动

3.追加内核参数启用算法

模块是默认载入的,我们要做的是:

  1. cat >>/etc/sysctl.conf<<EOF
  2. net.core.default_qdisc=fq
  3. net.ipv4.tcp_congestion_control=bbr
  4. EOF

如此追加关于阻塞控制的设置
最后只需sysctl -p生效即可

效果

目前即便同样是共用单网卡网桥的kvm虚拟机做一次反向代理,任然能较好的传输和反馈监听。不少人说这是黑科技,与时俱进的设计确实如此重要。

weinxin
我的微信公众号
我的微信公众号扫一扫

发表评论

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen: