跳转到内容
严选跨境网络服务与流媒体推荐
实机测速保障 · 专属折扣
声明:以上服务由影迷漫游评测实验室进行晚高峰抽测与流媒体解锁验证。专属链接包含推广支持,不增加您的购买成本。

Linux BBR 拥塞控制算法开启教程 | VPS 网络加速完全指南 ​

Linux BBR Network Optimization

买了国外 VPS 之后,很多人第一反应是测速:带宽明明不小,传文件却跑不满,晚高峰还会一卡一卡。换机房、换线路之前,不妨先看一个常被忽略的环节:这台机器用的 TCP 拥塞控制算法。发包节奏由它决定,节奏不对,带宽再大也用不实。BBR 就是在这个环节上换了一种思路的算法,本文讲它是什么、适合什么链路、怎么开,以及什么时候不该开。

BBR 是什么、解决什么问题 ​

TCP 要在不知道网络状况的情况下决定发多快。传统算法的做法是试探着加速,直到出现丢包,才认定网络堵了、把速度降下来。这个逻辑在局域网里没问题,因为局域网丢包基本就等于拥堵。但在跨洋链路上,丢包不一定来自拥堵:长距离传输本身就有底噪,中间设备也可能随机丢弃少量报文。按丢包判断拥堵,就会在网络其实还畅通的时候反复刹车,速度自然上不去。

BBR 的思路反过来:它不以丢包为唯一信号,而是持续估算两个量——这条链路的瓶颈带宽,和报文往返一趟的最小传播时延。发送速率就按“带宽乘以时延”这个窗口来控制,既不把链路打满到排队,也不让它空转。BBR 这个名字就来自这两个量:瓶颈带宽(Bottleneck Bandwidth)与往返传播时间(Round-trip propagation time)。它由 Google 提出,现已合进 Linux 内核主线,近年的主流发行版默认内核都已内置,不需要另外装模块。

还有一个常被忽略的搭档:队列规则。BBR 需要发送端能按节奏均匀发包,Linux 上通常配 fq(公平队列)来做这件事。开启 BBR 时把默认队列规则设为 fq,是标准做法的一部分,只改拥塞控制算法、不改队列规则,效果会打折。

估算本身也不是一成不变的。BBR 在运行中会周期性地做两件事:一是短暂提速,探一探链路现在能容纳的带宽上限有没有变大;二是短暂收一收,重新测一次最小往返时延,防止时延基准被排队拖大。这种“探一探、收一收”的节奏,就是它能在链路条件变化时跟得上的原因。理解这一点也有助于看待它的波动:BBR 的发送速率本来就不是一条直线,短时间内的起伏不等于不稳定,关键看长时间的平均表现和抖动有没有改善。

另外要区分两个容易混淆的概念:拥塞控制算法和队列管理。拥塞控制决定发送端发多快,队列管理决定中间设备和接收端怎么排队、丢弃报文。BBR 管的是前者;如果瓶颈在接收端或中间设备的队列策略上,光换发送端算法是解决不了的。这也是为什么有些教程里成套的“优化参数”会顺带改一堆队列和缓冲区设置——那些改动各有各的适用条件,不应该因为开启了 BBR 就默认全盘接受。

理解了这一点,也就理解了 BBR 的定位:它优化的是“已有带宽怎么用”,而不是凭空变出带宽。带宽上限、运营商限速、线路本身的丢包率,这些它都改变不了。把它当成加速器、指望开了就翻倍,是对它最常见的误解。

适用场景与边界 ​

BBR 最见效的场景有一个共同特征:往返时延大、且链路上有与拥堵无关的少量丢包。典型的就是跨境长距离传输:服务器在海外、用户在国内,或者反过来;以及跑在跨洋链路上的 Web 服务、文件同步、代理节点。这类场景下,传统算法被零星丢包反复打断,BBR 靠带宽与时延建模维持稳定发送,体验差距最明显。

反过来,有几类场景开不开区别不大。第一是局域网和同城机房:时延本来就低、丢包基本等于拥堵,传统算法已经够用。第二是带宽已经跑满的链路:发送端早就把管子占满了,换算法变不出更多带宽。第三是链路本身质量极差、丢包率很高:BBR 能缓解误判,但救不了底子太差的线路,该换线路还是得换。

还有一条边界值得提前知道:公平性。同一条链路上如果既有 BBR 流又有传统算法流,BBR 抢带宽的能力通常更强。在自己的 VPS 上这一般不是问题,但如果你在共享环境或对公平性有明确要求的场景里,就要先确认管理策略允不允许改拥塞控制算法。没有 root 权限的共享主机、托管面板、某些云厂商的定制模板,都可能不让你改这项配置,动手前先确认权限。

最后还有一类“看似对症、实际不对症”的情况:卡顿的根源不在传输层。比如源站应用本身响应慢、数据库查询拖时间、TLS 握手或 DNS 解析耗时,这些问题换拥塞控制算法都不会有改善。动手之前先定位:如果是下载大文件、视频流、备份同步这类持续传输慢,BBR 才值得一试;如果是打开页面时“转半天才开始加载”,更可能是应用层或解析链路的问题,方向就错了。分清瓶颈在哪一层,比急着改配置重要得多。

开启步骤 ​

动手之前先确认两件事:当前内核是否提供 BBR,以及你有没有 root 权限。第一件事用一条命令就能看:

bash
sysctl net.ipv4.tcp_available_congestion_control

输出里如果有 bbr,就可以直接开启。近年的 Debian、Ubuntu 等主流发行版基本都满足这个条件;如果输出里没有,说明内核较旧,走发行版官方渠道升级内核,不要用来源不明的第三方换内核脚本——换内核出问题,机器可能直接起不来。

确认可用之后,推荐用独立配置文件的方式开启,而不是往系统主配置文件里追加。这样做的好处是配置独立、不跟其他设置混在一起,日后回退只要删一个文件:

bash
# 创建 BBR 专用配置文件
cat > /etc/sysctl.d/99-bbr.conf <<EOF
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF

# 应用配置
sysctl --system

这里有两个细节值得说明。第一是文件名里的 99:sysctl.d 目录下的文件按字典序加载,数字越大优先级越高,99 能确保这份配置不被发行版自带的其他文件覆盖。第二是 sysctl --system 而不是 sysctl -p:前者会加载整个 sysctl.d 目录,后者默认只读主配置文件,用错命令会导致你以为生效了、其实没有。

网上流传的“一键脚本”大多也是做这两件事,只是包了一层外衣。直接写配置文件更透明,出问题也更容易定位。脚本真正危险的地方不在于它多做了什么,而在于你不知道它多做了什么:有些脚本会顺带改内核参数、换软件源、装来路不明的内核包,出问题之后连“是谁改的”都查不清。自己写两行配置,花的时间差不多,账却清楚得多。至于其他 sysctl 优化项,比如收发缓冲区大小、连接队列长度,那是另一类调优,跟“开启 BBR”本身无关;没有明确瓶颈之前,不建议跟着教程成套照搬,参数抄错反而可能让网络更不稳定。

写完配置还有一个容易漏的检查:确认配置在重启后仍然生效。sysctl.d 下的文件本身就是持久化的,正常重启不会丢;但有些云厂商的镜像会在首次启动时用模板重写系统配置,或者用自己的初始化工具接管网络设置。如果你在重启后发现算法被改回去了,先查厂商文档里关于 sysctl 持久化的说明,而不是反复在机器上手动改——手动改得再熟,也架不住每次重启被模板覆盖。

验证与回退 ​

配置应用完之后,用三条命令确认它真的生效了,而不是只写进了文件:

bash
# 当前使用的拥塞控制算法,应输出 bbr
sysctl net.ipv4.tcp_congestion_control

# 默认队列规则,应输出 fq
sysctl net.core.default_qdisc

# BBR 模块是否已加载,应能看到 tcp_bbr
lsmod | grep bbr

如果前两项对了、模块却没加载,通常只是因为还没有 TCP 连接触发它,不必紧张;跑一次实际流量再查,一般就能看到。想看得更细一点,可以用 ss 命令查看单条连接的状态:输出里会标明当前连接用的拥塞控制算法,以及 BBR 估算出的发送速率等信息。单条连接的数据只能说明这一条路的情况,拿它做判断时要多看几条连接、多个时段,不要凭一次输出下结论。

验证的另一半是效果对比,但对比要讲方法。直接凭感觉说“快了”或“慢了”都不靠谱:不同时段的跨境链路表现本来就波动很大。稳妥的做法是临时切换、同一时段对比。下面的命令只改运行时状态,不动配置文件,重启或重载配置后就会恢复,适合用来做对照:

bash
# 临时切回 CUBIC 做对照
sysctl -w net.ipv4.tcp_congestion_control=cubic

# 对照完切回 BBR
sysctl -w net.ipv4.tcp_congestion_control=bbr

如果对照下来 BBR 确实更差,或者你只是想恢复原状,回退也很简单:删掉专用配置文件,再重载一次配置即可:

bash
rm /etc/sysctl.d/99-bbr.conf
sysctl --system

回退之后再用验证命令确认一次,确保当前算法已经回到原来的值。

验证也不宜只看开通当天的表现。跨境链路的状况随时间、随运营商策略变化,今天测出来更好,不代表下个月还是这样。比较稳妥的做法是:开通后留意几个晚高峰时段的实际体验,比如文件同步会不会中途掉速、视频流会不会频繁缓冲;如果连续几天的高峰表现都比开通前稳,这个改动才算真正站住脚。反过来,如果只在某个时段快、其他时段反而更差,就要回到对照测试里找原因,而不是凭一次测速结果把配置定下来。网络优化本来就是个需要复查的活,一次设置、终身有效的想法,在这一层并不成立。

有几种常见的“没生效”情况,排查时可以按顺序看:第一,配置文件放错了位置或文件名拼错,sysctl --system 会逐个列出它加载的文件,对照一下有没有你这一份;第二,被其他 sysctl 文件覆盖了,检查 sysctl.d 目录下有没有数字更大的文件也设置了 tcp_congestion_control;第三,云厂商的初始化模板在重启后重写配置,这种情况要去看厂商文档里对应的持久化位置,而不是反复在机器上改。

不适合的场景 ​

最后把“不该开”的情况集中说清楚,免得把 BBR 当成万能药。

第一,前面提过:带宽已满、局域网低延迟、链路底子太差,这三种情况开 BBR 收益很小。第二,没有 root 权限或受托管策略限制的环境,改配置本身就不被允许,硬改可能违反服务条款。第三,对延迟极其敏感、且链路本身已经很干净的实时交互,比如同城机房内的游戏或音视频服务,传统算法的表现未必更差,换算法之前先做对照测试。第四,已经跑着其他拥塞控制调优方案的机器:两套思路混用容易互相干扰,先理清现状再决定。

还有一种情况值得单独提醒:开了 BBR 之后,平均速度上去了、抖动却变大了。这种现象不一定是 BBR 本身的问题,更常见的原因是队列规则与虚拟化环境的配合:某些虚拟网卡或宿主机层面的队列策略,会跟 fq 的发包节奏互相干扰。遇到这种情况,先确认队列规则确实是 fq、再做一次临时切换对照;如果切回传统算法抖动就消失,那这台机器的环境可能就不适合 BBR,留着对照结果、按回退方法恢复即可,不必强求。

一句话总结:BBR 值得开,但只值得在它对症的场景里开。判断标准不是“别人都说好”,而是你的链路是不是长距离、高时延、带丢包底噪,以及对照测试是不是真的更好。开了之后记得验证,效果不好就按上面的方法回退——能干净回退的优化,才是安全的优化。

下一步学习:


延伸阅读 ​

免责声明

本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。