free -h 中应关注 available 而非 free 列,available 才是新进程可立即申请的内存;MemAvailable 是 /proc/meminfo 中对应指标,反映真实可用内存。

看 free -h 时,别再盯着 free 列了
很多人一执行 free -h 就先扫 free 那一栏,以为“空闲多少就还能用多少”——这是最大误区。Linux 的 free 字段只代表完全没被任何东西占用的原始空闲内存,而现代内核会把大量空闲内存用于 buff/cache(块设备缓冲 + 文件页缓存),这部分在应用需要时能秒级回收。
-
available才是真正该盯死的指标:它 =free+ 可回收的cache+ 部分buff,代表新进程能立刻申请到的物理内存 - 当
available持续低于总内存的 10%~15%,系统已进入内存压力区;低于 5% 时,si/so(swap 换入换出)大概率开始飙升 -
Swap used不为 0 ≠ 立刻有问题,但若持续 >20%(尤其so > 0且波动频繁),说明物理内存长期吃紧,不是“偶尔换页”,而是“被迫抖动”
用 top 定位“真·吃内存进程”,别只看 %MEM
%MEM 是进程常驻内存(RSS)占物理内存的百分比,但它不区分共享内存(比如多个 Java 进程共用的 JVM 共享库),容易高估单个进程实际开销。更准的做法是结合排序+字段补充判断:
- 运行
top后按M键,按内存使用量降序排列 - 关注
RES(常驻内存,单位 KB)和VIRT(虚拟内存总量):若VIRT极大但RES很小,可能是 mmap 映射了大文件,未必真占物理内存 - 对容器或微服务环境,
top默认看不到 cgroup 限制,此时ps aux --sort=-%mem | head -10更稳,或改用smem -s rss(需安装)——它用 PSS 算法平摊共享内存,结果更贴近真实资源归属
vmstat 1 里的 si/so 是内存是否“喘不过气”的脉搏
vmstat 1 每秒输出一行,其中 si(swap in)和 so(swap out)是判断内存是否濒临崩溃的关键信号。它们不是“用了 swap 就糟”,而是“换页频率是否异常”:
- 健康状态:
si和so应长期为 0,或偶发 ≤10(单位:KB/s) - 危险信号:
so > 0且持续 >50 KB/s,尤其伴随free缓慢下降、available贴近 0 —— 这是 OOM Killer 启动前的典型征兆 - 注意陷阱:
vmstat第一行是开机平均值,无参考价值;务必看第二行起的实时值,Ctrl+C 停止后取最后几行趋势比单次值更有意义
查 /proc/meminfo 前,先搞清 MemAvailable 和 MemFree 的本质区别
直接 cat /proc/meminfo | grep -E '^(MemTotal|MemFree|MemAvailable|Buffers|Cached|Swap)' 能绕过命令行工具的格式化干扰,看到最原始数据。但必须理解字段含义,否则反而误判:
-
MemFree:内核认为“完全没人碰过”的内存页,数值通常极小(几十 MB),不能反映可用性 -
MemAvailable:内核估算的、可立即分配给新进程的内存,已扣除不可回收的 slab、page cache 中的脏页等,是free -h中available字段的源头 -
Cached包含 page cache(文件读缓存),Buffers是块设备 I/O 缓冲,两者都可被紧急回收;但若Dirty(待写回磁盘的脏页)占比过高(如 >20% ofCached),回收会变慢甚至阻塞
cat /proc/meminfo | grep -E '^(MemTotal|MemFree|MemAvailable|Cached|Buffers|Dirty|Swap)'
复杂点在于:内核从 4.12 开始优化了 MemAvailable 计算逻辑,老版本(如 CentOS 7 默认内核)可能低估可用内存;若发现 available 明显低于预期,先确认内核版本:uname -r,再查对应文档。










