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 内存统计差异。
参考资料
- [1] free(1) – Linux manual page (man7.org)(free(1) 手册页)
- [2] vmstat(8) – Linux manual page (man7.org)(vmstat(8) 手册页)
- [3] proc(5) – Debian bookworm 手册页(proc(5) 手册页)
- [4] Documentation for /proc/sys/vm/ — The Linux Kernel documentation(kernel.org vm 文档)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。