1. 首页 > 技术教程 > 正文

内核网络调优:BBR 开启、TCP 快速回收与网速优化

内核网络调优:BBR 开启、TCP 快速回收与网速优化

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

内核网络调优:BBR 开启、TCP 快速回收与网速优化的图片

为什么必须调优内核网络参数?

默认的 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