跳转到内容

free

free 用于查看内存和交换区的使用情况。数据全部来自 /proc/meminfo,看懂输出的关键是分清「空闲」和「可用」不是一回事。

Terminal window
free [选项]

默认单位是 KB,日常都加 -h 不带参数只打印一次就退出

total used free shared buff/cache available
Mem: 16274808 3521104 812340 412508 11941364 11902332
Swap: 2097148 0 2097148
列 含义
total 物理内存总量
used 进程实际占用的部分
free 完全没被碰过的内存
shared tmpfs 等共享内存占用
buff/cache 内核拿去做块设备缓冲和文件页缓存的部分,需要时可以回收
available 估算「现在再起一个程序,能拿到多少内存而不动交换区」

判断内存够不够,只看 available,不看 free:

  • Linux 会主动把暂时空闲的内存全部拿去做缓存,读过的文件留在内存里下次就不用再读盘
  • 所以 free 很小是正常的,甚至是健康的,说明内存没有被闲置浪费
  • 一旦有进程要内存,内核会立刻回收 buff/cache 让出来,这部分已经算进了 available

真正的告警信号是 available 持续走低,或者 Swap 的 used 一直在涨。

选项 说明
-h 自动挑合适的单位(human)
-m / -g 固定用 MB / GB 显示
-b / -k 固定用字节 / KB 显示
-s <秒> 每隔几秒刷新一次
-c <次数> 配合 -s,刷新指定次数后退出
-t 末尾加一行 Total,把内存和交换区加总
-w 把 buff/cache 拆成 buffers 和 cache 两列(wide)

1. 日常查看

Terminal window
free -h

2. 持续观察

Terminal window
free -h -s 2 # 每 2 秒刷新,Ctrl-C 停止
free -h -s 2 -c 5 # 刷新 5 次后自动退出

排查内存泄漏时开着它,看 available 是不是单调下降

3. 脚本里只取一个数

Terminal window
free -m | awk '/^Mem:/ {print $7}'

第 7 列是 available,单位 MB 告警脚本判断阈值就用这个数,不要用 free

4. 拆开看缓冲和缓存

Terminal window
free -w -h

buffers 是块设备的缓冲,cache 是文件页缓存 日常看合计就够,排查 IO 相关问题时才需要分开

5. 数据来源

Terminal window
grep -E 'MemTotal|MemFree|MemAvailable|Buffers|^Cached|SwapTotal' /proc/meminfo

free 的每一个数字都能在这里找到出处,需要更细的项就直接读它

  • man free
  • man 5 proc(/proc/meminfo 各字段的定义)