Linux free 与 /proc/meminfo 内存分析技巧

1次阅读

available列才是真实可用内存,它已扣除不可回收slab和难释放page cache并预估可回收量;cached和buffers是否算可用取决于具体使用场景。

Linux free 与 /proc/meminfo 内存分析技巧

free 命令输出里 cached 和 buffers 到底算不算“可用内存”

算,但得看怎么用。linuxfree 默认显示的 available 列才是你真正能指望的空闲内存——它已经扣除了内核不可回收的 slab、page cache 中难以快速释放的部分,还预估了文件缓存可回收量。而老版本(free from procps-ng available,只给 cachedbuffers,这时候直接拿它们加总当“空闲”,大概率会误判。

常见错误现象:free -h 显示 available 只有 1.2G,但 cached + buffers 加起来有 8G,于是以为系统“明明还有大量缓存没释放”,结果一跑新进程就 OOM。

  • available 是内核通过 meminfoMemAvailable: 字段直接提供的估算值,比手动加减更靠谱
  • 如果系统太老(比如 centos 6),/proc/meminfo 根本没有 MemAvailable: 行,此时只能保守参考 freefree 列(即真正未分配页框),别碰 cached
  • cached 包含 page cache 和部分 slab(如 dentries/inodes),不是全都能立刻腾出来;buffers 主要是块设备层的临时页,量通常很小

/proc/meminfo 关键字段含义与读取时机

别信 cat /proc/meminfo 一次性快照——某些字段是瞬时统计,比如 Active(file)Inactive(file) 会随页面回收周期波动;而 MemTotalMemFree 是稳定值。想准确分析内存压力,得结合多个字段交叉验证,不能只盯一个数。

使用场景:排查 Java 应用频繁 GC 却 free 显示内存充足,或容器内 RSS 暴涨但宿主机 free 看不出异常。

  • MemAvailable: 最关键,对应 freeavailable 列;缺失该行说明内核
  • Active(anon)Inactive(anon) 反映匿名页活跃度,对判断 swap 倾向很重要;SwapCached: 非零说明刚换入的页又被改写过,可能触发重复 IO
  • SReclaimable: 属于 slab 中可回收部分(如 dentry、inode 缓存),计入 cached,但 echo 2 > /proc/sys/vm/drop_caches 才能清,echo 1 不清它

free -h 输出单位混淆导致的误读

free 默认用人类可读单位(-h),但 KiB/MiB/GiB 是二进制前缀(1024 进制),而有些监控脚本硬编码 1000 进制换算,导致数值差 2.4%。更麻烦的是,free 在不同版本中对“已用内存”的计算逻辑微调过:早期把 Shmem:(tmpfs/shm)算进 used,后来版本改算进 cached ——这会影响你写告警阈值时的基准。

常见错误现象:用 awk '{print $3/$2*100}' 算 “内存使用率”,结果在 ubuntu 20.04 和 CentOS 7 上同一台机器跑出两个不同数字。

  • 永远用 free -b(字节)做自动化解析,避免单位歧义;-h 只用于人工查问题
  • used 列 = MemTotal - MemFree - Buffers - Cached - SReclaimable(近似),但内核实际算法更复杂,所以别自己手算“可用率”
  • 容器环境注意:free 显示的是宿主机视角,cgroup v2 下需看 /sys/fs/cgroup/memory.max/sys/fs/cgroup/memory.current

为什么 drop_caches 后 free 不见涨,/proc/meminfo 却变了

因为 echo 3 > /proc/sys/vm/drop_caches 只清 page cache、dentries 和 inodes,不碰 slab 中不可回收部分(如 SUnreclaim:)、不释放匿名页、也不影响 MemFree: ——它只是把 PageCacheSReclaimable: 对应的内存标记为可回收,是否立刻归还给 MemFree:,取决于内核后续有没有触发直接回收(direct reclaim)或后台回收(kswapd)。

性能影响:强制 drop 可能引发短时 IO 尖峰(尤其 echo 3 时刷脏页),且之后首次访问文件会变慢;生产环境除非调试,否则别定期 cron 它。

  • 执行后重点看 /proc/meminfoCached:SReclaimable: 是否下降,而不是盯着 freefree
  • MemFree: 不涨 ≠ 没效果;只要 MemAvailable: 上升了,说明内核已更新可回收估算
  • 如果 drop_cachesMemAvailable: 几乎不变,说明当前内存压力主要来自匿名页(Active(anon) 高)或不可回收 slab(SUnreclaim: 高),得查进程 RSS 或 slabtop

内存分析真正的难点不在读数,而在理解哪些字段反映真实压力、哪些只是历史快照。比如 MemAvailable: 是估算值,pgpgin/pgpgout 是累计 IO 量,pgmajfault 才暴露缺页代价——这些字段之间的关系,比单个数字本身更值得花时间对齐。

text=ZqhQzanResources