free显示内存静态快照,重点关注available而非free;vmstat反映动态趋势,重点监控si/so是否持续非零;两者结合可准确判断内存压力。

Linux中查看内存使用情况,free 和 vmstat 是两个最常用且互补的命令。它们侧重点不同:free 侧重当前内存快照,vmstat 侧重内存与系统资源(CPU、IO、换页)的动态变化趋势。
free:看内存总量、已用、空闲及缓存/缓冲区分布
free 显示的是内存的静态快照,单位默认为 KiB,加 -h 参数可自动换算为易读单位(如 MiB、GiB)。关键字段含义如下:
- total:物理内存总容量
- used:被内核、进程、缓存等占用的内存(含 cache/buffer)
- free:真正未被使用的物理内存(通常很小,Linux 倾向于用空闲内存做缓存)
- shared:tmpfs 使用的内存(如 /dev/shm)
- buff/cache:缓冲区(buffer)+ 页面缓存(cache)之和,这部分内存可被快速回收供应用使用
- available:估算出的“当前可供新进程使用的内存”,比 free 更具参考价值(考虑了可回收 cache 和部分 slab)
建议日常排查优先看 available 而非 free;若 available 持续接近 0,才说明内存真正紧张。运行 free -h -w 可分开显示 buffer 和 cache(-w 参数需较新版本支持)。
vmstat:看内存压力下的动态行为(换页、IO、CPU)
vmstat 默认输出一行统计摘要,加参数可周期刷新(如 vmstat 2 表示每 2 秒刷新一次)。与内存相关的核心列有:
- swpd:已使用的 swap 空间大小(KiB),非零且持续增长说明物理内存不足,开始换出页面
- free:空闲内存(同 free 命令中的 free 字段)
- buff:用于块设备缓冲的内存
- cache:页面缓存大小
- si(swap-in):每秒从 swap 读入内存的数据量(KiB),值大说明频繁换入,系统响应可能变慢
- so(swap-out):每秒写入 swap 的数据量(KiB),持续非零是内存严重不足的明确信号
重点关注 si/so 是否长期非零。若 so > 0 且持续存在,即使 free 或 available 看似不低,也可能是内核在主动回收缓存并换出匿名页(如进程堆内存),此时应结合 top 或 ps 查找高 RSS 进程。
两者配合使用的典型场景
- 发现系统变慢 → 先跑 free -h,看 available 是否极低;再运行 vmstat 1 观察 si/so 是否飙升
- free 显示 used 高但 available 也高 → 属正常,多数是 cache 占用,无需干预
- vmstat 中 so 持续 > 0,但 free 输出里 swpd 为 0 → 可能是 vm.swappiness 设为 0 且系统启用了 zram 或压缩交换,需进一步查 cat /proc/swaps 和 zramctl
- cache 值巨大且稳定,si/so 为 0 → 表明内存充足,Linux 正有效利用空闲内存加速磁盘访问
一点提醒:别被 “used” 吓到
Linux 的内存管理机制决定了 used 高 ≠ 内存不足。只要 available 充足、si/so ≈ 0、swpd = 0,即使 used 占 90%,也只是 cache 和 buffer 在起作用,属于健康状态。盲目清缓存(如 echo 3 > /proc/sys/vm/drop_caches)反而会降低性能。










