很多人发现搬瓦工单线程下载只有几十兆,就以为是带宽不够或机器差,其实更常见的原因是 TCP 窗口受 BDP 限制——线路带宽明明很大,却因为内核默认参数保守而跑不满。本文讲清 BDP 原理,并给出可落地的 TCP 缓冲区调优与 BBR 拥塞控制配置,帮你把跨境长链路的单线程速度拉起来。
为什么单线程速度总上不去
TCP 为了不拥塞网络,会用一个发送窗口限制在途数据量。窗口大小默认偏保守,在高带宽 + 高延迟的跨境链路上,窗口很快被填满却还没收到对端确认,于是发送方被迫等待,带宽就跑不满。这与机器性能无关,而是内核 TCP 参数没适配长肥管道(Long Fat Network)。
什么是 BDP(带宽时延积)
BDP(Bandwidth-Delay Product)= 带宽 × 往返延迟(RTT),它是“要跑满这条链路,在途数据至少需要多大”的理论值。举例:带宽 1Gbps、RTT 150ms,BDP ≈ 125MB/s × 0.15s ≈ 18.75MB。也就是说 TCP 窗口至少要接近 18MB 才能跑满,而 Linux 默认 tcp_wmem/rmem 上限往往只有几 MB——窗口不够大,速度自然上不去。调优的核心,就是把缓冲区上限调到能容纳 BDP。
第一步:调大 TCP 缓冲区
编辑 /etc/sysctl.conf,加入(数值按内存量力而行,下例适合 1–2GB 内存的机器):
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.ipv4.tcp_window_scaling = 1
这把读写缓冲区上限提到 64MB,足以容纳上面算出的 BDP;tcp_window_scaling 开启窗口缩放(大窗口的前提)。
第二步:启用 BBR 拥塞控制
BBR 是 Google 提出的拥塞控制算法,在有丢包的跨境链路上通常比默认的 CUBIC 更稳、更快。继续在 sysctl.conf 加入:
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
保存后执行 sysctl -p 生效。验证:sysctl net.ipv4.tcp_congestion_control 应返回 bbr,lsmod | grep bbr 能看到模块已加载。
第三步:其他有用的网络参数
可按需追加:net.ipv4.tcp_fastopen = 3(加快连接建立)、net.ipv4.tcp_mtu_probing = 1(缓解 MTU 黑洞)、net.core.somaxconn = 4096(提升高并发监听队列)。这些对高并发 Web 服务尤其有用。
验证调优效果
调优前后各做一次对比测试:用 iperf3 多线程测带宽上限、用大文件下载测单线程实际速度,记录数值。一般在跨境高延迟链路上,调大缓冲区 + BBR 后单线程速度会有可观提升;若提升不明显,说明瓶颈在线路本身(普通线路晚高峰拥塞),调优也无能为力,这时应考虑换 CN2 GIA 机房。
注意事项
① 先备份 sysctl.conf 再改;② BBR 需要内核 ≥ 4.9,搬瓦工 KVM 架构通常可自由换内核与改参数;③ 缓冲区上限别盲目设过大,按内存量力而行,小内存机器设太大可能适得其反;④ 改完务必 sysctl -p 持久化并重测验证。调优是对症下药,不是参数越大越好。
常见问题
为什么调大 TCP 缓冲区能提速?
跨境链路是高带宽高延迟的长肥管道,要跑满需要的在途数据量(BDP=带宽×RTT)远大于内核默认窗口。把 tcp_rmem/wmem 上限调到能容纳 BDP,单线程才能跑满带宽。
BBR 一定比默认算法快吗?
在有一定丢包的跨境链路上 BBR 通常更稳更快;但若线路本身晚高峰严重拥塞,BBR 也救不了,根本解法是换 CN2 GIA 等优质线路。BBR 需要内核 4.9 及以上。
调优后还是慢怎么办?
说明瓶颈在线路而非参数。用 NextTrace 看回程是不是普通线路(AS4134/4837/9808),普通线路晚高峰拥塞调优收效有限,建议换 CN2 GIA 机房。