首页/系统/Linux 内核与性能调优速查/socket 缓冲与带宽延迟积估算
网络栈调优98 条

socket 缓冲与带宽延迟积估算

高 RTT 链路上单流吞吐受限, 往往是 socket 缓冲小于带宽延迟积; 先估算目标 BDP, 再设置收发缓冲。

什么是带宽延迟积估算

单条 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 参数;每一步都有证据,结论才站得住。

易错点

  • setsockopt 传入值内核可能做调整处理,与 ss 读数对不上属于正常,直接判定参数未生效容易误判
  • 改 sysctl 只对新连接生效,老连接需重连验证,否则会误以为变更无效
  • 只调大缓冲不看重传与拥塞指标,链路本身丢包的场景下缓冲再大也跑不满
  • 忘记 tcp_window_scaling 是前提,窗口无法表达时缓冲调多大都没有意义

数据来源与参考

  • man 7 socket
  • Linux Documentation/networking/ip-sysctl.txt
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌