free
free 用于查看内存和交换区的使用情况。数据全部来自 /proc/meminfo,看懂输出的关键是分清「空闲」和「可用」不是一回事。
free [选项]默认单位是 KB,日常都加
-h不带参数只打印一次就退出
total used free shared buff/cache availableMem: 16274808 3521104 812340 412508 11941364 11902332Swap: 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. 日常查看
free -h2. 持续观察
free -h -s 2 # 每 2 秒刷新,Ctrl-C 停止free -h -s 2 -c 5 # 刷新 5 次后自动退出排查内存泄漏时开着它,看 available 是不是单调下降
3. 脚本里只取一个数
free -m | awk '/^Mem:/ {print $7}'第 7 列是 available,单位 MB 告警脚本判断阈值就用这个数,不要用 free
4. 拆开看缓冲和缓存
free -w -hbuffers 是块设备的缓冲,cache 是文件页缓存 日常看合计就够,排查 IO 相关问题时才需要分开
5. 数据来源
grep -E 'MemTotal|MemFree|MemAvailable|Buffers|^Cached|SwapTotal' /proc/meminfofree 的每一个数字都能在这里找到出处,需要更细的项就直接读它
man freeman 5 proc(/proc/meminfo各字段的定义)