6057 字
30 分钟

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 用),再到 测速验证、一键脚本和踩坑排查。读完你就能让自建节点跑满带宽。

本文是自建代理系列(WireGuardHysteria2sing-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 取代
BBRv3Google 最新更好的丢包响应与公平性新内核 / XanMod 内核
BBR Plus社区魔改高丢包线路激进抢带宽第三方内核(争议大)

选型建议:99% 的人用内核原生 BBR v1 + fq 就够了,稳定省心。追求极致、且能接受折腾第三方内核的,用 XanMod 内核自带的 BBRv3。不建议再折腾锐速(LotServer,商业闭源、仅老内核、已过时)。

三、检查当前状态与内核版本#

动手前先确认现状。BBR 需要 Linux 内核 ≥ 4.9,主流 VPS(2020 年后的系统)基本都满足。

Terminal window
# 查看内核版本(≥ 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_controlbbr → 跳到第五章直接开启;
  • 内核 < 4.9 或不含 bbr → 先看第四章升级内核。

四、升级内核(仅老系统需要)#

如果内核低于 4.9(如老的 CentOS 7、Debian 8),需要先升级。新系统可跳过本章。

⚠️ 升级内核有一定风险(尤其是 OpenVZ 架构的 VPS 无法自定义内核)。操作前请确认:1) 你的 VPS 是 KVM/Xen 架构(不是 OpenVZ);2) 已做好快照或备份。用 systemd-detect-virtvirt-what 可查看虚拟化类型。

4.1 Debian / Ubuntu 升级内核#

Debian/Ubuntu 可直接从官方仓库安装较新的 HWE 内核:

Terminal window
# Ubuntu:安装 HWE(硬件支持栈)内核
sudo apt update
sudo apt install --install-recommends linux-generic-hwe-22.04 -y
sudo reboot
# Debian:从 backports 安装新内核
echo "deb http://deb.debian.org/debian bullseye-backports main" | sudo tee /etc/apt/sources.list.d/backports.list
sudo apt update
sudo apt -t bullseye-backports install linux-image-amd64 -y
sudo reboot

4.2 CentOS / RHEL 升级内核(ELRepo)#

Terminal window
# 导入 ELRepo 仓库
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm -y
# 安装最新主线内核 kernel-ml
sudo yum --enablerepo=elrepo-kernel install kernel-ml -y
# 设置新内核为默认启动项(0 通常是最新)
sudo grub2-set-default 0
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot

4.3 XanMod 内核(内置 BBRv3,推荐折腾党)#

XanMod 是针对低延迟优化的 Debian/Ubuntu 内核,自带 BBRv3,装完直接就是最优状态:

Terminal window
# 添加 XanMod 官方源
wget -qO - https://dl.xanmod.org/archive.key | sudo gpg --dearmor -o /usr/share/keyrings/xanmod-archive-keyring.gpg
echo '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 -y
sudo reboot

重启后 uname -r 会显示带 -xanmod 的版本,tcp_available_congestion_control 中会出现 bbr(即 BBRv3)。

重启后回到第三章重新检查,确认内核已 ≥ 4.9 且支持 bbr,然后继续。

五、开启 BBR(核心步骤)#

内核支持后,开启 BBR 只需两行 sysctl 配置。

5.1 一步开启#

Terminal window
# 写入配置(default_qdisc=fq 是 BBR 的最佳搭档)
cat >> /etc/sysctl.conf <<'EOF'
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF
# 立即生效
sysctl -p

5.2 验证是否成功#

Terminal window
# 1) 确认拥塞控制算法为 bbr
sysctl net.ipv4.tcp_congestion_control
# 期望:net.ipv4.tcp_congestion_control = bbr
# 2) 确认队列调度为 fq
sysctl 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 配合有讲究:

队列算法适用场景说明
fqBBR 官方推荐Fair Queuing,BBR 的标准搭档,跑代理/大流量首选
fq_codel通用默认主动队列管理,抗 bufferbloat,家用/混合流量好
cake家庭宽带整形功能最全(含限速/NAT感知),VPS 上一般用不到

结论:VPS 跑代理用 fq 就对了。 除非你有特殊的队列整形需求,否则不用纠结。

六、sysctl 网络参数全面调优#

开完 BBR 只是「敢发」,还要把缓冲区、连接数、TIME_WAIT 等参数一起调大调优,才能真正跑满高 BDP 链路。下面逐组讲解,最后给出可直接套用的完整模板。

6.1 TCP 缓冲区(最关键,解决 BDP 瓶颈)#

Terminal window
# TCP 读缓冲区:最小 默认 最大(单位字节)
net.ipv4.tcp_rmem = 4096 87380 67108864
# TCP 写缓冲区:最小 默认 最大
net.ipv4.tcp_wmem = 4096 65536 67108864
# 系统全局 socket 缓冲区上限
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
# 开启缓冲区自动调节(让内核动态在 min~max 间调整)
net.ipv4.tcp_moderate_rcvbuf = 1

这里把最大缓冲区设为 64MB,能覆盖「1Gbps × 250ms ≈ 31MB」的高 BDP 场景。带宽/延迟没那么高的机器保持这个值也无害(有自动调节,不会浪费内存)。

6.2 连接队列与并发#

Terminal window
# 半连接队列(SYN 队列)大小,抗 SYN 洪水、高并发建连
net.ipv4.tcp_max_syn_backlog = 8192
# 全连接队列(accept 队列)大小
net.core.somaxconn = 32768
# 网卡收包队列(软中断处理不过来时的缓冲)
net.core.netdev_max_backlog = 32768

6.3 TIME_WAIT 与端口复用#

高并发短连接(如大量爬虫、订阅拉取)容易堆积大量 TIME_WAIT,耗尽端口:

Terminal window
# 允许 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 与连接保活#

Terminal window
# 连接空闲多久开始发 keepalive 探测(秒)
net.ipv4.tcp_keepalive_time = 600
# 探测间隔
net.ipv4.tcp_keepalive_intvl = 30
# 探测失败几次判定断开
net.ipv4.tcp_keepalive_probes = 3

6.5 快速建连与其它 TCP 优化#

Terminal window
# 开启 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 = 1
net.ipv4.tcp_timestamps = 1
# 开启 MTU 探测(避免 ICMP 被墙导致的 MSS 黑洞)
net.ipv4.tcp_mtu_probing = 1

6.6 UDP 缓冲区(给 Hysteria2 / WireGuard / QUIC 用!)#

这一条极其重要但常被忽略:BBR 是 TCP 拥塞控制,对 UDP 协议(Hysteria2、WireGuard、TUIC、QUIC)没有直接作用。UDP 类协议的加速关键是调大 UDP 缓冲区,否则高速传输时内核缓冲区溢出会大量丢包:

Terminal window
# UDP 接收/发送缓冲区上限(对 Hysteria2/WireGuard 吞吐至关重要)
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
# UDP 最小接收缓冲
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192

Hysteria2 官方文档明确建议在高带宽场景调大 net.core.rmem_max/wmem_max。如果你的 Hysteria2 跑不满带宽,第一件事就是检查这两个值。

6.7 文件描述符限制(高并发必调)#

代理服务器动辄上万并发连接,默认 1024 的文件描述符上限远远不够:

Terminal window
# 编辑 limits 配置
cat >> /etc/security/limits.conf <<'EOF'
* soft nofile 1048576
* hard nofile 1048576
root soft nofile 1048576
root hard nofile 1048576
EOF
# systemd 服务还需单独设置(否则对 systemd 启动的服务不生效)
mkdir -p /etc/systemd/system.conf.d
cat > /etc/systemd/system.conf.d/limits.conf <<'EOF'
[Manager]
DefaultLimitNOFILE=1048576
EOF
# 系统级 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 生效。已按功能分组注释,可直接套用:

Terminal window
cat > /etc/sysctl.d/99-network-tuning.conf <<'EOF'
# ===== BBR 拥塞控制 =====
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# ===== TCP 缓冲区(解决高 BDP 瓶颈)=====
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
net.ipv4.tcp_moderate_rcvbuf = 1
# ===== UDP 缓冲区(Hysteria2/WireGuard/QUIC)=====
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192
# ===== 连接队列与并发 =====
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 32768
net.core.netdev_max_backlog = 32768
# ===== TIME_WAIT 与端口复用 =====
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 55000
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_fin_timeout = 15
# ===== keepalive 保活 =====
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
# ===== 建连与 TCP 优化 =====
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_sack = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_mtu_probing = 1
# ===== 文件描述符 =====
fs.file-max = 1048576
# ===== 转发(自建 VPN/代理需要,纯代理可选)=====
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
EOF
# 一次性加载所有 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. 检查内核是否支持 BBR
if ! sysctl net.ipv4.tcp_available_congestion_control | grep -qw bbr; then
echo "!! 当前内核不支持 BBR(需 ≥ 4.9),请先升级内核后再运行本脚本。"
exit 1
fi
# 2. 写入 sysctl 优化配置
echo "==> 写入 /etc/sysctl.d/99-network-tuning.conf"
cat > /etc/sysctl.d/99-network-tuning.conf <<'EOF'
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.ipv4.tcp_moderate_rcvbuf = 1
net.core.somaxconn = 32768
net.core.netdev_max_backlog = 32768
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 55000
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_mtu_probing = 1
fs.file-max = 1048576
EOF
# 3. 文件描述符
echo "==> 配置文件描述符上限"
grep -q "nofile 1048576" /etc/security/limits.conf 2>/dev/null || cat >> /etc/security/limits.conf <<'EOF'
* soft nofile 1048576
* hard nofile 1048576
EOF
mkdir -p /etc/systemd/system.conf.d
cat > /etc/systemd/system.conf.d/limits.conf <<'EOF'
[Manager]
DefaultLimitNOFILE=1048576
EOF
# 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 "==> 完成!建议重启一次让文件描述符对所有服务生效。"

保存后执行:

Terminal window
chmod +x vps-net-tune.sh
sudo ./vps-net-tune.sh

Shell 脚本的 set -euo pipefail、Here 文档等语法细节,见 Shell 脚本编程完全指南

九、测速验证:优化到底有没有用#

优化完必须实测对比,否则等于没做。

9.1 Speedtest(带宽测试)#

Terminal window
# 安装官方 speedtest CLI(比 speedtest-cli 更准)
# Debian/Ubuntu
curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh | sudo bash
sudo apt install speedtest -y
# 运行(自动选最近节点)
speedtest
# 指定服务器测试到特定地区
speedtest --servers # 列出可用服务器
speedtest --server-id=12345 # 指定服务器 ID

9.2 iperf3(两端点对点带宽)#

要测「VPS 到你本地」的真实吞吐,用 iperf3 最准:

Terminal window
# VPS 端(服务端)
apt install iperf3 -y
iperf3 -s
# 本地端(客户端),-P 4 开 4 个并行流更接近真实代理场景
iperf3 -c 你的VPS_IP -P 4 -t 30
# 反向测试(测下载方向)加 -R
iperf3 -c 你的VPS_IP -P 4 -t 30 -R

9.3 综合测评脚本(融合怪 / bench.sh)#

社区常用的一键 VPS 测评脚本,同时测 CPU/磁盘/网络/回程路由:

Terminal window
# bench.sh —— 经典综合测速
wget -qO- bench.sh | bash
# 融合怪 —— 更全面的 VPS 测评(含流媒体解锁、回程线路检测)
bash <(wget -qO- bash.spiritlhl.net/ecs)

9.4 前后对比怎么看#

优化前后各测一次,重点看这几项:

指标优化前典型(无 BBR)优化后典型(BBR+调优)
单线程下载(跨境有丢包线路)5~30 Mbps100~500 Mbps
多线程下载提升有限接近满带宽
高峰期稳定性波动大、频繁掉速明显更平稳
Hysteria2 吞吐(调 UDP 缓冲后)跑不满接近线路上限

如果优化后单线程仍上不去,先用多线程测速排除单流限制,再对照第十一章排查。

十、进阶:拥塞控制算法对比与 MTU 优化#

10.1 常见拥塞控制算法对比#

Terminal window
# 临时切换算法测试(不写配置,重启失效,方便对比)
sysctl -w net.ipv4.tcp_congestion_control=bbr
sysctl -w net.ipv4.tcp_congestion_control=cubic
算法内核支持依赖丢包跨境线路表现适用场景
cubic默认数据中心内网、无丢包环境
bbr4.9+跨境代理首选 ✅
bbr(v3)XanMod 等优+追求极致、能折腾
reno全部教学/老系统,不推荐
hybla需模块高延迟卫星链路

结论没有悬念:跨境 VPS 用 BBR

10.2 MTU / MSS 优化#

MTU(最大传输单元)设置不当会导致分片、丢包甚至「MSS 黑洞」(能 ping 通但网页打不开)。

Terminal window
# 查看当前网卡 MTU
ip 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 把收包分散到多核:

Terminal window
# 查看网卡队列数
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 速度没变化#

按顺序排查:

  1. 线路本身没丢包:优质 IEPL/IPLC 专线丢包极低,BBR 收益本来就小——BBR 主要救「有丢包的普通线路」;
  2. 缓冲区没调:只开 BBR 没调 tcp_rmem/wmem,高 BDP 链路被缓冲区卡死(回到 6.1);
  3. 瓶颈不在 VPS:本地宽带、对端服务器或中间线路才是瓶颈,换 iperf3 点对点测;
  4. 用的是 UDP 协议:Hysteria2/WireGuard 走 UDP,BBR 无效,要调 UDP 缓冲区(回到 6.6);
  5. 单线程测速:单流跑不满是正常的,用多线程/-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 共享宿主机内核,无法自定义内核,因此开不了 BBRsystemd-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
完全开不了 BBROpenVZ 架构换 KVM VPS

十二、速查表#

状态检查#

Terminal window
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(内核已支持时)#

Terminal window
echo "net.core.default_qdisc = fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf
sysctl -p

测速#

Terminal window
speedtest # 带宽测速
iperf3 -c IP -P 4 -t 30 -R # 点对点(下载方向)
wget -qO- bench.sh | bash # 综合测评

十三、最佳实践清单#

  1. 先看架构:KVM/Xen 才能自定义内核开 BBR;OpenVZ 直接放弃或换机。
  2. 内核够新就别折腾:内核 ≥ 4.9 原生 BBR 已够用,不必盲目上第三方内核。
  3. BBR 不是万能药:它救的是「有丢包的线路」,优质专线收益有限。
  4. 三件套一起做:BBR + 大缓冲区 + fq,缺一效果打折。
  5. UDP 协议单独调:跑 Hysteria2/WireGuard 一定要调大 UDP 缓冲区,BBR 对它们无效。
  6. 别用 tcp_tw_recycle:已被内核删除且 NAT 下有害,只用 tcp_tw_reuse。
  7. 配置写进 sysctl.d:用 99- 前缀独立文件,避免被厂商配置覆盖。
  8. 改完必测速:优化前后各测一次,多线程验证,用数据说话。
  9. 文件描述符别忘 systemd:代理服务由 systemd 拉起,必须单独设 LimitNOFILE。
  10. 做好备份:升级内核前打快照,出问题能回滚。

场景推荐配置#

场景推荐方案
普通跨境代理 VPS内核原生 BBR + fq + 完整 sysctl 模板
追求极致 / 高丢包线路XanMod 内核(BBRv3)+ 完整调优
Hysteria2/WireGuard 落地BBR + 重点调大 UDP 缓冲区 + 文件描述符
高并发落地(大量短连接)完整模板 + TIME_WAIT 复用 + 文件描述符拉满
优质 IEPL/IPLC 专线开 BBR 兜底即可,收益有限,重点保证缓冲区

总结#

VPS 网络优化的本质,是让 Linux 从「数据中心内网默认配置」切换到「跨境高延迟有丢包线路的最优配置」。核心就三件事:

  1. BBR——换掉「一丢包就降速」的 Cubic,让算法敢在有丢包的线路上跑满带宽;
  2. 大缓冲区——让高 BDP 链路装得下足够的在途数据;
  3. fq 队列 + 参数调优——发得均匀、连接数够用、UDP 不丢包。

对自建节点来说,这一步是「协议搭好之后的临门一脚」:WireGuardHysteria2sing-box 把路铺好,网络优化让车跑满。花十分钟做完,往往比换一台更贵的 VPS 还管用。

推荐阅读#

Linux VPS 网络优化与 BBR 加速完全指南:内核升级 + BBR/BBRv3 + sysctl 调优 + 测速验证 | 2026 最新实践
https://971918.xyz/posts/docs/vps-network-tuning-bbr-guide/
作者
九所长
发布于
2026-07-15
许可协议
CC BY-NC-SA 4.0