net.ipv4.tcp_mem 是 tcp 内存总量控制参数,三值分别表示低水位(宽松)、中水位(压力回收)、高水位(强制限流),单位为内存页;合理设置需匹配物理内存、并发连接数及单连接开销,并与 tcp_rmem、tcp_wmem 等协同调优。

net.ipv4.tcp_mem 是 Linux 内核 TCP 内存管理的“总闸门”,不直接控制单个连接,而是约束所有 TCP 套接字共用的内存总量。高并发场景下(如 10 万+ 连接),若该参数设置过小,内核会因内存不足拒绝新连接,报错如 TCP: too many of orphaned sockets 或触发 OOM Killer;设得过大又可能挤占其他关键内存。调优核心是:让三个阈值匹配实际物理内存、连接规模和单连接平均开销。
明确 tcp_mem 三值的实际含义与触发逻辑
tcp_mem = low medium high 单位是内存页(page),默认每页 4KB(可通过 getconf PAGESIZE 确认)。
- low:低于此值,TCP 内存使用宽松,不干预;
- medium:超过 low 后进入“压力模式”,内核主动回收缓冲区(如缩减 socket 接收窗口);
- high:超过此值,内核强制限制——拒绝新连接、丢弃数据包、复位孤儿 socket,保护系统不崩溃。
关键点:
high值决定了 TCP 可用内存上限。例如high=3145728页 ≈ 3145728 × 4KB ≈ 12GB。若服务器总内存为 16GB,该值就偏高,需结合其他进程留出余量。
根据并发连接数和内存估算合理 high 值
每个 TCP 连接在内核中至少占用:
- 接收缓冲区(受
tcp_rmem[1]影响) - 发送缓冲区(受
tcp_wmem[1]影响) - socket 结构体、队列元数据等固定开销(约 3–5KB)
实测经验:在中等负载下,一个活跃连接平均消耗 6–8KB 内核内存。
若目标支撑 50 万并发连接:500000 × 7.5KB ≈ 3.75GB → 对应页数:3750 × 1024 ÷ 4 ≈ 960000 页
则 high 值建议设为 1200000–1500000(≈ 4.7–5.9GB),为突发流量和系统其他组件预留空间。
推荐比例参考(经验值):
-
low : medium : high ≈ 1 : 2.2 : 3 - 例如:
960000 2100000 2880000
避免常见误配陷阱
-
不要照搬“越大越好”模板:把
high设到 2000 万页(78GB)会导致系统内存被 TCP 锁死,OOM 风险陡增; -
不与
tcp_rmem/tcp_wmem脱节:若单连接最大接收缓冲区设为 16MB(tcp_rmem[2]=16777216),但tcp_mem[2]过小,内核会在连接数远未达上限时就触发 pressure; -
注意单位混淆:
tcp_mem是页数,tcp_rmem/tcp_wmem是字节数,换算时别漏乘 4096; -
避免忽略
tcp_max_orphans:该值限制无文件描述符关联的 orphan socket 数量,若tcp_mem[2]已满但tcp_max_orphans过小,会提前报错。
生产环境推荐配置(16GB 内存服务器,目标 30–50 万并发)
# 编辑 /etc/sysctl.conf net.ipv4.tcp_mem = 786432 2097152 3145728 # 对应:~3GB / ~8GB / ~12GB(预留 4GB 给系统及其他应用) # 同步调整配套参数(防止瓶颈转移) net.ipv4.tcp_rmem = 4096 131072 8388608 # min/default/max 接收缓冲(8MB max) net.ipv4.tcp_wmem = 4096 131072 8388608 # 同上,发送缓冲 net.ipv4.tcp_max_orphans = 65536 # 允许最多 6.5 万个孤儿 socket
生效命令:
sysctl -p
调优后可通过以下方式验证:
-
cat /proc/net/sockstat查看TCP: inuse 12345 orphan 678实时统计; -
dmesg | grep -i "orphan\|mem"检查是否还有内存相关警告; - 压测时观察
ss -s中total: 524321是否稳定增长,无突降或报错。
不复杂但容易忽略










