首页/系统/Linux 内核与性能调优速查/net.ipv4.tcp_moderate_rcvbuf 自动调节
网络栈调优98 条

net.ipv4.tcp_moderate_rcvbuf 自动调节

接收缓冲自动调节开关(默认 1):根据连接速率动态扩缩 rcvbuf;关闭后缓冲固定为初始值,容易限制吞吐或浪费内存。

什么是接收缓冲自动调节

tcp_moderate_rcvbuf 控制内核是否根据连接的实际速率动态调整接收缓冲:开启后,内核按连接吞吐在 tcp_rmem 的 min 与 max 之间自动扩缩,既不会让小连接白白占用大缓冲,也能让高速长距离连接获得足够窗口。关闭后缓冲固定为初始值,容易出现两种后果——高带宽场景窗口不足限制吞吐,或大量空闲连接白占内存。

基本信息

参数路径net.ipv4.tcp_moderate_rcvbuf
默认值1(开启自动调节)
调节区间net.ipv4.tcp_rmem 的 min / default / max
生效范围内核全局,新连接生效
应用覆盖应用显式 setsockopt(SO_RCVBUF) 后不再自动调节
观测ss -tim 的 rcv_space 与 skmem 字段

典型使用场景

  • 吞吐排查:确认接收缓冲是否被自动调节到了合理区间
  • 内存核算:大量连接场景下评估自动调节带来的内存峰值
  • 解释“为何缓冲没到上限”:自动调节会按需增长,不必一开始就顶满
  • 排查关闭该开关后吞吐下降的历史变更
  • 与应用显式设置缓冲的行为对比,理解优先级

查看与核对

查看与核对
sysctl net.ipv4.tcp_moderate_rcvbuf           # 是否为 1
sysctl net.ipv4.tcp_rmem                      # 自动调节的上下界
ss -tim | head -6                             # 观察 rcv_space 与 skmem 的 r 值
cat /proc/sys/net/ipv4/tcp_rmem               # 与 sysctl 一致的原始值
# 单连接核对(需要大文件传输或压测流量同时进行):
ss -tim dst :8080 | grep -m3 -E 'rcv_space|skmem'

取值与后果

取值行为典型后果
1(默认)按连接速率自动扩缩兼顾吞吐与内存效率
0 且应用未设缓冲固定为初始值高带宽连接吞吐受限
0 且应用设大缓冲固定为应用值空闲连接多时内存占用偏高
与 rmem.max 过小配合自动调节无法扩到所需值表现为窗口不足、吞吐上不去
自动调节的触发需要真实流量:空闲连接上的 rcv_space 不会增长,因此不要用一条空闲连接的读数来评估参数是否生效。
关闭自动调节前要确认应用自己设置了缓冲,否则在大带宽或高延迟链路上会直接出现吞吐断崖,而且在忙时不易察觉。

易错点

  • 关闭后若不手工设置 socket 缓冲,窗口会明显受限,长肥管道场景吞吐大幅下降
  • 排查吞吐问题先看 ss 的 rcv_space 与重传情况,再考虑动这个开关,顺序反了容易白改一轮
  • 忽略应用侧 setsockopt 的覆盖关系:应用设置了 SO_RCVBUF 时该开关对它不再生效
  • 把 tcp_rmem 的上限设得比实际需要小,自动调节再聪明也扩不上去

数据来源与参考

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