内容简介:传统 TCP 拥塞控制算法,基于基于「丢包反馈」的协议是一种这种协议可以
传统 TCP 拥塞控制算法,基于 丢包反馈
的协议。
基于「丢包反馈」的协议是一种 被动式 的拥塞控制机制,其依据网络中的 丢包事件
来做网络拥塞判断。即便网络中的负载很高时,只要没有产生拥塞丢包,协议就不会主动降低自己的发送速度。
这种协议可以 最大程度的利用网络剩余带宽,提高吞吐量。
然而,由于基于丢包反馈协议在网络近饱和状态下所表现出来的侵略性,一方面大大提高了网络的带宽利用率;但另一方面,对于基于丢包反馈的拥塞控制协议来说,大大提高网络利用率同时意味着下一次拥塞丢包事件为期不远了,所以这些协议 在提高网络带宽利用率的同时也间接加大了网络的丢包率
,造成整个网络的抖动性加剧。
还有谁导致了丢包?
丢包并不总是拥塞导致,丢包可能原因是多方面,比如:
- 全球最牛的防火墙 GWF 的随机丢包策略
- 网路中由于多路径衰落(multi-path fading)所造成的信号衰减(signal degradation)
- 通道阻塞造成的丢包(packet drop),再者损坏的封包(corrupted packets)被拒绝通过
- 有缺陷的网路硬件、网路驱动软件发生故障
- 信号的信噪比(SNR)的影响
Google BBR 的出现
我们自然不喜欢 GWF 这种人为的随机丢包策略,当路过 GWF 时,数据被丢包,我们在此时应该 立刻重新发包,增大发送的频率,而不希望降低速度,也就是不希望传统的 TCP 拥塞算法去控制。
由此,就出现了基于不丢包的拥塞控制算法 CDG
, 以 延迟 作为判断依据,延迟增大说明拥塞, 数据开始在路由器的缓冲中积累. 降低发送 窗口 。然而 CDG 算法与基于丢包的算法不兼容, 只有全球的设备都换上 CDG,但这是不可能的,目前市面上的设备不可能一下子都切换到 CDG,因此 Google 就不开心了,Google 的科学家们开发了一种过渡算法来解决这个问题,这个算法的名字就是 BBR(Bottleneck Bandwidth and RTT)
,它是一种全新的 拥塞控制算法 ,BBR 同 CDG 一致的思想是不以丢包作为拥塞控制信号,但是和 CDG 不同的是,BBR 能和 cubic 和 reno 共存。
使用BBR前后网络吞吐量对比图 / By Google
BBR 由 Google 开发,供 Linux 内核的 TCP 协议栈使用,有了 BBR 算法,Linux 服务器可以显著提高吞吐量并减少连接延迟,简单来说 BBR 能加速网络传输速度。此外,部署 BBR 也很容易,因为该算法只需要发送方,而不需要网络或接收方的支持。
CentOS 7 服务器实例上部署 BBR
下面我将向您分享我如何在 CentOS 7 KVM 服务器实例上部署 BBR。
步骤〇: 前置条件
- CentOS 7 x64 服务器实例。
- 一个 sudo 用户
步骤 ① :使用 ELRepo RPM 仓库升级内核
要使用BBR,您需要将CentOS 7机器的内核升级到4.9.0。您可以使用ELRepo RPM第三方仓库轻松完成该操作。
在升级之前,您可以查看当前内核:
uname -r
此命令应可能输出类似于以下字符串:
3.10.0-514.2.2.el7.x86_64
如您所见,当前内核为3.10.0,因此我们需要更新内核。
更新内核之前,先安装 ELRepo 仓库:
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org sudo rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
使用ELRepo repo安装4.9.0内核:
sudo yum --enablerepo=elrepo-kernel install kernel-ml -y
确认结果:
rpm -qa | grep kernel
如果安装成功,您应该看到类似于一下列,且 kernel-ml-4.18.5-1.el7.elrepo.x86_64
在输出列表中看到:
kernel-ml-4.18.5-1.el7.elrepo.x86_64 kernel-3.10.0-514.el7.x86_64 kernel-tools-libs-3.10.0-514.2.2.el7.x86_64 kernel-tools-3.10.0-514.2.2.el7.x86_64 kernel-3.10.0-514.2.2.el7.x86_64
现在,您需要通过设置默认引导为 grub2 ,来启用4.18.5内核。
显示 grub2 菜单中的所有条目:
sudo egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \'
结果应该类似于:
CentOS Linux 7 Rescue a0cbf86a6ef1416a8812657bb4f2b860 (4.18.5-1.el7.elrepo.x86_64) CentOS Linux (4.18.5-1.el7.elrepo.x86_64) 7 (Core) CentOS Linux (3.10.0-514.2.2.el7.x86_64) 7 (Core) CentOS Linux (3.10.0-514.el7.x86_64) 7 (Core) CentOS Linux (0-rescue-bf94f46c6bd04792a6a42c91bae645f7) 7 (Core)
由于行计数开始于 0
,且4.18.5内核条目位于第一行,因此将默认引导条目应设置为 0
:
sudo grub2-set-default 0
重启系统:
sudo shutdown -r now // 或 reboot
当服务器重新联机时,请重新登录并重新运行uname命令以确认您使用的是正确的内核:
uname -r
您应该看到如下结果:
4.18.5-1.el7.elrepo.x86_64
步骤 ②:启用BBR
要启用 BBR 算法,您需要修改 sysctl
配置,如下所示:
echo 'net.core.default_qdisc=fq' | sudo tee -a /etc/sysctl.conf echo 'net.ipv4.tcp_congestion_control=bbr' | sudo tee -a /etc/sysctl.conf sudo sysctl -p
现在,您可以使用以下命令,确认是否已经启用了BBR:
sudo sysctl net.ipv4.tcp_available_congestion_control
正常情况下应输出类似以下的字符串:
net.ipv4.tcp_available_congestion_control = bbr cubic reno
接下来,继续验证:
sudo sysctl -n net.ipv4.tcp_congestion_control
应该输出类似以下字符串:
bbr
最后,检查内核模块是否已加载:
lsmod | grep bbr
应该输出类似于:
tcp_bbr 20841 0
步骤 ③(可选):测试网络性能是否增强
为了测试BBR的网络性能是否增强,您可以在Web服务器目录中创建一个文件以供下载,然后从台式机上的Web浏览器测试下载速度。
sudo yum install httpd -y sudo systemctl start httpd.service sudo firewall-cmd --zone=public --permanent --add-service=http sudo firewall-cmd --reload cd /var/www/html sudo dd if=/dev/zero of=500mb.zip bs=1024k count=500
最后, http://[your-server-IP]/500mb.zip
从桌面计算机上的 Web 浏览器访问 URL ,然后评估下载速度。
当然服务器在国外的话,也可以在 YouTube 上直接打开一个 4K 画质视频,进行感官速度测试,如下图:
使用BBR后的YouTube速度 © JANDOU
就这样,尽情享受高速网络带来的新体验。
步骤 ④ (可选):删除无用的旧内核
升级内核之后,往往老旧的内核也保留下来了,执行以下命令,将自动筛选并删除当前无用的系统内核版本。
yum remove $(rpm -qa | grep kernel | grep -v $(uname -r))
详情请参考文章: CentOS 7 删除无用的旧内核
非专业技术人员福利
如果您不是专业技术人员,可以采取一键安装脚本进行安装,执行以下命令:
wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh
详情请参考文章: 一键安装最新内核并开启 BBR 脚本
参考链接:
TCP BBR congestion control comes to GCP – your Internet just got faster
How to Deploy Google BBR on CentOS 7 By Vultr
对 Google TCP BBR 的浅薄认识技术致谢
Neal Cardwell,高级软件工程师;
Yuchung Cheng,高级软件工程师;
C. Stephen Gunn,高级职员可靠性工程师;
Soheil Hassas Yeganeh,高级软件工程师;
Van Jacobson, 研究科学家;
Amin Vahdat, 谷歌研究员。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- linux 部署golang 项目(直接部署和基于nginx部署)
- 部署策略对比:蓝绿部署、金丝雀发布及其他
- 使用Docker容器化部署实践之Django应用部署(一)
- 【前端打包部署】谈一谈我在SPA项目打包=>部署的处理
- 「实战篇」开源项目docker化运维部署-后端java部署(七)
- Kubernetes 中的渐进式交付:蓝绿部署和金丝雀部署
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。