bbr需内核≥4.9且必须同时启用fq队列与bbr算法,缺一不可;先用uname -r和sysctl net.ipv4.tcp_available_congestion_control确认支持,再临时测试sysctl -w,最后写入/etc/sysctl.conf并sysctl -p生效。

BBR 不是“一开就快”的魔法开关,它只对 TCP 流量起作用,且必须满足内核 ≥ 4.9 才能原生启用。不检查前提就执行命令,大概率会看到 sysctl: cannot assign to net.ipv4.tcp_congestion_control 这类报错,或者配置写进去了却始终不生效。
确认内核版本和BBR模块是否可用
这是最容易跳过的一步,但跳过就会白忙活。BBR 自 Linux 4.9 起才被主线内核正式集成,CentOS 7 默认的 3.10.x 内核根本没这个功能。
- 运行
uname -r,输出如5.15.0-105-generic或4.19.216才算达标;若为3.10.0-1160,必须先升级内核或用 KernelCare 热补丁 - 运行
lsmod | grep tcp_bbr:有输出说明模块已加载;无输出 ≠ 不支持,只是还没加载 - 运行
sysctl net.ipv4.tcp_available_congestion_control:输出里必须包含bbr,否则后续设置无效
临时启用BBR验证兼容性
别急着改配置文件。先用临时命令跑一遍,看系统能不能接受这两个参数,避免改完 /etc/sysctl.conf 后发现根本不起作用,还得手动清理。
- 执行
sudo sysctl -w net.core.default_qdisc=fq:BBR 必须搭配fq队列调度器,用pfifo_fast或其他队列会导致降速甚至连接异常 - 再执行
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr - 立刻验证:
sysctl net.ipv4.tcp_congestion_control应返回bbr;sysctl net.core.default_qdisc应返回fq - 注意:该方式重启后失效,适合测试阶段
永久启用BBR并确保开机生效
生产环境必须走这步,但关键不是“写进去”,而是“写对位置 + 正确加载”。很多人把配置追加到错误文件(比如 /etc/sysctl.d/99-sysctl.conf)或漏掉 sysctl -p,结果重启后还是 cubic。
- 用
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加载全部配置(不是sysctl --system,后者行为更复杂,容易绕过你刚写的两行) - 验证时不要只看
tcp_congestion_control,务必连带检查net.core.default_qdisc是否也为fq—— 少一个就等于没开成功
CentOS 7这类老系统要特别处理
CentOS 7 默认内核是 3.10.x,硬写 bbr 参数只会报错。你只有两个现实选择,没有第三条路:
- 升级内核:导入 ELRepo 源,安装
kernel-ml,修改grub2默认启动项,然后 reboot —— 这是最稳妥、兼容性最好的方式 - 用 KernelCare 热补丁:不用重启,但需要注册、绑定许可证密钥,且免费版有节点限制;执行
kcarectl --set-config kpatch.net.ipv4.tcp_congestion_control=bbr后仍需手动触发kcarectl --update - 别信“手动编译注入
tcp_bbr模块到 initramfs”这种方案,实测在多数云厂商镜像上会引发启动失败
真正容易被忽略的是:BBR 只影响新建立的 TCP 连接。改完配置后,旧的 SSH 会话、已存在的下载任务、正在运行的 Nginx 连接都不会切换算法,必须新建连接才能观察效果。验证时用 curl -v http://your-server-ip 或 wget 发起新请求,而不是盯着旧终端看。











