net.ipv4.tcp_rmem 三元组控制单个TCP连接接收缓冲区的最小值、默认值和最大值,单位字节;其最大值受 net.core.rmem_max 硬限制约束,超出部分将被截断,新连接才生效。

直接用 sysctl 调整 net.ipv4.tcp_rmem 就能控制单个 TCP 连接的接收缓冲区最小值、默认值和最大值。它不作用于全局内存总量,而是影响每个连接在自动调优过程中的缓冲区伸缩范围。
理解 tcp_rmem 的三个数值含义
net.ipv4.tcp_rmem 是一个三元组,格式为:最小值 默认值 最大值(单位:字节):
- 最小值:内核为每个新 TCP 连接分配的接收缓冲区下限。即使网络极快或极慢,也不会低于此值;
- 默认值:连接刚建立、尚未触发自动扩缩时使用的初始缓冲区大小;
-
最大值:TCP 自动调优机制允许该连接接收缓冲区增长到的上限——但实际能否达到,还受
net.core.rmem_max约束。
为什么最大值可能被截断?关键约束关系
tcp_rmem[2](即第三个数)只是“建议上限”,真正生效的硬性上限是 net.core.rmem_max。如果前者大于后者,内核会按后者裁剪。例如:
若设置 net.ipv4.tcp_rmem = 4096 131072 33554432(32MB),但 net.core.rmem_max = 16777216(16MB),则单连接实际无法突破 16MB。
所以调大 tcp_rmem 前,务必同步检查并必要时提升:
sysctl net.core.rmem_max-
sysctl net.core.rmem_default(影响未显式 setsockopt 的连接)
临时调整与永久生效操作步骤
执行以下命令可立即生效(重启后失效):
sysctl -w net.ipv4.tcp_rmem="4096 131072 16777216"sysctl -w net.core.rmem_max=16777216
要永久保存,写入 /etc/sysctl.conf 并重载:
- echo "net.ipv4.tcp_rmem = 4096 131072 16777216" >> /etc/sysctl.conf
- echo "net.core.rmem_max = 16777216" >> /etc/sysctl.conf
- sysctl -p
验证是否生效
运行命令确认当前值:
sysctl net.ipv4.tcp_rmem net.core.rmem_max
也可查看实时文件:
cat /proc/sys/net/ipv4/tcp_rmem
cat /proc/sys/net/core/rmem_max
注意:已建立的连接不会动态更新缓冲区,新连接才会按新参数初始化。











