@linda #3
VPS TCP 调优实战手册(BBRv3 + 按 BDP 定缓冲)
场景:500 Mbps–1 Gbps、跨境高 RTT(100–200 ms)的 VPS。实测环境 Debian 13 / Ubuntu 24.04,洛杉矶 ↔ 中国 RTT≈135 ms。
实测效果:单线程下载 134 → 594 Mbps,重传率 8.6% → 0.1–3.2%。下文 IP 用 <你的IP> 占位。
一、三条前提
- 瓶颈是窗口,不是带宽:
吞吐 ≈ 窗口 ÷ RTT。500 Mbps × 135 ms ≈ 8.4 MB 的 BDP,而内核默认 tcp_wmem 上限只有 4 MB(≈237 Mbps 的理论顶)——实测默认参数下单线程被卡在 134–392 Mbps。缓冲不加够,换内核也没用。
bbr ≠ BBRv3:唯一判据是 modinfo tcp_bbr | grep version 显示 version: 3。BBRv3 没进 Linux 主线,必须用打补丁的内核(如 XanMod)。
- 单次测试不可信:同一晚同一台机器实测 313 ↔ 594 Mbps。改前改后各跑 3 次,只比同时段。
二、参数速查
项 |
取值 |
说明 |
|---|
拥塞控制 / 队列 |
bbr / fq |
fq 是 BBR 的配套队列 |
缓冲上限 |
33554432(32 MB) |
≥ BDP 并留 4 倍余量;不预分配、按需增长,内核 tcp_mem 兜底 |
tcp_rmem / tcp_wmem |
4096 131072 33554432 / 4096 16384 33554432 |
|
core.rmem_max / wmem_max |
必须 ≥ tcp_* 的 max |
否则 tcp 上限被 core 截断 |
tcp_moderate_rcvbuf |
1 |
敢开大 rmem_max 的前提 |
tcp_slow_start_after_idle / tcp_mtu_probing |
0 / 1 |
空闲后不重新慢启动 / 防 MTU 黑洞 |
tcp_fastopen |
3 |
对 Windows 客户端无效 |
tcp_ecn |
保持默认 2 |
2 = 接受但不主动请求;要真生效得改发起方 |
调优文件 |
全机只留一份 |
多份 98/97/99 互相覆盖是事故源头 |
不要用 |
tcp_notsent_lowat、tcp_no_metrics_save、tcp_fack |
实测无收益 / 现代内核已无此键 |
vm.panic_on_oom |
必须 0 |
设 1 再配 kernel.panic=1,内存打满就整机重启 |
Windows 客户端侧:不要设 autotuninglevel=restricted(压死接收窗口)。其余 timer/加固类参数现代内核默认已合理,不用抄。
三、操作流程
0 · 体检
uname -r
sysctl net.ipv4.tcp_congestion_control net.core.default_qdisc
sysctl -n net.ipv4.tcp_wmem net.core.wmem_max
modinfo tcp_bbr 2>/dev/null | grep version
ls /etc/sysctl.d/
1 · 换 XanMod 内核
lscpu | grep -o -m1 'avx2\|avx512f'
wget -qO - https://dl.xanmod.org/archive.key | gpg --dearmor -o /usr/share/keyrings/xanmod-archive-keyring.gpg
gpg --show-keys --with-fingerprint /usr/share/keyrings/xanmod-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/xanmod-archive-keyring.gpg] http://deb.xanmod.org trixie main" \
> /etc/apt/sources.list.d/xanmod-release.list
apt update && apt install -y linux-xanmod-lts-x64v3
换核前生存检查(云主机必做,缺了就是重启失联):
NEW=6.18.53-x64v3-xanmod1
grep -E "CONFIG_VIRTIO_BLK=y|CONFIG_VIRTIO_PCI=y|CONFIG_EXT4_FS=y" /boot/config-$NEW
lsinitramfs /boot/initrd.img-$NEW | grep virtio_net
安全换核(一次性启动 + 冷启动回退锚点):
cp /etc/default/grub /root/grub.orig
sed -i "s/^GRUB_DEFAULT=.*/GRUB_DEFAULT=saved/; s/^GRUB_TIMEOUT=.*/GRUB_TIMEOUT=10/" /etc/default/grub
grep -E "^\s*(menuentry|submenu)" /boot/grub/grub.cfg
grub-set-default "<旧内核条目>"
grub-reboot "<新内核条目>"
update-grub && reboot
重启后验证,通过再固化:
uname -r && modinfo tcp_bbr | grep version && systemctl --failed
grub-set-default "<新内核条目>"
2 · 写调优参数
把下面这份写进 /etc/sysctl.d/99-tcp-tuning.conf;若厂商自带调优文件(如 99-bbr-network.conf),并入它而不是新建:
cat > /etc/sysctl.d/99-tcp-tuning.conf <<'EOF'
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.ipv4.tcp_rmem = 4096 131072 33554432
net.ipv4.tcp_wmem = 4096 16384 33554432
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_fin_timeout = 15
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_syn_backlog = 8192
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF
换链路就按 BDP 重算,再留 2–4 倍余量:1 Gbps × 135 ms ≈ 16.9 MB → 取 64 MB;200 Mbps × 200 ms ≈ 5 MB → 取 16 MB。
3 · 生效与验证
sysctl --system
for k in net.core.rmem_max net.core.wmem_max net.ipv4.tcp_rmem net.ipv4.tcp_wmem \
net.ipv4.tcp_congestion_control net.core.default_qdisc \
net.ipv4.tcp_slow_start_after_idle net.ipv4.tcp_fastopen; do
printf "%-40s %s\n" "$k" "$(sysctl -n $k)"
done
sysctl --system 2>&1 | grep -iE "error|invalid|cannot stat" || echo "无错误"
4 · 测速与看重传
iperf3 -s -p 50280 -D -1
iperf3 -c <你的IP> -p 50280 -R -t 30 -b 450M -i 1
pkill -x iperf3
逐秒重传只能在 VPS 上看(Windows 版 iperf3 不输出 Retr 列)。测速时另开一个窗口:
while true; do printf "%s " "$(date +%T)"; nstat -z TcpRetransSegs | tail -1; sleep 1; done
现象 |
含义 |
|---|
限速 450M 跑满、重传 0–2 千次(< 1%) |
健康 |
不限速时重传变多且速率上升 |
正常,压到链路容量了 |
速率远低于带宽、重传几万次 |
真丢包或缓冲不足 |
上传始终只有 5–9 Mbps |
客户端上行瓶颈,调服务端无用;要快换 QUIC(如 Hysteria2) |
同机不同时段差一倍 |
链路拥塞波动,不是机器问题 |
5 · 回滚
cp /root/99-tcp-tuning.conf.bak-<日期> /etc/sysctl.d/99-tcp-tuning.conf && sysctl --system
grub-set-default "<旧内核条目>" && reboot
四、陷阱
- 调优文件堆叠:厂商一份、脚本一份、自己一份,加载顺序决定谁赢;改了没生效先查这里。
vm.panic_on_oom = 1:内存打满不是杀进程而是整机 panic,配合 kernel.panic=1 直接重启。
- 写错键名静默无感:如
net.ipv6.tcp_rmem 内核里根本没这个键,只报一行错;sysctl --system 的输出必须看。
- 卸旧内核时被拉进 EDGE:
linux-xanmod-lts-x64v3 与 linux-xanmod-x64v3 是两个包,apt purge 会因依赖把 EDGE 装上;卸完 dpkg -l | grep xanmod 复查。
- 换核不看 virtio:根盘是 virtio-blk、网卡是 virtio-net,新内核 config/initramfs 里缺了就失联。
- 临时测速口写进持久化规则:
iptables -I INPUT 开的端口,中途一旦 iptables-save > /etc/iptables/rules.v4,重启会自动复现;收尾要同时删 live 规则和持久化文件里的那一行。
五、优先级
缓冲按 BDP 加够(134 → 392 Mbps,收益最大)→ 换 BBRv3 内核(486 → 546/559 Mbps,重传 8.6% → 3.2%)→ 边角参数。每次改动都用同时段多次测试验证。