给 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_qdisc | fq | BBR 依赖的队列规则,缺了效果打折 |
net.core.rmem_max | 67108864 | 接收缓冲上限 64MB |
net.core.wmem_max | 67108864 | 发送缓冲上限 64MB |
net.ipv4.tcp_fastopen | 3 | 客户端与服务端同时启用 TFO,省一次握手往返 |
net.ipv4.tcp_tw_reuse | 1 | 复用 TIME_WAIT 连接,短连接多时有意义 |
net.ipv4.tcp_slow_start_after_idle | 0 | 空闲后不重置拥塞窗口,长连接不会重新慢启动 |
net.ipv4.tcp_rmem | 4096 87380 33554432 | 接收缓冲动态范围 |
net.ipv4.tcp_wmem | 4096 65536 67108864 | 发送缓冲动态范围 |
net.ipv4.tcp_mtu_probing | 1 | 自动探测 PMTU,绕过 MTU 黑洞 |
net.ipv4.tcp_congestion_control | bbr | 拥塞控制算法本身 |
net.ipv4.tcp_notsent_lowat | 131072 | 限制未发送数据量,降低排队延迟 |
这套组合的逻辑: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 那一步别省。