BDP(位)= 带宽(位/秒)× RTT(秒)
带宽 =(65535 字节 × 8 位/字节)/ 0.050 秒 ≈ 10.49 Mbit/s
窗口大小 =(10000 Mbps × 0.050 秒)/ 8 位/字节 ≈ 62.5 MB
net.ipv4.tcp_window_scaling = 1
参数 | 默认值 | 说明 |
net.ipv4.tcp_rmem | 4096 131072 6291456 | TCP socket 接收缓冲区水位(min / default / max,单位:字节) |
net.ipv4.tcp_wmem | 4096 16384 4194304 | TCP socket 发送缓冲区水位(min / default / max,单位:字节) |
net.core.rmem_max / net.core.wmem_maxrmem_max / wmem_maxmax 值调大至 BDP 的 2 倍以上sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmemsysctl -w net.ipv4.tcp_rmem='4096 131072 20971520'sysctl -w net.ipv4.tcp_wmem='4096 16384 20971520'
/etc/sysctl.conf 后执行 sysctl -pss 命令可查看 TCP 连接的详细状态,是定位窗口瓶颈的首选工具。当流量打不上去时,重点关注以下字段:字段 | 含义 |
rwnd_limited | 因对端接收窗口限制导致的暂停发包时间占比 |
sndbuf_limited | 因本端发送缓冲区不足导致的暂停发包时间占比 |
cwnd | 拥塞窗口大小 |
snd_wnd | 当前发送窗口 |
bytes_sent / bytes_acked | 已发送/已确认字节数 |
retrans | 重传次数 |
busy | 连接忙碌时长 |
pacing_rate / delivery_rate | 发送速率 / 投递速率 |
ss -ie 'dst <对端IP>'
rwnd_limited 占比较高,即对端接收窗口不足,需调大接收方 tcp_rmemsndbuf_limited 占比较高,即本端发送缓冲区不足,需调大发送方 tcp_wmembusy 时长很高且带宽上不去,通常为链路延迟或丢包导致,需检查网络质量或 qdisc 限速ss -ie 'dst 10.0.0.16'tcp ESTAB 0 3932288 10.0.0.15:49550 10.0.0.16:5201ts sack cubic wscale:7,7 rto:251 rtt:50.53/0.051 mss:1412cwnd:4474 send 1Gbpsrwnd_limited:4981ms(63.5%) sndbuf_limited:101ms(1.3%)
rwnd_limited 占比 63.5%,说明接收窗口是主要瓶颈。iperf3 -c <服务端IP> -i 1 -t 60
ss 观察窗口受限情况,可快速定位瓶颈。ss -ie 查看连接的 rwnd_limited 和 sndbuf_limited 占比。rwnd_limited 占比高(如 63.5%),确认接收窗口为瓶颈。net.ipv4.tcp_window_scaling = 1 已开启。sysctl -w net.ipv4.tcp_rmem='4096 131072 20971520'sysctl -w net.ipv4.tcp_wmem='4096 16384 20971520'
ss 输出显示 sndbuf_limited 占比较高,流量上不去。tcp_wmem 的 max 值)设置过小,应用层数据积压在发送队列。ss -ie 'dst <对端IP>' | grep sndbuf_limited
sndbuf_limited 占比和 Send-Q 积压情况。net.ipv4.tcp_wmem 的 max 值,同时确保 net.core.wmem_max 不小于该值:sysctl -w net.core.wmem_max=20971520sysctl -w net.ipv4.tcp_wmem='4096 16384 20971520'
sysctl net.ipv4.tcp_congestion_control
sysctl net.ipv4.tcp_available_congestion_control
sysctl -w net.ipv4.tcp_congestion_control=bbr
ss 显示窗口未受限,rwnd_limited / sndbuf_limited 占比低,但 busy 时长居高不下。limit 过小导致丢包。tc -s qdisc show dev eth0
dropped 计数和 backlog 积压。若 netem 规则 limit 默认为 1000,当积压超过该值会丢包。tc qdisc del dev eth0 root netem 2>/dev/nulltc qdisc add dev eth0 root netem delay 25ms limit 10000
tc -s qdisc show dev eth0
dropped 为 0,backlog 较小;异常内核 dropped 增多,backlog 积压严重ethtool -k eth0 | grep gso
ethtool -K eth0 gso on
参数 | 说明 | 调优建议 |
net.ipv4.tcp_rmem | TCP 接收缓冲区水位(min/default/max) | 高延迟网络将 max 调至 BDP 的 2 倍以上 |
net.ipv4.tcp_wmem | TCP 发送缓冲区水位(min/default/max) | 同上,确保发送缓冲区足够 |
net.core.rmem_max | 最大接收缓冲区上限 | 不小于 tcp_rmem 的 max 值 |
net.core.wmem_max | 最大发送缓冲区上限 | 不小于 tcp_wmem 的 max 值 |
net.ipv4.tcp_window_scaling | 窗口扩展因子 | 保持开启(=1) |
net.ipv4.tcp_congestion_control | 拥塞控制算法 | 高延迟链路可尝试 bbr |
net.ipv4.tcp_timestamps | TCP 时间戳 | 建议开启,有助于 RTT 测量与乱序检测 |
net.ipv4.tcp_slow_start_after_idle | 空闲后慢启动 | 长连接场景可关闭(=0) |
网卡 GSO | 通用分段卸载 | 保持开启 |
文档反馈