该日志表明TCP缓冲区内存超限,需调整tcp_mem三元组:min为保底值、pressure触发回收、max为硬上限;应按内存容量与并发连接数合理设置,如16GB内存可设为393216 524288 786432。

TCP: out of memory -- consider tuning tcp_mem 这个内核日志表明:TCP 协议栈在尝试分配内存(如接收/发送缓冲区)时失败,触发了内存压力告警。根本原因不是系统物理内存耗尽,而是 Linux 内核对 TCP 缓冲区使用的硬性限制(由 tcp_mem 三元组控制)被突破。此时需根据实际网络负载和内存规模合理调整该参数。
理解 tcp_mem 的三个阈值含义
/proc/sys/net/ipv4/tcp_mem 是一个由空格分隔的三整数数组:min pressure max,单位为页(page)(通常 1 page = 4 KB):
- min:TCP 始终保留的最小缓冲区页数,低于此值时内核不进行任何回收;
-
pressure:达到此值后,内核开始主动收缩 TCP 缓冲区(如降低
rmem_default/wmem_default、启用内存压力回收); - max:TCP 缓冲区可占用的绝对上限(所有 socket 总和),超过即拒绝新分配并打印该报错。
推荐的 tcp_mem 设置原则
不能简单套用固定数值,需结合总内存容量和并发连接规模估算:
- 确保
max ≥ 2 × (rmem_max + wmem_max) × 并发连接数,但不宜远超,避免过度抢占内存; -
pressure通常设为max的 60%–80%,给内核留出平滑回收空间; -
min一般设为pressure的 5%–10%,保障基础通信不被误回收; - 单页按 4 KB 计算,例如 16 GB 内存机器,保守允许 TCP 占用约 1–2 GB 缓冲区(即 262144–524288 页)。
常见场景下的参考值(单位:页)
以下为经过验证的典型配置(适用于主流云服务器或物理机),请先用 getconf PAGESIZE 确认页大小:
- 8–16 GB 内存,中等并发(:
196608 262144 393216(≈ 768 MB / 1 GB / 1.5 GB) -
32 GB 内存,高并发(10k+ 连接,如 CDN 或代理服务):
393216 524288 786432(≈ 1.5 GB / 2 GB / 3 GB) -
64 GB+ 内存,超大规模长连接(如实时消息网关):
786432 1048576 1572864(≈ 3 GB / 4 GB / 6 GB)
生效与验证方法
修改后需立即生效并确认效果:
- 临时生效:
echo "393216 524288 786432" > /proc/sys/net/ipv4/tcp_mem - 永久生效:在
/etc/sysctl.conf中添加net.ipv4.tcp_mem = 393216 524288 786432,再执行sysctl -p - 验证是否写入:
cat /proc/sys/net/ipv4/tcp_mem - 观察是否还出现报错:
dmesg -T | grep "out of memory"或监控/var/log/messages - 检查当前 TCP 内存使用:
cat /proc/net/snmp | grep -A1 Tcp:中的InOctets/OutOctets可辅助判断流量压力,但更直接的是看/proc/net/sockstat中mem字段总和是否接近max值。










