文章

给 VPS 开 BBR:一个会重写 sysctl.conf 的脚本

给 VPS 开 BBR:一个会重写 sysctl.conf 的脚本

它做什么

一条命令给 Linux VPS 配好 BBR 拥塞控制和一组配套的 TCP 参数。

1
bash <(curl -fsSL https://raw.githubusercontent.com/poisonhs/bbr-tcp/main/install.sh)

也可以用参数控制行为:

1
2
3
sudo sh install.sh --dry-run   # 只打印将要应用的配置,不动系统
sudo sh install.sh --apply     # 写入并立即加载(默认)
sudo sh install.sh --remove    # 备份后清空 /etc/sysctl.conf

写入哪些参数

参数值作用
net.core.default_qdiscfqBBR 依赖的队列规则,缺了效果打折
net.core.rmem_max67108864接收缓冲上限 64MB
net.core.wmem_max67108864发送缓冲上限 64MB
net.ipv4.tcp_fastopen3客户端与服务端同时启用 TFO,省一次握手往返
net.ipv4.tcp_tw_reuse1复用 TIME_WAIT 连接,短连接多时有意义
net.ipv4.tcp_slow_start_after_idle0空闲后不重置拥塞窗口,长连接不会重新慢启动
net.ipv4.tcp_rmem4096 87380 33554432接收缓冲动态范围
net.ipv4.tcp_wmem4096 65536 67108864发送缓冲动态范围
net.ipv4.tcp_mtu_probing1自动探测 PMTU,绕过 MTU 黑洞
net.ipv4.tcp_congestion_controlbbr拥塞控制算法本身
net.ipv4.tcp_notsent_lowat131072限制未发送数据量,降低排队延迟

这套组合的逻辑:BBR 负责在高丢包链路上跑出带宽,fq 给它合适的队列,缓冲区上限保证大带宽高延迟链路(BDP 大)不会被卡住,tcp_notsent_lowat 反过来防止缓冲过大带来延迟。

两个值得注意的设计

逐项试探,不成功的就不写。 脚本不是一把梭把 11 条参数全塞进配置文件,而是逐条 sysctl -w 试:

1
2
3
4
5
6
if sysctl -w "$KEY=$VALUE" >/dev/null 2>&1; then
  printf '%s\n' "$LINE" >> "$TMP_FILE"
  echo "已应用:$KEY = $VALUE"
else
  echo "已跳过(参数不存在或 VPS 限制):$KEY"
fi

结果就是:在 LXC、OpenVZ 这类容器里,即使部分参数被内核拒绝,脚本也能继续跑完,而且配置文件里只留真正生效的条目——不会留下一堆重启时报错的无效配置。

先检查内核是否支持 BBR。 跑之前会读 net.ipv4.tcp_available_congestion_control,没有 bbr 就直接报错退出,而不是写一堆配置然后发现没效果。

风险:它会清空 /etc/sysctl.conf

这是用之前必须知道的:

安装会清空并完全重写 /etc/sysctl.conf,文件里原有的所有配置都会被删掉。

如果你的机器上有别的 sysctl 调优——vm.swappiness、kernel.panic、文件句柄上限、网络栈的其他参数——装完就都没了。

--remove 也不是「恢复原状」,它是备份后同样清空。

脚本每次操作前会生成带时间戳的备份(/etc/sysctl.conf.bak.20261105054500 这种),但恢复得自己手动拷回去。

所以建议的顺序是:

1
2
3
4
5
6
7
8
9
10
11
# 1. 先手动备份一份,别只依赖脚本的
sudo cp /etc/sysctl.conf /root/sysctl.conf.mybackup

# 2. 看看会写什么
sudo sh install.sh --dry-run

# 3. 对比现有配置,确认没有要保留的条目
cat /etc/sysctl.conf

# 4. 再执行
sudo sh install.sh

验证

1
2
sysctl net.ipv4.tcp_congestion_control
sysctl net.core.default_qdisc

预期输出:

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

只看这两条就够了。其他缓冲区参数的生效情况,脚本在安装过程中已经逐条打印过。

什么时候别用

  • 内核低于 4.9:没有 BBR,脚本会在检查阶段就退出
  • OpenVZ / LXC 容器:sysctl 大部分只读,能写进去的有限,效果取决于宿主机
  • 机器上已有精细调优:上面那条风险说的就是这种情况,会被清空
  • 只想临时试试:直接 sysctl -w net.ipv4.tcp_congestion_control=bbr 就行,不用动配置文件

写在最后

BBR 本身不用这么长的参数表,fq + bbr 两条就能跑。这个脚本的价值在于把常被忽略的几项一起配了——尤其是 tcp_slow_start_after_idle 和 tcp_notsent_lowat,一个影响长连接吞吐,一个影响延迟。

但「一键」的代价永远是「你不知道它改了什么」。所以 --dry-run 那一步别省。

仓库:poisonhs/bbr-tcp

本文由作者按照 CC BY 4.0 进行授权