什么是接收缓冲自动调节
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 不会增长,因此不要用一条空闲连接的读数来评估参数是否生效。
关闭自动调节前要确认应用自己设置了缓冲,否则在大带宽或高延迟链路上会直接出现吞吐断崖,而且在忙时不易察觉。