首页/系统/Linux 内核与性能调优速查/net.ipv4.tcp_adv_win_scale 窗口换算
网络栈调优98 条

net.ipv4.tcp_adv_win_scale 窗口换算

决定接收缓冲中协议开销与可用窗口的换算比例(默认 1);影响通告窗口的估算方式,属于底层微调项。

什么是 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,接收缓冲明显小于这个量级时,先扩容缓冲而不是动换算参数。
该参数语义涉及内核内部开销估算,理解不深时保持默认更稳;把它当“吞吐加速开关”随意放大,会掩盖真实的缓冲或链路瓶颈。

易错点

  • 语义涉及窗口开销估算,理解不深时保持默认更稳,改错了很难看出影响
  • 吞吐异常优先排查 rmem 与窗口缩放(tcp_window_scaling),把顺序反过来会浪费大量时间
  • 只改宿主参数不看应用侧 setsockopt,应用显式设置的缓冲会覆盖全局默认值
  • 调整后不做同负载压测对比,无法区分是参数有效还是网络本就波动

数据来源与参考

  • Linux 内核 Documentation/networking/
  • Linux 内核源码 net/ipv4/tcp.c
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌