free 是什么
free 读取 /proc/meminfo,把物理内存与交换空间的使用情况汇总成两行。看懂它需要一个前提:Linux 会把暂时用不到的内存拿去做页缓存与缓冲区,这些内存在应用需要时会被快速回收,所以 free 列小是正常现象,不代表内存紧张。内核为此专门提供 available 列,表示在不触发交换的前提下还能提供给新应用的估算值,判断内存是否充足应看它。
基本信息
| 适用平台 | Linux 全发行版与 macOS(procps-ng / BSD free);字段名称与含义略有差异 |
|---|---|
| 命令语法 | free [选项] |
| 常用选项 | -h 人类可读、-m/-g 指定单位、-w 分开显示 buffers 与 cache、-s 间隔秒数、-c 采样次数、-t 加总计行 |
| 数据来源 | /proc/meminfo 中的 MemTotal、MemFree、MemAvailable、Buffers、Cached、SwapTotal、SwapFree |
| 权限要求 | 无特殊要求 |
典型使用场景
- 容量规划:确认机器内存余量与业务增长空间
- 排查性能下降:判断是否因内存不足导致频繁换页或触发 OOM
- 验证缓存收益:观察 buff/cache 的增长,理解应用读取为何在二次访问时变快
- 发布前后对比:记录 available 变化,识别新版本是否显著吃内存
- 确认 swap 使用:结合换入换出速率判断交换是否真的在拖慢系统
- 容器与宿主的区分:了解容器内读到的内存口径,避免误判
常用示例
常用示例
free -h
free -m
free -w # 分开 buff 与 cache 列
free -h -s 5 -c 3 # 每 5 秒采一次,共 3 次
free -ht # 附加总计行
cat /proc/meminfo | head -n 12
vmstat 1 5 # 看 si/so 判断是否在换页
awk '/MemAvailable/{printf "available=%.1f GiB\n", $2/1048576}' /proc/meminfo字段读法
| 字段 | 含义 | 判断 |
|---|---|---|
| total | 物理内存总量 | 与规格核对,宿主机预留会使其略小于标称值 |
| used | 已用内存,等于 total 减去 free 与 buff/cache | 单看它容易高估真实压力 |
| free | 完全未被使用的内存 | 数值小是常态,缓存占用了闲置内存 |
| buff/cache | 缓冲区与页缓存,属可回收部分 | 应用需要时会被释放,不是泄漏 |
| available | 在不触发交换的前提下可提供的估算内存 | 判断内存是否紧张看这一列 |
| Swap used | 交换分区已使用量 | 结合 si/so 速率看,静态数值参考意义有限 |
内存紧张的可靠信号不是 free 小,而是这些组合:available 逼近 0、vmstat 里 si/so 持续非零(正在换入换出)、kswapd 占用明显 CPU、日志里出现 OOM killer 击杀记录。只看 free 一列会得出「内存不够」的错误结论。
swap 的使用量本身不是问题,频繁换入换出才是。传统磁盘上换页会带来毫秒级延迟,容易拖垮对延迟敏感的进程;若机器长期大量使用 swap,应先看业务是否存在内存峰值,再考虑扩容或调整 vm.swappiness。
容器内执行 free 通常读到的是宿主机的内存,因为 /proc/meminfo 并不按容器隔离;除非宿主做了 lxcfs 之类的伪装。判断容器自身内存用量应看 cgroup 指标,例如 memory.current、memory.max 与 memory.stat(v2 统一挂载在 /sys/fs/cgroup 下)。
判断是否真的在换页:vmstat 1 输出的 si 与 so 两列是最直接的证据,也可以看 /proc/vmstat 里 pswpin 与 pswpout 的累计值。如果 si 与 so 长期为 0,而 Swap used 不为 0,说明那些页是很久以前换出、之后一直未被访问的,不必紧张。
口径差异要留意:free 的 used 不包含 buff/cache,而部分监控面板或 top 的统计方式会把缓存计入已用,两类数字对不上时先确认统计口径,跨机器比较内存占用应统一使用同一条命令与参数。