free 深入:available 与 buff/cache 怎么看够不够
更新时间:2026-09-19。新手最常见的误判:
free一看buff/cache占了大半、free 很少,就以为内存快爆了。实际上 Linux 会把空闲内存拿来做文件缓存,需要时可回收,判断够不够看available,不是free。
一、输出逐列解读
bash
free -h # 人类可读单位
free -m -s 2 # 以 MB 显示,每 2 秒刷新
free -w -h # 把 buffers 和 cache 分开列bash
total used free shared buff/cache available
Mem: 15Gi 6.1Gi 1.2Gi 0.2Gi 8.0Gi 8.4Gi
Swap: 2.0Gi 0.1Gi| 列 | 含义 |
|---|---|
| total | 物理内存总量 |
| used | 已用(约 = total - free - buff/cache,新版口径) |
| free | 完全空闲(通常很小,正常) |
| shared | tmpfs/共享内存 |
| buff/cache | 块缓冲 + 页缓存/slab,大部分可回收 |
| available | 在不动 swap 的前提下,应用实际还能申请到的内存估算 |
available 已经替你估算了「buff/cache 里有多少能在需要时回收」,所以:available 充足(比如还剩 15%+)就不用担心,哪怕 free 很小。
二、为什么缓存占内存是好事
- 读磁盘是毫秒级,读内存是纳秒级。内核把读过的文件内容放进 page cache,下次直接命中内存。
- 这些内核对应用是「借用」:一旦应用需要,干净的文件页可以直接丢弃回收(再次需要从磁盘读),脏页 writeback 后回收。
- 所以
free小、cache大是健康状态,强行清空反而降低性能(见 drop_caches)。
三、什么才是真紧张
按以下信号综合判断,而不是看 free:
- available 持续很低且下降(如 < 总量的 5%~10%)。
- swap 使用持续增长、si/so 不为 0(vmstat 看换入换出)。
- OOM、dmesg 出现 Out of memory、Killed process。
- 回收压力:
/proc/pressure/memory(PSI)some/avg 上升,major fault 增多。 - 应用匿名内存(堆)持续增长不回落——这才像泄漏,配合 pmap/jmap 定位。
区分两类占用:
bash
文件页(file-backed,cache):可丢弃/可回写,回收代价低 ← buff/cache 大头
匿名页(anonymous,堆/栈/mmap):不能直接丢,紧张时只能 swap 或触发 OOM ← 真泄漏看这里bash
grep -E 'MemAvailable|Cached|AnonPages|SReclaimable|SwapFree' /proc/meminfo
cat /proc/pressure/memory # PSI 内存压力(较新内核)四、Swap 与 OOM 的关系
- 有少量 swap 使用不一定是问题(冷页被换出),但频繁换入换出(swap thrashing)会导致明显延迟。
- 容器/云主机常禁用 swap,此时 available 触底会更直接地触发 OOM Killer。
- JVM 等托管运行时要靠 容器内存限制 设对堆上限,否则堆+堆外+页缓存叠加会被 cgroup OOMKill。
五、常见误判对照
| 现象 | 错误结论 | 实际 |
|---|---|---|
| free 很小 | 内存不足 | 正常,内存被用作缓存 |
| buff/cache 很大 | 泄漏/需要清理 | 可回收,看 available |
| available 大但 used 高 | 要加内存 | 不用,应用与缓存各司其职 |
| available 低 + AnonPages 一直涨 + OOM | 缓存问题 | 多为应用/堆外泄漏 |
| si/so 长期非零、机器卡 | 正常换页 | 内存真不足或超额超卖 |
坑
- 用 free 列判断容量,频繁做「内存清理」,把性能优化做成性能劣化。
- 把可用内存和 buff/cache 对立,忽略 available 已包含可回收估算。
- 只看某一瞬间,内存泄漏要看 AnonPages/available 的趋势是否单调变化。
- 容器内 free 显示宿主资源,判断容器限额要看 cgroup(memory.current/memory.max)而非宿主 free。
总结
free 输出里 free 小、buff/cache 大是 Linux 主动用空闲内存做文件缓存的健康表现,这些文件页在需要时可低代价回收;真正反映应用还能用多少的是 available 列,内存是否吃紧应结合 available 趋势、vmstat 的 si/so、PSI 回收压力和 OOM 日志判断,并重点看不能直接丢弃的匿名页增长以识别泄漏;容器场景还要以 cgroup 限额而非宿主 free 为准。