Debian12/11/10,如何启用或关闭 BBR

什么是 BBR

BBR 是 Google 提出的一种新型拥塞控制算法,可以使 Linux 服务器显著地提高吞吐量和减少 TCP 连接的延迟。

BBR解决了两个问题:

  • 再有一定丢包率的网络链路上充分利用带宽,非常适合高延迟,高带宽的网络链路。
  • 降低网络链路上的 buffer 占用率,从而降低延迟,非常适合慢速接入网络的用户。

互联网曾广泛使用基于丢包的拥塞控制算法,例如 Reno(Jac88,Jac90,WS95 ,RFC5681)和 CUBIC(HRX08,draft-ietf-tcpm-cubic),这类算法认为丢包和拥塞是等效的。长久以来这类算法都运作的很好,但这并不能说明他们是绝对正确的,这种良好的表现是由于网络交换机和路由器的缓冲区都十分适配当时的网络带宽。而一旦发送者的发送速率足够快,缓冲区便会被快速填满,进而引发丢包。

实际上丢包并不等效于拥塞。拥塞可以被看作是一种在网络路径中,传输中的数据量始终大于带宽-时延积的场景。随着互联网的不断发展,丢包现象在非拥塞场景下也频繁发生。而基于丢包的拥塞控制策略给网络带来了源源不断的问题:

  1. 浅缓存:在浅缓存场景下,丢包往往发生在拥塞之前。高速、长距离的现代网络,搭配上消费级的浅缓存交换机,基于丢包的拥塞控制算法可能会导致极其糟糕的吞吐量,而这种现象则归咎于这类算法对于丢包的过激反应。流量突发引起的丢包会使发送速率乘性递减(这种丢包现象在空闲网络中也会频繁发生)。这种动态特性,使得基于丢包的拥塞控制算法在实际应用中很难对网络带宽进行充分利用:维持10Gbps/100ms RTT的网络,必须要求其丢包率在0.000003%以下。而更为实际的1%的丢包率,则会导致其只能维持在3Mbps/100ms(无论是瓶颈带宽的性能如何)。
  2. 深缓存:在有着深缓存的瓶颈链路中,拥塞往往发送在丢包之前。在现今的的边缘网络中,基于丢包的拥塞控制算法对众多最后几英里的设备,进行了深缓存的反复填充,引发了不必要的数秒级的排队延时,也就是“缓冲膨胀”的问题。

BBR拥塞控制算法使用了另类的方式,不用丢包去衡量拥塞是否发生,而是直接对网络建模来避免以及应对真实的拥塞(它使用网络测量来估计带宽和丢包率。它计算可以通过网络发送数据而不会导致拥塞或数据包丢失的最大速率。BBR 通过跟踪网络的往返时间 (RTT) 和在任何给定时间传输的数据量来实现这一点)。

为什么使用 BBR

BBR 可以通过减少数据包丢失和增加吞吐量来显著提高网络的速度和可靠性,BBR 非常适合需要高吞吐量和低延迟的应用程序。

在 Debian 上启用 BBR 是一个非常简单的过程,我们仅需几步即可,建议使用 Debian 的伙伴都启用以下 BBR。

如何启用 BBR

本教程基于 Debian12,理论上 Debian10、11也同样适用,其他版本的 Debian 需要自行判断。

我们先来输入如下命令检查一下你运行的系统是否支持 BBR,输入后如果界面没有任何输出则表示你的系统当前支持 BBR,如显示其它错误信息则表示不支持,理论上来说内核版本高于4.9就支持使用 BBR,如果低于4.9可以自行升级内核版本。

sudo modprobe tcp_bbr

如果你的系统支持 BBR,可以输入以下命令来查看当前是否已经启用了 BBR。

sudo sysctl net.ipv4.tcp_congestion_control

如果已经启用,界面会输出如下提示,无输出则表示未启用。

net.ipv4.tcp_congestion_control = bbr

如果未启用且支持 BBR,请输入如下命令,下面的命令会将默认排队规则设置为 fq 并启用 BBR 作为拥塞控制算法。

sudo sh -c 'echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf' sudo sh -c 'echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf'

接着输入以下命令使其保存并生效。

sudo sysctl -p

至此,Debian 已经启用 BBR,为验证 BBR 是否启用成功,我们可以使用下面的验证命令。

sudo sysctl net.ipv4.tcp_congestion_control

或者

lsmod | grep bbr

界面输出下面几种提示皆表示已启用 BBR。

net.ipv4.tcp_congestion_control = bbr net.ipv4.tcp_available_congestion_control = bbr cubic reno net.ipv4.tcp_available_congestion_control = reno cubic bbr tcp_bbr   20480   1

如何关闭 BBR

编辑 /etc/sysctl.conf 文件,将 net.core.default_qdisc = fq 以及 net.ipv4.tcp_congestion_control = bbr 这两行使用 # 号注释掉,然后执行如下命令。

sudo sysctl -p

最后重启一下服务器。