什么是 tcp_adv_win_scale
接收缓冲并不全都被用来通告窗口:内核要留一部分承载协议开销与自身结构。tcp_adv_win_scale 决定这个换算比例——取值为正时,开销按“缓冲 ÷ 2^scale”估算,因此默认值 1 意味着大约一半的接收缓冲被算作开销;取值不大于 0 时按另一种公式估计。它是底层微调项,理解不深时改它往往让吞吐问题更难定位,正确做法是先看接收缓冲上限与链路带宽延迟积。
基本信息
| 参数路径 | net.ipv4.tcp_adv_win_scale |
|---|---|
| 默认值 | 1(约一半缓冲作为开销) |
| 相关参数 | tcp_rmem、tcp_moderate_rcvbuf、tcp_window_scaling |
| 生效范围 | 内核全局,影响新建立的连接 |
| 影响面 | 通告窗口估算与单流吞吐 |
| 观测 | ss -tim 的 rcv_space、rcv_ssthresh 等字段 |
典型使用场景
- 理解 ss -tim 输出的 rcv_space 与窗口关系,解释“缓冲够大但吞吐上不去”
- 高带宽长延迟链路的吞吐分析:判断瓶颈是缓冲还是窗口换算
- 与 tcp_rmem 的上限一起核对,确认窗口是否被换算规则拖小
- 排查应用显式 setsockopt 后的行为差异
- 作为知识型核对项,避免把吞吐问题错误归因到该参数
查看与关联
查看与关联
sysctl net.ipv4.tcp_adv_win_scale # 当前取值
sysctl net.ipv4.tcp_rmem # 接收缓冲 min/default/max
sysctl net.ipv4.tcp_window_scaling # 窗口缩放必须开启
ss -tim dst :8080 | head -4 # 看 rcv_space 与实际窗口
ss -tim | grep -m3 -o 'rcv_space:[0-9]*'
iperf3 -c <对端> -t 20 -w 512K # 用不同窗口对比吞吐
# 变更示例(需评估):sysctl -w net.ipv4.tcp_adv_win_scale=2相关联调项
| 参数 | 作用 | 调整顺序建议 |
|---|---|---|
| tcp_rmem | 接收缓冲的初始与上限 | 优先核对是否够支撑带宽延迟积 |
| tcp_moderate_rcvbuf | 接收缓冲自动调节 | 保持开启,通常无需改动 |
| tcp_window_scaling | 窗口缩放选项 | 必须开启,否则大窗口无法表达 |
| tcp_adv_win_scale | 缓冲与窗口的换算 | 最后才考虑,且需压测验证 |
判断链路是否受窗口限制可以用带宽延迟积估算:带宽 1Gbps、RTT 20ms 时在途数据约 2.5MB,接收缓冲明显小于这个量级时,先扩容缓冲而不是动换算参数。
该参数语义涉及内核内部开销估算,理解不深时保持默认更稳;把它当“吞吐加速开关”随意放大,会掩盖真实的缓冲或链路瓶颈。