什么是带宽延迟积估算
单条 TCP 连接在任一时刻能承载的在途数据量受接收窗口与发送缓冲限制,这个上限不应低于链路带宽与往返时延的乘积(BDP)。带宽 1Gbps、RTT 20ms 时 BDP 约为 2.5MB,若 socket 缓冲只有几百 KB,连接就跑不满带宽,表现为“带宽够但单流速度上不去”。排查这类问题要按 BDP 估算目标值,再核对实际生效的缓冲与窗口。
基本信息
| 估算公式 | BDP = 带宽(bps) ÷ 8 × RTT(s) |
|---|---|
| 相关参数 | net.core.rmem_max/wmem_max、tcp_rmem/tcp_wmem |
| 应用接口 | setsockopt(SO_RCVBUF/SO_SNDBUF) |
| 窗口缩放 | tcp_window_scaling 需开启才能表达大窗口 |
| 观测 | ss -m 的 rb/tb、skmem 字段 |
| 注意 | setsockopt 传入值内核可能放大处理 |
典型使用场景
- 跨地域传输慢:核对单流吞吐是否被 BDP 限制
- 对象存储与备份同步:大流量长距离链路的参数核算
- 压测设计:确认客户端与服务端缓冲都能支撑目标吞吐
- 跨境链路排查:高 RTT 环境下的窗口瓶颈定位
- 与应用团队对齐参数:把 BDP 作为共同的计算口径
估算与确认
估算与确认
echo $((125000000 * 20 / 1000)) # 1Gbps、20ms RTT ≈ 2.5MB 在途数据
sysctl net.core.rmem_max net.core.wmem_max
sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmem
ss -m -ti dst :443 | head -4 # 看 rb/tb 与当前排队量
ping -c 5 <对端> # 先确认实际 RTT
iperf3 -c <对端> -t 20 -w 1M # 用不同窗口对比吞吐变化常见瓶颈与表现
| 瓶颈位置 | 表现 | 核查方式 |
|---|---|---|
| 接收缓冲不足 | 吞吐低于链路上限 | ss -m 的 rb 是否已到上限 |
| 发送缓冲不足 | 应用写阻塞、吞吐上不去 | ss -m 的 tb 与 skmem |
| 窗口缩放未开启 | 窗口无法超过 64KB 量级 | 核对 tcp_window_scaling |
| 链路本身拥塞 | 重传与 RTT 上升 | 抓包与 nstat 计数 |
应用显式设置缓冲时,内核会根据协议与内存情况做调整,因此 ss 读到的值与传入值常常对不上,验证时以运行时读数为准。
改 sysctl 只对新连接生效,老连接必须重连才能拿到新参数;用长连接做验证会得出“调了没用”的结论。
排查顺序建议:先用 ping 与抓包确认 RTT 和丢包情况,再看 ss 的窗口与缓冲读数,最后才动 sysctl 参数;每一步都有证据,结论才站得住。