Linux VPS 网络优化与 BBR 加速完全指南:内核升级 + BBR/BBRv3 + sysctl 调优 + 测速验证 | 2026 最新实践
你有没有遇到过这些情况:
- 买了标称「1Gbps 带宽」的 VPS,实测单线程下载却只有几 Mbps,晚高峰更是卡成幻灯片;
- 自建了 WireGuard / Hysteria2 节点,看 4K 视频还是频繁缓冲,明明服务器和本地带宽都够;
- 同一台机器,别人一键脚本跑完速度翻倍,自己却毫无变化;
- 听说「开 BBR 能加速」,照着命令敲完,
speedtest数字却纹丝不动。
这些问题的根源,几乎都指向同一件事:Linux 默认的网络参数是为「数据中心内部低延迟、无丢包」环境调优的,而跨境线路恰恰是「高延迟 + 随机丢包」——两者水土不服。
好消息是,通过内核层面的拥塞控制算法(BBR)+ 一组 sysctl 参数调优,绝大多数 VPS 的实际吞吐量可以有 2~10 倍的提升,而且全程零成本、十分钟搞定。
这篇文章会把 VPS 网络优化讲透:从 为什么 Cubic 在跨境线路上表现糟糕、BBR 到底做对了什么,到 内核升级、开启 BBR/BBRv3、sysctl 全参数调优、UDP 缓冲区优化(给 Hysteria2/WireGuard 用),再到 测速验证、一键脚本和踩坑排查。读完你就能让自建节点跑满带宽。
本文是自建代理系列(WireGuard、Hysteria2、sing-box)的性能优化补全——协议搭好了,这篇负责让它跑得快。
一、先搞懂问题:为什么默认配置这么慢
1.1 TCP 拥塞控制是什么
TCP 要在不知道网络实际容量的情况下,决定「一次能发多少数据」。发太少浪费带宽,发太多造成拥塞丢包。拥塞控制算法就是解决「发多快」这个问题的策略。
Linux 长期默认使用 Cubic 算法。它的核心逻辑是:
不断增大发送窗口 → 直到丢包 → 认为网络拥塞了 → 大幅降低窗口 → 再慢慢增大 …… 循环这套「丢包即拥塞」的假设,在数据中心内网(几乎不丢包)里工作得很好。但跨境线路完全是另一回事。
1.2 跨境线路的两大杀手:高延迟 + 随机丢包
跨境链路(比如国内到美西)有两个特点:
| 特征 | 典型值 | 对 Cubic 的影响 |
|---|---|---|
| 高 RTT(往返延迟) | 150~250 ms | 窗口恢复极慢,一次降速要很久才涨回来 |
| 随机丢包 | 1%~5%(非拥塞导致) | Cubic 误判为拥塞,无谓地反复降速 |
关键在于:跨境线路的丢包往往不是因为拥塞,而是线路质量、运营商 QoS、GFW 干扰造成的「随机丢包」。Cubic 却一律当成拥塞信号来处理,结果就是发送窗口被反复砸下去,带宽利用率长期只有个位数百分比。
这就是「1Gbps 的 VPS 只能跑几 Mbps」的技术原因——不是带宽不够,是算法不敢发。
1.3 BDP:为什么缓冲区也要一起调
即使算法愿意多发,还有个物理上限——BDP(带宽时延积,Bandwidth-Delay Product):
BDP = 带宽 × RTT举例:100 Mbps 带宽、200 ms RTT 的链路:
BDP = 100 Mbps × 0.2 s = 20 Mbit = 2.5 MB意思是:要跑满这条链路,发送方必须能同时有 2.5 MB 数据「在路上」还没被确认。而 Linux 默认的 TCP 缓冲区上限往往只有几百 KB,根本装不下这么多在途数据,于是即便 BBR 开了、带宽也够,吞吐量依旧被缓冲区卡死。
结论:BBR(敢发)+ 大缓冲区(能装)+ fq 队列(发得均匀),三者配合才能真正加速。 这也是很多人「只开 BBR 没效果」的原因——只做了三分之一。
二、BBR 到底做对了什么
2.1 从「猜」到「测」
BBR(Bottleneck Bandwidth and Round-trip propagation time)是 Google 2016 年开源、Linux 4.9+ 内置的拥塞控制算法。它的思路和 Cubic 根本不同:
| 维度 | Cubic(传统) | BBR(Google) |
|---|---|---|
| 拥塞判断依据 | 丢包(被动) | 实测带宽 + 延迟(主动) |
| 遇到随机丢包 | 误判拥塞,大幅降速 | 基本无视,维持速率 |
| 核心目标 | 填满缓冲区直到丢包 | 找到「最大带宽 + 最小延迟」的最优点 |
| 跨境线路表现 | 差(利用率个位数) | 好(利用率接近满带宽) |
BBR 持续测量两个核心指标:
- BtlBw(Bottleneck Bandwidth):链路瓶颈带宽,即「这条路最多能跑多快」;
- RTprop(Round-trip propagation time):最小往返延迟,即「不排队时的物理延迟」。
理想发送速率就是 BtlBw × RTprop(即 BDP)。BBR 让在途数据量始终维持在这个最优点附近——既跑满带宽,又不把数据挤进缓冲区排队(避免 bufferbloat 高延迟)。
2.2 BBR 的四个工作阶段
STARTUP(启动) → 指数增速,快速探测瓶颈带宽(类似慢启动但更激进) ↓DRAIN(排空) → 把 STARTUP 阶段挤进队列的数据排空 ↓PROBE_BW(带宽探测)→ 稳态运行,周期性小幅加速试探带宽是否变大(占绝大多数时间) ↓PROBE_RTT(延迟探测)→ 每 10 秒短暂降速,重新测量最小 RTT正因为 BBR 不依赖丢包,它在丢包率 1%~5% 的线路上依然稳如老狗——这正是跨境代理最需要的特性。
2.3 BBR 版本演进
| 版本 | 状态 | 特点 | 获取方式 |
|---|---|---|---|
| BBR v1 | 内核 4.9+ 原生 | 稳定、免费、通用首选 | 内核自带,sysctl 开启 |
| BBRv2 | 实验性 | 改进公平性,减少对 Cubic 的挤压 | 需特定内核,已被 v3 取代 |
| BBRv3 | Google 最新 | 更好的丢包响应与公平性 | 新内核 / XanMod 内核 |
| BBR Plus | 社区魔改 | 高丢包线路激进抢带宽 | 第三方内核(争议大) |
选型建议:99% 的人用内核原生 BBR v1 + fq 就够了,稳定省心。追求极致、且能接受折腾第三方内核的,用 XanMod 内核自带的 BBRv3。不建议再折腾锐速(LotServer,商业闭源、仅老内核、已过时)。
三、检查当前状态与内核版本
动手前先确认现状。BBR 需要 Linux 内核 ≥ 4.9,主流 VPS(2020 年后的系统)基本都满足。
# 查看内核版本(≥ 4.9 即支持 BBR)uname -r# 示例输出:5.15.0-91-generic
# 查看当前使用的拥塞控制算法sysctl net.ipv4.tcp_congestion_control# 默认通常是:net.ipv4.tcp_congestion_control = cubic
# 查看当前系统支持哪些拥塞控制算法sysctl net.ipv4.tcp_available_congestion_control# 若输出包含 bbr,说明内核已支持,直接开启即可
# 查看当前队列调度算法sysctl net.core.default_qdisc# 建议配合 BBR 使用 fq
# 确认 BBR 模块是否已加载lsmod | grep bbr判断逻辑:
- 内核 ≥ 4.9 且
tcp_available_congestion_control含bbr→ 跳到第五章直接开启; - 内核 < 4.9 或不含
bbr→ 先看第四章升级内核。
四、升级内核(仅老系统需要)
如果内核低于 4.9(如老的 CentOS 7、Debian 8),需要先升级。新系统可跳过本章。
⚠️ 升级内核有一定风险(尤其是 OpenVZ 架构的 VPS 无法自定义内核)。操作前请确认:1) 你的 VPS 是 KVM/Xen 架构(不是 OpenVZ);2) 已做好快照或备份。用
systemd-detect-virt或virt-what可查看虚拟化类型。
4.1 Debian / Ubuntu 升级内核
Debian/Ubuntu 可直接从官方仓库安装较新的 HWE 内核:
# Ubuntu:安装 HWE(硬件支持栈)内核sudo apt updatesudo apt install --install-recommends linux-generic-hwe-22.04 -ysudo reboot
# Debian:从 backports 安装新内核echo "deb http://deb.debian.org/debian bullseye-backports main" | sudo tee /etc/apt/sources.list.d/backports.listsudo apt updatesudo apt -t bullseye-backports install linux-image-amd64 -ysudo reboot4.2 CentOS / RHEL 升级内核(ELRepo)
# 导入 ELRepo 仓库sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.orgsudo yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm -y
# 安装最新主线内核 kernel-mlsudo yum --enablerepo=elrepo-kernel install kernel-ml -y
# 设置新内核为默认启动项(0 通常是最新)sudo grub2-set-default 0sudo grub2-mkconfig -o /boot/grub2/grub.cfgsudo reboot4.3 XanMod 内核(内置 BBRv3,推荐折腾党)
XanMod 是针对低延迟优化的 Debian/Ubuntu 内核,自带 BBRv3,装完直接就是最优状态:
# 添加 XanMod 官方源wget -qO - https://dl.xanmod.org/archive.key | sudo gpg --dearmor -o /usr/share/keyrings/xanmod-archive-keyring.gpgecho 'deb [signed-by=/usr/share/keyrings/xanmod-archive-keyring.gpg] http://deb.xanmod.org releases main' | sudo tee /etc/apt/sources.list.d/xanmod-release.list
sudo apt update# 安装(x64v2 适合大多数 VPS,也可用 check 脚本自动选择等级)sudo apt install linux-xanmod-x64v2 -ysudo reboot重启后 uname -r 会显示带 -xanmod 的版本,tcp_available_congestion_control 中会出现 bbr(即 BBRv3)。
重启后回到第三章重新检查,确认内核已 ≥ 4.9 且支持 bbr,然后继续。
五、开启 BBR(核心步骤)
内核支持后,开启 BBR 只需两行 sysctl 配置。
5.1 一步开启
# 写入配置(default_qdisc=fq 是 BBR 的最佳搭档)cat >> /etc/sysctl.conf <<'EOF'net.core.default_qdisc = fqnet.ipv4.tcp_congestion_control = bbrEOF
# 立即生效sysctl -p5.2 验证是否成功
# 1) 确认拥塞控制算法为 bbrsysctl net.ipv4.tcp_congestion_control# 期望:net.ipv4.tcp_congestion_control = bbr
# 2) 确认队列调度为 fqsysctl net.core.default_qdisc# 期望:net.core.default_qdisc = fq
# 3) 确认 bbr 模块已加载lsmod | grep bbr# 期望:tcp_bbr xxxxx x三条都符合预期,BBR 就正式生效了——无需重启(拥塞控制算法对新建连接立即生效)。
5.3 fq、fq_codel、cake 队列该选哪个
default_qdisc 决定数据包如何排队发送,和 BBR 配合有讲究:
| 队列算法 | 适用场景 | 说明 |
|---|---|---|
| fq | BBR 官方推荐 | Fair Queuing,BBR 的标准搭档,跑代理/大流量首选 |
| fq_codel | 通用默认 | 主动队列管理,抗 bufferbloat,家用/混合流量好 |
| cake | 家庭宽带整形 | 功能最全(含限速/NAT感知),VPS 上一般用不到 |
结论:VPS 跑代理用 fq 就对了。 除非你有特殊的队列整形需求,否则不用纠结。
六、sysctl 网络参数全面调优
开完 BBR 只是「敢发」,还要把缓冲区、连接数、TIME_WAIT 等参数一起调大调优,才能真正跑满高 BDP 链路。下面逐组讲解,最后给出可直接套用的完整模板。
6.1 TCP 缓冲区(最关键,解决 BDP 瓶颈)
# TCP 读缓冲区:最小 默认 最大(单位字节)net.ipv4.tcp_rmem = 4096 87380 67108864# TCP 写缓冲区:最小 默认 最大net.ipv4.tcp_wmem = 4096 65536 67108864
# 系统全局 socket 缓冲区上限net.core.rmem_max = 67108864net.core.wmem_max = 67108864net.core.rmem_default = 1048576net.core.wmem_default = 1048576
# 开启缓冲区自动调节(让内核动态在 min~max 间调整)net.ipv4.tcp_moderate_rcvbuf = 1这里把最大缓冲区设为 64MB,能覆盖「1Gbps × 250ms ≈ 31MB」的高 BDP 场景。带宽/延迟没那么高的机器保持这个值也无害(有自动调节,不会浪费内存)。
6.2 连接队列与并发
# 半连接队列(SYN 队列)大小,抗 SYN 洪水、高并发建连net.ipv4.tcp_max_syn_backlog = 8192# 全连接队列(accept 队列)大小net.core.somaxconn = 32768# 网卡收包队列(软中断处理不过来时的缓冲)net.core.netdev_max_backlog = 327686.3 TIME_WAIT 与端口复用
高并发短连接(如大量爬虫、订阅拉取)容易堆积大量 TIME_WAIT,耗尽端口:
# 允许 TIME_WAIT socket 用于新的 TCP 连接(对客户端安全)net.ipv4.tcp_tw_reuse = 1# TIME_WAIT 最大数量,超出直接清理net.ipv4.tcp_max_tw_buckets = 55000# 扩大本地端口范围net.ipv4.ip_local_port_range = 1024 65535# FIN_WAIT2 状态超时(秒)net.ipv4.tcp_fin_timeout = 15⚠️ 注意:
net.ipv4.tcp_tw_recycle在内核 4.12 后已被移除,且在 NAT 环境下会导致丢包,千万不要再用(很多老教程还在推荐它,已经过时且有害)。只用tcp_tw_reuse即可。
6.4 keepalive 与连接保活
# 连接空闲多久开始发 keepalive 探测(秒)net.ipv4.tcp_keepalive_time = 600# 探测间隔net.ipv4.tcp_keepalive_intvl = 30# 探测失败几次判定断开net.ipv4.tcp_keepalive_probes = 36.5 快速建连与其它 TCP 优化
# 开启 TCP Fast Open(首包即可带数据,减少一次 RTT)net.ipv4.tcp_fastopen = 3# 开启 SYN Cookies(抗 SYN 洪水攻击)net.ipv4.tcp_syncookies = 1# 关闭慢启动重启(长连接空闲后不必重新慢启动,代理场景友好)net.ipv4.tcp_slow_start_after_idle = 0# 开启选择性确认与时间戳net.ipv4.tcp_sack = 1net.ipv4.tcp_timestamps = 1# 开启 MTU 探测(避免 ICMP 被墙导致的 MSS 黑洞)net.ipv4.tcp_mtu_probing = 16.6 UDP 缓冲区(给 Hysteria2 / WireGuard / QUIC 用!)
这一条极其重要但常被忽略:BBR 是 TCP 拥塞控制,对 UDP 协议(Hysteria2、WireGuard、TUIC、QUIC)没有直接作用。UDP 类协议的加速关键是调大 UDP 缓冲区,否则高速传输时内核缓冲区溢出会大量丢包:
# UDP 接收/发送缓冲区上限(对 Hysteria2/WireGuard 吞吐至关重要)net.core.rmem_max = 67108864net.core.wmem_max = 67108864# UDP 最小接收缓冲net.ipv4.udp_rmem_min = 8192net.ipv4.udp_wmem_min = 8192Hysteria2 官方文档明确建议在高带宽场景调大
net.core.rmem_max/wmem_max。如果你的 Hysteria2 跑不满带宽,第一件事就是检查这两个值。
6.7 文件描述符限制(高并发必调)
代理服务器动辄上万并发连接,默认 1024 的文件描述符上限远远不够:
# 编辑 limits 配置cat >> /etc/security/limits.conf <<'EOF'* soft nofile 1048576* hard nofile 1048576root soft nofile 1048576root hard nofile 1048576EOF
# systemd 服务还需单独设置(否则对 systemd 启动的服务不生效)mkdir -p /etc/systemd/system.conf.dcat > /etc/systemd/system.conf.d/limits.conf <<'EOF'[Manager]DefaultLimitNOFILE=1048576EOF
# 系统级 fd 上限echo "fs.file-max = 1048576" >> /etc/sysctl.conf
# 重新登录 shell 后用 ulimit -n 验证ulimit -n关于文件描述符、systemd 服务管理的更多细节,见 systemd 服务管理完全指南。
七、生产级 sysctl 完整模板
把下面的内容整体写入 /etc/sysctl.d/99-network-tuning.conf(用独立文件比直接改 sysctl.conf 更规范、易维护),然后 sysctl --system 生效。已按功能分组注释,可直接套用:
cat > /etc/sysctl.d/99-network-tuning.conf <<'EOF'# ===== BBR 拥塞控制 =====net.core.default_qdisc = fqnet.ipv4.tcp_congestion_control = bbr
# ===== TCP 缓冲区(解决高 BDP 瓶颈)=====net.ipv4.tcp_rmem = 4096 87380 67108864net.ipv4.tcp_wmem = 4096 65536 67108864net.core.rmem_max = 67108864net.core.wmem_max = 67108864net.core.rmem_default = 1048576net.core.wmem_default = 1048576net.ipv4.tcp_moderate_rcvbuf = 1
# ===== UDP 缓冲区(Hysteria2/WireGuard/QUIC)=====net.ipv4.udp_rmem_min = 8192net.ipv4.udp_wmem_min = 8192
# ===== 连接队列与并发 =====net.ipv4.tcp_max_syn_backlog = 8192net.core.somaxconn = 32768net.core.netdev_max_backlog = 32768
# ===== TIME_WAIT 与端口复用 =====net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_max_tw_buckets = 55000net.ipv4.ip_local_port_range = 1024 65535net.ipv4.tcp_fin_timeout = 15
# ===== keepalive 保活 =====net.ipv4.tcp_keepalive_time = 600net.ipv4.tcp_keepalive_intvl = 30net.ipv4.tcp_keepalive_probes = 3
# ===== 建连与 TCP 优化 =====net.ipv4.tcp_fastopen = 3net.ipv4.tcp_syncookies = 1net.ipv4.tcp_slow_start_after_idle = 0net.ipv4.tcp_sack = 1net.ipv4.tcp_timestamps = 1net.ipv4.tcp_mtu_probing = 1
# ===== 文件描述符 =====fs.file-max = 1048576
# ===== 转发(自建 VPN/代理需要,纯代理可选)=====net.ipv4.ip_forward = 1net.ipv6.conf.all.forwarding = 1EOF
# 一次性加载所有 sysctl.d 配置sysctl --system说明:
ip_forward仅在做 WireGuard/NAT 转发时才必须开;纯 Xray/sing-box 落地代理可以不开,按需保留。
八、一键优化脚本
把开启 BBR、写入 sysctl、调整文件描述符、验证结果整合成一个脚本,方便新机器快速部署:
#!/usr/bin/env bash# vps-net-tune.sh —— VPS 网络优化一键脚本(BBR + sysctl + 文件描述符)set -euo pipefail
[[ $EUID -eq 0 ]] || { echo "请用 root 运行"; exit 1; }
echo "==> 当前内核:$(uname -r)"
# 1. 检查内核是否支持 BBRif ! sysctl net.ipv4.tcp_available_congestion_control | grep -qw bbr; then echo "!! 当前内核不支持 BBR(需 ≥ 4.9),请先升级内核后再运行本脚本。" exit 1fi
# 2. 写入 sysctl 优化配置echo "==> 写入 /etc/sysctl.d/99-network-tuning.conf"cat > /etc/sysctl.d/99-network-tuning.conf <<'EOF'net.core.default_qdisc = fqnet.ipv4.tcp_congestion_control = bbrnet.ipv4.tcp_rmem = 4096 87380 67108864net.ipv4.tcp_wmem = 4096 65536 67108864net.core.rmem_max = 67108864net.core.wmem_max = 67108864net.ipv4.tcp_moderate_rcvbuf = 1net.core.somaxconn = 32768net.core.netdev_max_backlog = 32768net.ipv4.tcp_max_syn_backlog = 8192net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_max_tw_buckets = 55000net.ipv4.ip_local_port_range = 1024 65535net.ipv4.tcp_fin_timeout = 15net.ipv4.tcp_fastopen = 3net.ipv4.tcp_slow_start_after_idle = 0net.ipv4.tcp_mtu_probing = 1fs.file-max = 1048576EOF
# 3. 文件描述符echo "==> 配置文件描述符上限"grep -q "nofile 1048576" /etc/security/limits.conf 2>/dev/null || cat >> /etc/security/limits.conf <<'EOF'* soft nofile 1048576* hard nofile 1048576EOFmkdir -p /etc/systemd/system.conf.dcat > /etc/systemd/system.conf.d/limits.conf <<'EOF'[Manager]DefaultLimitNOFILE=1048576EOF
# 4. 生效echo "==> 应用 sysctl"sysctl --system >/dev/null
# 5. 验证echo "==> 验证结果:"echo "拥塞控制:$(sysctl -n net.ipv4.tcp_congestion_control)"echo "队列调度:$(sysctl -n net.core.default_qdisc)"lsmod | grep -q bbr && echo "BBR 模块:已加载 ✅" || echo "BBR 模块:未加载(重启后再查)"echo "==> 完成!建议重启一次让文件描述符对所有服务生效。"保存后执行:
chmod +x vps-net-tune.shsudo ./vps-net-tune.shShell 脚本的
set -euo pipefail、Here 文档等语法细节,见 Shell 脚本编程完全指南。
九、测速验证:优化到底有没有用
优化完必须实测对比,否则等于没做。
9.1 Speedtest(带宽测试)
# 安装官方 speedtest CLI(比 speedtest-cli 更准)# Debian/Ubuntucurl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh | sudo bashsudo apt install speedtest -y
# 运行(自动选最近节点)speedtest
# 指定服务器测试到特定地区speedtest --servers # 列出可用服务器speedtest --server-id=12345 # 指定服务器 ID9.2 iperf3(两端点对点带宽)
要测「VPS 到你本地」的真实吞吐,用 iperf3 最准:
# VPS 端(服务端)apt install iperf3 -yiperf3 -s
# 本地端(客户端),-P 4 开 4 个并行流更接近真实代理场景iperf3 -c 你的VPS_IP -P 4 -t 30# 反向测试(测下载方向)加 -Riperf3 -c 你的VPS_IP -P 4 -t 30 -R9.3 综合测评脚本(融合怪 / bench.sh)
社区常用的一键 VPS 测评脚本,同时测 CPU/磁盘/网络/回程路由:
# bench.sh —— 经典综合测速wget -qO- bench.sh | bash
# 融合怪 —— 更全面的 VPS 测评(含流媒体解锁、回程线路检测)bash <(wget -qO- bash.spiritlhl.net/ecs)9.4 前后对比怎么看
优化前后各测一次,重点看这几项:
| 指标 | 优化前典型(无 BBR) | 优化后典型(BBR+调优) |
|---|---|---|
| 单线程下载(跨境有丢包线路) | 5~30 Mbps | 100~500 Mbps |
| 多线程下载 | 提升有限 | 接近满带宽 |
| 高峰期稳定性 | 波动大、频繁掉速 | 明显更平稳 |
| Hysteria2 吞吐(调 UDP 缓冲后) | 跑不满 | 接近线路上限 |
如果优化后单线程仍上不去,先用多线程测速排除单流限制,再对照第十一章排查。
十、进阶:拥塞控制算法对比与 MTU 优化
10.1 常见拥塞控制算法对比
# 临时切换算法测试(不写配置,重启失效,方便对比)sysctl -w net.ipv4.tcp_congestion_control=bbrsysctl -w net.ipv4.tcp_congestion_control=cubic| 算法 | 内核支持 | 依赖丢包 | 跨境线路表现 | 适用场景 |
|---|---|---|---|---|
| cubic | 默认 | 是 | 差 | 数据中心内网、无丢包环境 |
| bbr | 4.9+ | 否 | 优 | 跨境代理首选 ✅ |
| bbr(v3) | XanMod 等 | 否 | 优+ | 追求极致、能折腾 |
| reno | 全部 | 是 | 差 | 教学/老系统,不推荐 |
| hybla | 需模块 | 是 | 中 | 高延迟卫星链路 |
结论没有悬念:跨境 VPS 用 BBR。
10.2 MTU / MSS 优化
MTU(最大传输单元)设置不当会导致分片、丢包甚至「MSS 黑洞」(能 ping 通但网页打不开)。
# 查看当前网卡 MTUip link show
# 探测到目标的最佳 MTU:不断减小包大小直到不分片(-M do 禁止分片)ping -M do -s 1472 8.8.8.8# 1472 + 28(IP+ICMP头)= 1500。若提示 "Message too long",逐步减小 -s 值# 能通过的最大 -s 值 + 28 = 最佳 MTU- 普通线路 MTU 一般是 1500;
- WireGuard 因封装开销,客户端 MTU 建议设 1420(隧道内);
- 有 PPPoE 的线路可能是 1492;
- 已开启
tcp_mtu_probing = 1时,内核会自动探测规避 MSS 黑洞,这是最省心的兜底方案。
10.3 网卡多队列与软中断(大带宽机型)
万兆或高 PPS 场景,单核处理软中断会成为瓶颈。可开启 RPS/RFS 把收包分散到多核:
# 查看网卡队列数ls /sys/class/net/eth0/queues/
# 简单开启 RPS(把 rx 软中断分散到所有 CPU),f 表示 4 核掩码echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus普通 1Gbps 以下 VPS 一般用不到这一步,CPU 软中断不会是瓶颈,了解即可。
十一、常见问题排查
11.1 开了 BBR 速度没变化
按顺序排查:
- 线路本身没丢包:优质 IEPL/IPLC 专线丢包极低,BBR 收益本来就小——BBR 主要救「有丢包的普通线路」;
- 缓冲区没调:只开 BBR 没调
tcp_rmem/wmem,高 BDP 链路被缓冲区卡死(回到 6.1); - 瓶颈不在 VPS:本地宽带、对端服务器或中间线路才是瓶颈,换 iperf3 点对点测;
- 用的是 UDP 协议:Hysteria2/WireGuard 走 UDP,BBR 无效,要调 UDP 缓冲区(回到 6.6);
- 单线程测速:单流跑不满是正常的,用多线程/
-P 4测。
11.2 sysctl -p 报错 “cannot stat … No such file”
某些参数在你的内核里不存在(如老内核没有某些新参数),报错是正常的,删掉对应行即可。用 sysctl --system 加载时也会跳过无效项。
11.3 改完重启后配置失效
- 确认写在了
/etc/sysctl.conf或/etc/sysctl.d/*.conf(不是临时sysctl -w); - 有些云厂商的初始化脚本(cloud-init)会覆盖,检查
/etc/sysctl.d/里是否有厂商配置覆盖了你的值(文件名数字越大优先级越高,用99-前缀确保最后加载)。
11.4 tcp_tw_recycle 找不到
内核 4.12+ 已删除该参数,这是好事——它在 NAT 环境下有害。忽略所有让你开它的老教程,只用 tcp_tw_reuse。
11.5 文件描述符 ulimit 改了不生效
- limits.conf 的修改需重新登录才生效;
- 对 systemd 启动的服务(如 Xray、sing-box),必须在
/etc/systemd/system.conf.d/或服务单元里设LimitNOFILE,limits.conf 对它们无效; - 改完执行
systemctl daemon-reexec再重启服务。
11.6 OpenVZ 架构无法开 BBR
OpenVZ 共享宿主机内核,无法自定义内核,因此开不了 BBR。systemd-detect-virt 若显示 openvz 就是这种情况。解决办法:换 KVM 架构的 VPS(现在绝大多数商家都是 KVM)。
常见问题速查表
| 现象 | 可能原因 | 解决 |
|---|---|---|
| 开 BBR 无提速 | 线路无丢包 / 缓冲区没调 / UDP 协议 | 见 11.1 |
sysctl -p 报错 | 参数在当前内核不存在 | 删除报错行 |
| 重启后失效 | 用了临时 -w / 被厂商覆盖 | 写入 sysctl.d,用 99- 前缀 |
| Hysteria2 跑不满 | UDP 缓冲区太小 | 调大 rmem_max/wmem_max |
| ulimit 不生效 | 未重新登录 / systemd 服务 | 见 11.5 |
| 完全开不了 BBR | OpenVZ 架构 | 换 KVM VPS |
十二、速查表
状态检查
uname -r # 内核版本sysctl net.ipv4.tcp_congestion_control # 当前算法sysctl net.ipv4.tcp_available_congestion_control # 支持的算法sysctl net.core.default_qdisc # 队列调度lsmod | grep bbr # BBR 模块ulimit -n # 文件描述符上限一键开启 BBR(内核已支持时)
echo "net.core.default_qdisc = fq" >> /etc/sysctl.confecho "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.confsysctl -p测速
speedtest # 带宽测速iperf3 -c IP -P 4 -t 30 -R # 点对点(下载方向)wget -qO- bench.sh | bash # 综合测评十三、最佳实践清单
- 先看架构:KVM/Xen 才能自定义内核开 BBR;OpenVZ 直接放弃或换机。
- 内核够新就别折腾:内核 ≥ 4.9 原生 BBR 已够用,不必盲目上第三方内核。
- BBR 不是万能药:它救的是「有丢包的线路」,优质专线收益有限。
- 三件套一起做:BBR + 大缓冲区 + fq,缺一效果打折。
- UDP 协议单独调:跑 Hysteria2/WireGuard 一定要调大 UDP 缓冲区,BBR 对它们无效。
- 别用 tcp_tw_recycle:已被内核删除且 NAT 下有害,只用 tcp_tw_reuse。
- 配置写进 sysctl.d:用
99-前缀独立文件,避免被厂商配置覆盖。 - 改完必测速:优化前后各测一次,多线程验证,用数据说话。
- 文件描述符别忘 systemd:代理服务由 systemd 拉起,必须单独设 LimitNOFILE。
- 做好备份:升级内核前打快照,出问题能回滚。
场景推荐配置
| 场景 | 推荐方案 |
|---|---|
| 普通跨境代理 VPS | 内核原生 BBR + fq + 完整 sysctl 模板 |
| 追求极致 / 高丢包线路 | XanMod 内核(BBRv3)+ 完整调优 |
| Hysteria2/WireGuard 落地 | BBR + 重点调大 UDP 缓冲区 + 文件描述符 |
| 高并发落地(大量短连接) | 完整模板 + TIME_WAIT 复用 + 文件描述符拉满 |
| 优质 IEPL/IPLC 专线 | 开 BBR 兜底即可,收益有限,重点保证缓冲区 |
总结
VPS 网络优化的本质,是让 Linux 从「数据中心内网默认配置」切换到「跨境高延迟有丢包线路的最优配置」。核心就三件事:
- BBR——换掉「一丢包就降速」的 Cubic,让算法敢在有丢包的线路上跑满带宽;
- 大缓冲区——让高 BDP 链路装得下足够的在途数据;
- fq 队列 + 参数调优——发得均匀、连接数够用、UDP 不丢包。
对自建节点来说,这一步是「协议搭好之后的临门一脚」:WireGuard、Hysteria2、sing-box 把路铺好,网络优化让车跑满。花十分钟做完,往往比换一台更贵的 VPS 还管用。
推荐阅读
- WireGuard VPN 自建完全指南——组网与全平台客户端配置
- Hysteria2 协议完全指南——UDP 高速协议自建
- sing-box 全平台使用教程——新一代通用代理平台
- systemd 服务管理完全指南——把代理服务跑成开机自启
- Linux 防火墙完全指南——服务器安全第一道防线
- Shell 脚本编程完全指南——把优化流程写成一键脚本