首页 > Sysadmin > 正文

Linux 查看内存占用与释放缓存实战

huyuanwen 2026-10-30 Sysadmin

Linux 查看内存占用与释放缓存:free、vmstat、/proc/meminfo 三把尺子,实测 WSL2 上的 drop_caches。

一、先看 free:一行拿到总览

free -h

实测输出:

               total        used        free      shared  buff/cache   available
Mem:           7.6Gi       586Mi       6.7Gi       3.5Mi       466Mi       7.0Gi
Swap:          2.0Gi          0B       2.0Gi

各列含义:total 是 MemTotal,used = total – free – buff/cache,available 是系统估计可给新进程用的内存(含可回收 cache)[1]。查内存时容易误把 6.7Gi 的 free 当成”只用了 586Mi”——其实 used 不算 buff/cache,466Mi 才是被内核占用的缓存;看真实内存压力要看 available,WSL2 实测这里显示 7.0Gi。

二、字段级明细:vmstat -s 与 /proc/meminfo

vmstat -s

输出按总量/已用/空闲分组,前几行直接给出 total memory、used memory、free memory、buffer memory、swap cache、total swap [2]。实测头 20 行里 buffer 约 58Mi、cache 约 418Mi,和 free 的 buff/cache 列对得上。

要拿到每一个字段,直接读内核导出的文件:

grep -E "^(MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree):" /proc/meminfo

/proc/meminfo 是 free 和 top 的共同数据源;Cached 对应 page cache 加 reclaimable slab,Buffers 是块设备缓冲区 [3]。WSL2 实测:Cached 392812kB,Buffers 58536kB。

三、top 实时看内存

top -b -n1

批处理模式下 -b 只出一行快照,加 -n1 不循环;输出里 MiB Mem 行和 free 同源,但多了每个进程的 %MEM、RES(常驻集)、VIRT(虚拟内存)。WSL2 实测:RES 最大的进程是 systemd(12792 KiB),和 ps 一致。

四、释放缓存:echo 3 > /proc/sys/vm/drop_caches

sync && echo 3 > /proc/sys/vm/drop_caches

内核官方文档说明:/proc/sys/vm/drop_caches 写 1 释放 page cache,2 释放 slab,3 同时释放;写操作只释放可回收对象,不会丢 dirty 页(所以先 sync 是常规做法)[4]。WSL2 实测执行前后对比:buff/cache 从 462MiB 降到 181MiB,Cached 从 392812kB 降到 155788kB,可用内存变化不大(因为 drop 前 available 已经 7.0Gi)。

五、排错速查

现象 原因 处理
free 和 top 数字对不上 top 单位是 MiB,free 默认 KiB;free -h 已统一 统一用 free -h 或 top 的 MiB
available 远小于 free page cache 可回收部分还没被纳入 看 available 不看 free
drop_caches 后可用内存没变 可用内存本来就很充足,cache 已压缩 正常现象,不是没生效
slabtop 报错 WSL2 内核限制,Unable to create slabinfo structure 用 vmstat -s 或 /proc/meminfo 代替
echo 3 卡住 大缓存机器上同步 + 回收需要时间 等,或先 echo 1 / 2 分步释放

六、撤销与安全

读 free、top、vmstat、/proc 都不改状态,无需回滚。drop_caches 是只写 sysctl,执行一次释放一次,不持久生效;不放心可以刷新缓存:多跑几次 dd if=/dev/zero of=/tmp/test bs=1M count=1024 再读 free,页缓存会自动回升。

局限性

全部实测在 WSL2(Ubuntu 24.04.4、内核 6.6.114.1-microsoft-standard-WSL2)完成;slabtop 在该环境报 Numerical result out of range 未能验证;RPM 系发行版的包名、cgroup v2 对内存统计的影响仅文档口径;生产环境 drop_caches 前请确认应用 dirty 页策略。

实测记录

  • 测试机:WSL2 Ubuntu 24.04.4 LTS、内核 6.6.114.1-microsoft-standard-WSL2;procps 3.3.17、util-linux 2.40;2026-10-30 root 执行。
  • free:Mem 7.6Gi total / 586Mi used / 6.7Gi free / 466Mi buff-cache / 7.0Gi available;Swap 2.0Gi unused。
  • vmstat -s:total memory 7980084K、used memory 601320K、free memory 7057872K、buffer memory 58536K、swap cache 418948K。
  • /proc/meminfo:MemTotal 7980084kB、MemFree 7057368kB、MemAvailable 7378504kB、Buffers 58536kB、Cached 392812kB、SwapTotal 2097152kB、SwapFree 2097152kB。
  • top -b -n1:MiB Mem 7793.1 total / 614.1 used / 239.8 buff/cache / 7179.0 avail。
  • drop_caches:sync 后 echo 3;前 Cached 392812kB / Buffers 58536kB,后 Cached 155788kB / Buffers 5844kB;Swap 全程未使用。
  • 未验证:slabtop、RPM 系表现、容器 cgroup 内存统计差异。

参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。