参数是什么
net.core.rmem_default 与 net.core.wmem_default 是新套接字的默认接收/发送缓冲大小,单位字节,现代内核常见值 212992(约 208 KiB)。应用创建 socket 时没有显式调用 setsockopt(SO_RCVBUF/SO_SNDBUF) 的话,就继承这两个默认值;TCP 还会在此基础上按内核文档口径取 tcp_rmem[1] 与 rmem_default 中较小者作为实际默认,再交给自动调优在 tcp_rmem/tcp_wmem 区间内调整。
基本信息
| 适用平台 | Linux 全平台(CentOS/RHEL、Ubuntu/Debian、SUSE) |
|---|---|
| 参数 | net.core.rmem_default、net.core.wmem_default |
| 常见默认 | 212992 字节;老版本内核更小 |
| 相关上限 | net.core.rmem_max、net.core.wmem_max(setsockopt 可设的最大值) |
| 覆盖方式 | 应用层 setsockopt(SO_RCVBUF/SO_SNDBUF),或 fd 上的 SO_RCVBUFFORCE |
| 持久化 | /etc/sysctl.d/*.conf + sysctl --system |
典型使用场景
- 高 QPS 的 UDP 服务(DNS、syslog、监控采集)出现丢包,而应用没有设置 SO_RCVBUF,默认接收缓冲过小是常见嫌疑
- 高并发短连接服务(HTTP 网关、代理)不想为每个连接显式调缓冲,改为抬高全局默认值统一生效
- 与 tcp_rmem/tcp_wmem 自动调优配合评估:默认值过大时可能压制自动调优的灵活性
- 交付统一基线:把网络缓冲默认值写进镜像或配置管理,避免每台机器行为不一致
- 大文件传输(rsync、scp、备份)调优时,用 ss -m 核对连接实际的 skmem 分配
查看与调整
查看与调整
sysctl net.core.rmem_default net.core.wmem_default # 查看当前默认值
sysctl net.core.rmem_max net.core.wmem_max # 同时看上限,确认改默认值不会越界
ss -m -t state established # -m 打印每条连接的 skmem 缓冲分配明细
sysctl -w net.core.rmem_default=1048576 # 临时生效,重启回退
printf 'net.core.rmem_default = 1048576\nnet.core.wmem_default = 1048576\n' > /etc/sysctl.d/90-netbuf.conf
sysctl --system # 重载并回显,确认写入被接受每连接内存成本
| 项目 | 典型值 | 说明 |
|---|---|---|
| 接收默认缓冲 | 212992 字节 | 每个未显式设置的套接字基数 |
| 发送默认缓冲 | 212992 字节 | 同上 |
| 一万并发连接上界 | 约 4 GiB | 按 2×212992×10000 估算,属理论上界 |
| 实际占用 | 通常远小于上界 | 内核按需分页分配,空闲缓冲不占满;但峰值并发下会接近上界 |
修改默认值对已存在的套接字无效,只影响之后新建的连接;在线服务需要重启进程或接受「只对新连接生效」的过渡期。容器内 /proc/sys/net/core 默认只读或为独立命名空间,必须改宿主 netns 才影响容器流量。
判断「调大有没有用」的唯一可靠办法是看连接实际值:ss -m 输出的 skmem 中 rcvbuf/sndbuf 是该 socket 的真实设置,而 rmem_default 只是它的来源。