套接字缓冲上限是什么
net.core.rmem_max 与 net.core.wmem_max 分别是单个套接字接收缓冲与发送缓冲的硬上限,默认各为 212992 字节(约 208KB)。应用调用 setsockopt 设置 SO_RCVBUF 或 SO_SNDBUF 时,请求值会被这两个上限截断;接收侧的自动调优另有自己的上限,来自 tcp_rmem 的第三个值。因此排查「缓冲调不大」的问题时,要先分清走的是应用显式设置还是内核自动调优这两条路径。
基本信息
| 参数 | net.core.rmem_max、net.core.wmem_max |
|---|---|
| 默认值 | 212992 字节(约 208KB) |
| 约束对象 | 应用通过 setsockopt 设置的单个套接字缓冲上限 |
| 与 TCP 参数的边界 | 接收自动调优上限来自 tcp_rmem 第三值,发送来自 tcp_wmem 第三值 |
| 适用协议 | TCP、UDP 与 Unix 域套接字等;本条目侧重网络套接字 |
| 观测方式 | ss -tmi 查看连接的缓冲与队列使用情况 |
典型使用场景
- 文件传输与跨机房同步:需要单连接大吞吐时放宽缓冲上限
- UDP 接收端:应用自设较大接收缓冲防止突发丢包,超过上限会被截断
- 排查缓冲设置无效:应用把套接字缓冲设得很大却毫无效果,先核对这两个上限
- 内存评估:为高连接数服务放宽上限前,估算连接数与单连接缓冲的乘积
- 对比验证:确认库或框架是否在内部设置套接字选项,避免误判内核行为
查看与调整
查看与调整
sysctl net.core.rmem_max net.core.wmem_max # 读两个上限
sysctl -w net.core.rmem_max=16777216 # 放宽接收上限
sysctl -w net.core.wmem_max=16777216 # 放宽发送上限
sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmem # 核对自动调优的上下限
ss -tmi state established | head # 观察缓冲与队列使用落盘与回读
落盘与回读
# /etc/sysctl.d/99-net-tuning.conf
net.core.rmem_max = 16777216 # 单套接字接收缓冲上限
net.core.wmem_max = 16777216 # 单套接字发送缓冲上限
# 回读命令:sysctl net.core.rmem_max net.core.wmem_max两条路径对照
| 场景 | 实际生效的上限 | 注意点 |
|---|---|---|
| 应用显式 setsockopt | net.core.rmem_max / wmem_max | 请求值超过上限会被静默截断 |
| 内核自动调优 | tcp_rmem 与 tcp_wmem 的第三个值 | 与 core 上限是两套边界,容易漏改 |
| UDP 接收 | net.core.rmem_max | 无自动调优,完全依赖应用设置 |
| 发送积压观察 | ss 的 Send-Q 与内核缓冲统计 | 判断是应用写快还是对端收得慢 |
只改上限不会自动提升实际缓冲:应用没显式设置时,接收侧缓冲由内核按链路情况自动调整,上限仍由 tcp_rmem 决定;发送侧同理。放宽 core 上限只是让应用的大额请求不再被截断。
放宽上限会抬高内存峰值:缓冲按使用量增长,但大量并发连接同时吃满时,内存占用等于连接数乘以单连接缓冲。调整前后都应观察内存与连接数的变化趋势。