首页/系统/Linux 内核与性能调优速查/MemAvailable 与 free 的差异
内存与 OOM58 条

MemAvailable 与 free 的差异

MemAvailable 是内核基于可回收缓存与 slab 估算的可用量(free 的 available 列),比 MemFree 更能代表还能分配多少;完整空闲只是 MemFree。

什么是 MemAvailable

MemFree 只统计完全没被使用的内存,而 Linux 会把大部分空闲内存拿去做页缓存与内核缓存,因此 MemFree 小并不等于内存紧张。MemAvailable 是内核综合可回收缓存、slab 可回收部分与低水位估算出的“还能分配给新进程的内存量”,也就是 free 命令 available 列的数据来源。判断内存是否充足,看 MemAvailable 比看 MemFree 有意义得多。

基本信息

字段来源/proc/meminfo 的 MemAvailable
free 对应available 列
内核版本约 3.14 起提供该字段
相关字段MemFree、Buffers、Cached、SReclaimable、Shmem
容器注意未映射 lxcfs 时看到的是宿主数值
容器替代cgroup 的 memory.current 与 memory.stat

典型使用场景

  • 内存告警判读:区分“缓存占用”与“真实可用不足”
  • 容器内存核对:确认应用看到的是宿主还是容器自身的内存数据
  • 页面响应变慢排查:区分是内存压力还是 CPU 瓶颈
  • 容量规划:用可用内存与增长趋势评估扩容时点
  • 清理策略验证:评估回收缓存后可用内存是否真的改善

对照查看

对照查看
free -h                                  # total/used/free/buff-cache/available
grep -E 'MemTotal|MemFree|MemAvailable|Cached|SReclaimable' /proc/meminfo
cat /proc/pressure/memory                 # some/full 压力指标
cat /sys/fs/cgroup/memory.current 2>/dev/null    # 容器内实际用量
cat /sys/fs/cgroup/memory.stat 2>/dev/null | head -10
sync; echo 3 | sudo tee /proc/sys/vm/drop_caches # 仅排障用,生产慎用

字段对照

字段含义判读要点
MemFree完全空闲内存偏小很正常,不代表内存不足
MemAvailable估算可分配量判断内存是否充足的首选
Cached文件内容缓存多数可回收,但含 Shmem
SReclaimable可回收 slabdentry/inode 缓存占大头
Shmemtmpfs 与共享内存属于不可随意回收的部分
drop_caches 只用于排障与验证,它会丢弃缓存并让后续请求重新从磁盘读取,生产环境频繁使用会显著拖慢业务。
没有 lxcfs 的容器里 meminfo 显示宿主数据:据此判断容器内存会得出完全错误的结论,应用侧内存限制要看 cgroup 文件。
巡检脚本用可用内存占总内存的比例做分级告警,比固定阈值更稳:不同规格的机器可以共用一套规则,也方便横向对比同类节点的水位。

易错点

  • 没有 lxcfs 的容器里 meminfo 显示宿主数据,判读容器内存要用 cgroup 文件
  • MemAvailable 是估算值,极端回收压力下实际可分配量可能更低,不能当作硬保证
  • 把 MemFree 小当作内存不足去清理缓存或扩内存,忽略了缓存本来就是可回收资源
  • 在内存告警处置里用 drop_caches 治标:它掩盖了增长来源,下次还会复现,应该定位真实占用方

数据来源与参考

  • Linux 内核 Documentation/filesystems/proc.rst
  • procps-ng 文档 free(1)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌