MemAvailable是内核估算的真正可用内存,等于MemFree加可回收PageCache和KReclaimable再减低水位线wmark_low,而非简单相加,它反映新进程实际可分配量。

直接看 free -h 输出中的 available 字段,就是当前系统真正能立即分配给新进程的物理内存剩余量——不是 free,也不是 MemFree,更不是手动算出来的值。
为什么 available 才是你要的“剩余量”
Linux 内核从 3.14 开始引入 MemAvailable 字段,它综合估算:已缓存但可快速回收的 Cached、Buffers,减去不可回收部分(如 tmpfs 占用),再预留一部分用于内核紧急分配。这个值才是你起一个新服务、跑个 Python 脚本时“真能用上”的内存。
常见误区:
-
free列显示的是完全未被任何用途占用的内存,通常极低(几十 MB),不代表系统快撑不住了 -
MemFree来自/proc/meminfo,和free列同源,同样忽略可回收缓存 -
used列包含大量可回收的buff/cache,直接拿total - used算“剩余”,结果会严重偏低
free -h 的输出怎么看才不误读
执行 free -h 后,只盯住 Mem: 行的四个关键列:
-
total:内核识别的实际物理内存总量(已剔除显存、固件保留区) -
used:含缓存/缓冲区的粗略占用,仅作趋势参考,别当真实压力指标 -
free:完全空闲内存,数值小是常态,不代表内存紧张 -
available:唯一可信的“还能用多少”——这就是你要的具体剩余量
示例输出片段:
Mem: 15Gi 6.2Gi 814Mi 6.7Gi 7.4Gi
这里 7.4Gi 就是当前可用剩余量,不是 814Mi,也不是 15Gi - 6.2Gi = 8.8Gi。
当 available 值偏低时,下一步该查什么
available 持续低于总内存的 10%(比如 32Gi 总内存,available < 3.2Gi),说明物理内存确实吃紧,但原因未必是程序泄漏:
- 运行
ps aux --sort=-%mem | head -n 10,看是否有单个进程长期占%MEM > 25% - 执行
vmstat 1 5,观察so(swap out)是否持续大于 0 —— 有则说明已在换页,内存真的不够 - 检查
cat /proc/meminfo | grep -E "SReclaimable|Shmem",若Shmem(tmpfs)过大,可能是 Docker 容器或大内存映射文件占了不可回收内存
注意:available 是估算值,每秒都在变;它不等于 free + Cached 的简单相加,内核内部有更复杂的水位判断逻辑。


















