内核网络调优:BBR 开启、TCP 快速回收与网速优化
如果你的 Linux 服务器下载速度跑不满、延迟高,或者高并发下连接被频繁重置,问题很可能出在内核网络参数上。主机选这篇 Linux 教程直接给你三个调优方向:开启 BBR 拥塞控制算法、启用 TCP 快速回收、调整内核参数优化网速。别问为什么照着做,实测能压榨出 30% 以上的带宽潜能。

为什么必须调优内核网络参数?
默认的 Linux 内核走的是 CUBIC 拥塞控制算法,对高延迟、高丢包的网络环境优化不足。VPS 和云服务器用户最直观的感受就是:上传速度还可以,下载速度死活上不去。BBR(Bottleneck Bandwidth and Round-trip propagation time)是 Google 开发的算法,能准确探测瓶颈带宽和延迟,减少排队丢包。配合 TCP 快速回收(tcp_tw_reuse、tcp_tw_recycle),还能解决 TIME_WAIT 状态堆积导致的端口耗尽问题。
如何开启 BBR 拥塞控制?
第一步:检查内核版本
BBR 需要 Linux 内核 4.9 及以上版本。先确认你的内核是否支持:
uname -r
输出类似 5.4.0-26-generic,低于 4.9 就老老实实升级内核
第二步:加载 BBR 模块并启用
直接执行以下命令,一步到位:
modprobe tcp_bbr
加载 BBR 内核模块,报错说明内核不支持
echo "tcp_bbr" >> /etc/modules-load.d/modules.conf
开机自动加载模块
然后修改 sysctl 配置,永久生效:
cat >> /etc/sysctl.conf <<EOF
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF
fq 是公平队列调度器,配合 BBR 效果最佳
sysctl -p
立即生效,不用重启
第三步:验证 BBR 是否生效
sysctl net.ipv4.tcp_congestion_control
返回 bbr 就对了,万一返回 cubic 说明没生效
lsmod | grep bbr
看到 tcp_bbr 模块在列表里,稳了
TCP 快速回收与 TIME_WAIT 优化
高并发场景下,短连接会产生大量 TIME_WAIT 状态。不处理,端口号被占满,新连接直接报错。
启用 tcp_tw_reuse 和 tcp_tw_recycle
注意:tcp_tw_recycle 从内核 4.12 开始被移除,如果你用的是旧内核(4.11 及以下),还能用。新内核用户只用 tcp_tw_reuse 就行。
cat >> /etc/sysctl.conf <<EOF
net.ipv4.tcp_tw_reuse = 1
允许将 TIME_WAIT 状态的 socket 用于新连接
net.ipv4.tcp_fin_timeout = 30
缩短 FIN-WAIT-2 等待时间,默认 60 秒
net.ipv4.tcp_max_tw_buckets = 20000
限制 TIME_WAIT 最大数量,超过直接丢弃,防止内存爆炸
EOF
sysctl -p
老鸟叮嘱:千万别同时开 tcp_tw_recycle 和 NAT
如果你在 NAT 网络环境(比如大多数云服务器、VPS),绝对不要开启 tcp_tw_recycle。这个参数会基于源 IP 的时间戳来丢弃连接,导致 NAT 后面的用户无法正常访问你的服务。踩过这个坑的人不少,主机选这里提醒你:新内核直接忽略 tcp_tw_recycle,只用 tcp_tw_reuse 就够了。
内核网络参数批量调优
除了 BBR 和 TCP 回收,还有一堆参数能压榨带宽。下面是一份实战调优清单,直接复制粘贴到服务器上。
cat >> /etc/sysctl.conf <<EOF
增大 TCP 缓冲区
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
缓冲区越大,大文件传输越稳
提高连接队列长度
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
高并发下减少 SYN 丢弃
开启 TCP 时间戳
net.ipv4.tcp_timestamps = 1
配合 tcp_tw_reuse 使用,必须开启
开启选择性确认
net.ipv4.tcp_sack = 1
减少丢包重传量
减少 SYN 重试次数
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
加速连接失败后的释放
EOF
sysctl -p
常见报错处理
•sysctl -p 报错“unknown key”:某个参数在当前内核版本中不存在,注释掉那行即可。比如旧内核没有 `tcp_fastopen`。
•BBR 开启后速度没变化:先检查带宽本身是否被限速(比如机房 1Mbps 小水管),再确认是否开启 fq 队列。`net.core.default_qdisc = fq` 这行漏了,BBR 效果差一半。
•连接数上不去,dmesg 报“TCP: time wait bucket table overflow”:`tcp_max_tw_buckets` 设得太小,调大到 20000 以上。
老鸟叮嘱:调优前先备份 sysctl.conf
别急着改,先备份一份原文件。万一调崩了,还能回滚:
cp /etc/sysctl.conf /etc/sysctl.conf.bak
备份是运维的基本素养
另外,不要在低配 VPS(256MB 内存以下)上盲目调大缓冲区,容易触发 OOM 杀进程。根据你的内存量酌情调整:1GB 内存的服务器,`tcp_rmem` 最大值设 16MB 就够用了。
FAQ
Linux SSH 连不上怎么办?
先检查防火墙和端口。如果是调优后连不上,重启服务器,进入单用户模式恢复 `/etc/sysctl.conf` 为备份文件。大概率是 `tcp_tw_recycle` 导致的 NAT 问题,或者缓冲区设太大导致 OOM。
VPS 防火墙端口放行后还是访问不了是什么原因?
检查内核 iptables 或 nftables 规则,可能被默认策略 DROP 了。执行 `iptables -L -n` 查看,确认没有隐藏规则。另外,`tcp_tw_recycle` 在 NAT 环境下会丢弃 SYN 包,也会导致端口不通。
Linux 小白可以直接用 root 账号操作吗?
可以,但建议用普通用户 + sudo。调优 sysctl 需要 root 权限,用 `sudo sysctl -p` 执行。长期用 root 操作,万一误删系统文件就麻烦了。
BBR 开启后为什么速度没有明显提升?
先确认你的网络瓶颈不在带宽上限。跑个 speedtest 测一下,如果带宽本身就 5Mbps,BBR 也救不了。另外检查是否开启了 fq 队列,没开的话 BBR 效果大打折扣。
如何查看当前 TCP 拥塞控制算法?
`sysctl net.ipv4.tcp_congestion_control` 直接查看。如果返回 `bbr`,说明生效了。如果返回 `cubic`,检查内核版本和 modprobe 是否成功。
tcp_tw_reuse 和 tcp_tw_recycle 有什么区别?
tcp_tw_reuse 允许客户端复用 TIME_WAIT 连接(只对连接发起方有效),tcp_tw_recycle 则是服务端主动回收 TIME_WAIT 连接(但 NAT 环境会出问题)。推荐只用 tcp_tw_reuse,新内核已移除 tcp_tw_recycle。
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9546.html 商家投稿邮箱:zhujixuanblog@qq.com
