必须同步调大net.core.rmem_max/wmem_max,否则tcp_rmem/wmem的max值会被截断;三参数为min default max(单位字节),分别表示内存压力下最小值、新连接初始值、自动扩缩上限,且max不能超过对应core._max。

直接改 /proc/sys/net/ipv4/tcp_rmem 和 /proc/sys/net/ipv4/tcp_wmem 就生效,但必须同时调大 net.core.rmem_max 和 net.core.wmem_max,否则应用层设置会被截断。
tcp_rmem 和 tcp_wmem 的三参数怎么填
它们都接受空格分隔的三个整数:min default max(单位字节),不是“起始值、中间值、上限”这种模糊说法。
-
min:内存压力下内核允许的最小缓冲区,不能低于net.core.rmem_min/wmem_min(通常 256/2048) -
default:新连接初始分配的缓冲区大小,影响刚建连时的吞吐爬升速度 -
max:该连接缓冲区能自动扩到的最大值,但实际不会超过net.core.rmem_max/wmem_max
例如高延迟链路(RTT=50ms,带宽1Gbps):BDP ≈ 1e9 × 0.05 ÷ 8 ≈ 6.25MB,max 至少设为 12MB(2×BDP),default 可设 256KB~1MB,min 保持 4KB 即可。
为什么改了 tcp_rmem 还没效果
常见原因就两个:
- 没同步调大
net.core.rmem_max—— 应用层调用setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, ...)时,内核会把传入值向上对齐到 2 倍,并且不能超过net.core.rmem_max;如果后者还是默认的 212992(≈208KB),那再大的tcp_rmemmax也白搭 - 没开自动调节:
net.ipv4.tcp_moderate_rcvbuf = 0(默认是 1,但某些旧镜像或加固脚本会关掉);关了之后,内核就只用default值,不再根据流量动态扩缩
检查命令:sysctl net.ipv4.tcp_moderate_rcvbuf 和 sysctl net.core.rmem_max
永久生效要改哪几个文件
只改 /etc/sysctl.conf 不够,因为部分发行版(如 RHEL/CentOS 8+、Ubuntu 20.04+)会加载 /etc/sysctl.d/*.conf 中的配置,且顺序靠后的文件会覆盖前面的。
- 推荐做法:新建
/etc/sysctl.d/99-tcp-buffers.conf,写入:
net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 262144 16777216 net.ipv4.tcp_wmem = 4096 262144 16777216 net.ipv4.tcp_moderate_rcvbuf = 1
- 然后运行
sysctl -p /etc/sysctl.d/99-tcp-buffers.conf生效 - 别漏掉
net.core.rmem_max和net.core.wmem_max—— 它们是硬上限,不设够,其他参数全失效
真正容易被忽略的是:应用层代码里显式调用 setsockopt(..., SO_RCVBUF, ...) 时,传的值会被内核翻倍,且受 net.core.rmem_max 截断;而很多人只调了 tcp_rmem,以为万事大吉。











