调优 net.ipv4.tcp_mem 的核心目标是防止 TCP 内存无节制增长导致系统 OOM 或新连接被内核拒绝;其三元组 low/medium/high(单位:页)控制全系统 TCP 缓冲区总量,推荐值 8388608 12582912 16777216 对应 32GB/48GB/64GB,high 不超物理内存 50%~60%,需同步调整 tcp_rmem、tcp_wmem、rmem_max、wmem_max 等参数,并通过 /proc/net/sockstat、ss -i 和 /proc/vmstat 监控生效与风险。

调优 net.ipv4.tcp_mem 的核心目标不是“让 Worker 更安全”,而是防止 TCP 内存无节制增长导致系统 OOM(Out of Memory)或新连接被内核主动拒绝——这才是 Worker 崩溃、连接失败、响应中断等“不安全”现象的根源。
理解 tcp_mem 的三重阈值逻辑
该参数是三元组:low medium high(单位:页,1页=4KB),控制的是全系统所有 TCP 套接字缓冲区占用内存的总量策略,而非单个连接:
- low:低于此值,TCP 内存宽松分配,不干预
- medium:超过 low 后,内核开始回收部分缓冲区(如压缩 rmem/wmem),降低单连接缓冲大小
-
high:超过此值,内核进入保守模式:拒绝新连接(SYN 包可能被丢弃)、丢弃接收数据包、强制缩减缓冲——此时 Worker 会持续报
Connection refused或connect timeout
百万并发下的推荐取值与计算依据
以 16GB 内存服务器为例(常见部署基线),建议配置:
net.ipv4.tcp_mem = 8388608 12582912 16777216
- 对应字节数:32GB / 48GB / 64GB(因单位为页 × 4KB)
- 实际物理内存占用通常远低于 high 值——这是设计冗余,不是目标用量
- 关键逻辑:high 值应 ≤ 系统总内存的 50%~60%,预留空间给应用进程、page cache、其他内核子系统
- low 和 medium 按比例设为 high 的 50% 和 75% 左右,保证平滑过渡,避免突兀回收
必须同步调整的配套参数
tcp_mem 单独调大无效,需与单连接缓冲策略协同:
-
增大单连接接收/发送窗口上限:
net.ipv4.tcp_rmem = 4096 65536 16777216net.ipv4.tcp_wmem = 4096 65536 16777216
→ 确保每个连接在高吞吐时能用足缓冲,但又不突破 tcp_mem 总量墙 -
放宽系统级缓冲区硬限:
net.core.rmem_max = 16777216net.core.wmem_max = 16777216
→ 避免应用层 setsockopt(SO_RCVBUF) 被截断 -
禁用自动缩窗干扰:
net.ipv4.tcp_low_latency = 1(可选)
→ 减少延迟敏感场景下内核自动压缩缓冲区的行为
验证是否生效及风险监控
生效后,用以下命令持续观察:
-
cat /proc/net/sockstat→ 查看sockets: used和TCP:行中的mem值(单位:页),确认未持续逼近 high -
ss -i→ 抽样检查 ESTABLISHED 连接的rcv_space/snd_space是否稳定在合理范围(如 64KB–1MB),而非被压到几 KB -
grep -i "tcp.*mem" /proc/vmstat→ 关注tcp_mem_error计数,若非零说明已触发 high 阈值拒绝行为

















