首页/系统/Linux 内核与性能调优速查/net.core.rmem_default 默认接收缓冲
网络栈调优98 条

net.core.rmem_default 默认接收缓冲

未显式 setsockopt 时 socket 的初始接收缓冲;与 rmem_max 是上限的关系,应用可按需覆盖。

什么是 rmem_default

net.core.rmem_default 是新建 socket 在应用没有显式调用 setsockopt(SO_RCVBUF) 时使用的初始接收缓冲大小;net.core.rmem_max 则是任何 socket 通过 setsockopt 能申请到的上限(在部分内核上还需 sysctl 允许,实际以本机行为为准)。两者是“默认值”与“天花板”的关系:调大默认值会让所有未显式设置的连接一起变胖,因此高并发场景要按连接数核算内存总量。

基本信息

参数路径net.core.rmem_default / net.core.rmem_max
单位字节
关系default 为初始值,max 为上限
TCP 侧对应net.ipv4.tcp_rmem 的 min/default/max
应用覆盖setsockopt(SO_RCVBUF) 可显式指定
观测ss -tmn 的 skmem 字段

典型使用场景

  • 未显式设置缓冲的老应用行为解释与调优
  • 高并发连接服务的内存核算:评估默认值放大后的总量
  • 接收窗口不足导致吞吐受限时的排查顺序确认
  • 与应用侧 setsockopt 的取值对比,确认谁在生效
  • 容器与宿主参数差异导致的行为不一致排查

查看与核对

查看与核对
sysctl net.core.rmem_default net.core.rmem_max
sysctl net.ipv4.tcp_rmem                    # TCP 专用区间(通常优先于 core 值)
ss -tmn | head -8                           # 看 skmem 的 r 与 rb 值
ss -tmn dst :8080 | grep -m3 -o 'skmem:[^ ]*'
sysctl -w net.core.rmem_default=262144      # 示例:调大到 256KiB(需评估)
# 高并发估算:连接数 × 单连接内存峰值,与总内存对照

取值与影响

取值行为注意
默认(常见 212992)普通服务的初始接收缓冲多数场景够用
显式调大所有未设置的应用一起变胖必须按连接总量核算内存
应用 setsockopt以应用值为准受 rmem_max 约束
rmem_max 偏小应用申请的大缓冲被截断表现为窗口上不去、吞吐受限
TCP 连接的接收缓冲实际主要由 net.ipv4.tcp_rmem 与自动调节决定,net.core.* 系列更多用于 UDP 与其他协议;排查时先确认协议再决定看哪一组参数。
全局调大默认值会线性放大所有连接的内存占用:十万连接规模下每连接多 128KiB 就是十几 GiB,务必先算账再改。
调整顺序建议:先让应用显式设置自己需要的缓冲,再考虑动全局默认值;这样变更范围小、影响可预测,出问题也容易回滚。

易错点

  • 全局调大增加每连接内存占用,高并发连接场景要核算总量,否则容易把内存风险从网络搬到内存
  • 自动调节(tcp_moderate_rcvbuf)开启时实际值会动态变化,按默认值静态推算会得出错误结论
  • 忽略应用侧 setsockopt 的优先级,改了 sysctl 却发现没有任何变化
  • 把 core.rmem_default 当成 TCP 接收缓冲的万能开关,真正起作用的是 tcp_rmem 与自动调节

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/net.rst
  • man-pages tcp(7)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌