真实可用内存看 available 列,它才是应用能真正拿到的内存;used 包含可回收的 buffers/cache,不代表真实压力,只要 available 有数百 MB 以上即健康,需结合 ps/top 查进程级 RSS 占用进一步分析。

别信 used,也别只看 free —— 真实可用内存看 available 列,它才是应用能真正拿到的内存。
为什么 free -h 的 used 值总显得很高?
Linux 会把空闲内存自动用于 buffers 和 cache(比如文件读写缓存),这部分内存随时可被内核回收。所以 used = 实际进程占用 + buffers + cache,它反映的是“已被分配”,不是“不可释放”。
常见错误是看到 used 接近 total 就 panic,其实只要 available 还有几百 MB 以上,系统就完全健康。
free -h 输出中哪些字段必须盯住?
运行 free -h 后,重点关注以下三行:
-
Mem:行里的available—— 新进程能立即申请到的内存预估量(含可回收 cache) -
Mem:行里的buff/cache—— 当前缓存总量,数值高是常态,不是问题 -
Swap:行里的used—— 如果非零且持续增长,说明物理内存真的不够用了
如何持续监控并识别内存压力?
用 free -h -s 2 每 2 秒刷新一次,观察变化趋势:
- 若
available持续降到 si(swap in)在vmstat 2 5中 >0,则内存已实质吃紧 - 若
available波动大但始终 >1GB,而buff/cache占比超 60%,这是典型“内存被善用”,无需干预 - 不要手动执行
echo 3 > /proc/sys/vm/drop_caches来“清缓存”——这只会暂时降低buff/cache,但立刻被新 IO 填满,且可能引发 I/O 尖峰
当 available 极低时,下一步该查什么?
available 接近 0 是信号,但不是结论。此时应立刻转向进程级排查:
- 用
ps aux --sort=-%mem | head -n 10快速列出内存 Top 10 进程 - 用
top按M键排序,关注RES(实际物理内存占用)而非VIRT - 对可疑 PID,检查
cat /proc/获取真实 RSS 占用/status | grep -E "VmRSS|MMUPageSize"
注意:available 是估算值,依赖内核对可回收 cache 的判断;在容器或 cgroup 限制环境下,它的准确性会下降,这时必须结合 cgroup memory.stat 或 smem 工具交叉验证。











