Linux free 命令:查看内存、缓存与交换空间用量

free 用于汇总 Linux 的物理内存(RAM)和交换空间(swap)使用情况。判断是否缺内存时,应优先看 available:它估计在不进行交换的情况下还能供新程序使用多少内存,比单独看 free 列更有参考价值。

free -h

Linux 会把暂时不用的 RAM 用于文件缓存等用途,并在需要时回收其中可回收的部分。因此,free 较小而 buff/cache 较大,并不自动表示内存不足。

free 显示哪些信息?

free 读取内核提供的 /proc/meminfo,计算物理内存和交换空间指标。本文按 procps-ng free 官方手册解释;BusyBox 或旧版本的选项、列和计算方法可能不同,先用 free --version 与 free --help 核对本机实现。

free -h

下面是用于说明字段的假设输出,并非本机测量结果。单位、取整和排版会随版本而变化;这里把 used 设为约 5 GiB,以对应 total 约 15 GiB 减去 available 约 10 GiB:

               total        used        free      shared  buff/cache   available
Mem:            15Gi       5.0Gi       1.1Gi       320Mi       9.7Gi        10Gi
Swap:          2.0Gi       128Mi       1.9Gi

这些列不是互不重叠的内存分区,不能把 shared、buff/cache 等所有列直接相加。当前 used 的计算方式也不要求 used + free + buff/cache 恰好等于 total;显示值还经过取整。

理解各列的含义

total、used 和 free

列 含义 解读时的注意事项
total 可用物理内存总量 来自 MemTotal,扣除了部分保留区和内核代码,不一定等于安装的 RAM 标称容量。
used 已使用或暂不可用的内存 当前 procps-ng 按 total - available 计算物理内存的 used;旧版本定义可能不同。
free 当前未使用的内存 来自 MemFree,不包括已经用作缓存、但可能回收的内存。

shared 与 buff/cache

shared 主要反映 tmpfs 等使用的共享内存,对应 Shmem。buff/cache 合并内核缓冲、页缓存和可回收的 slab 内存;slab 是内核对象的内存管理机制,不能把它全部当作应用程序的空闲 RAM。

缓存保留读过的数据,减少再次访问磁盘的开销。缓存大本身不意味着泄漏;其中一部分可在应用需要内存时回收,但不是所有内容都能立即、无代价地释放。

为什么应优先看 available?

available 不是简单的 free + buff/cache。内核的 MemAvailable 估计会考虑空闲内存、文件页、可回收 slab 和内存区水位,还要为正常运行保留一定缓存。详细定义见内核 /proc/meminfo 文档。

老内核缺少 MemAvailable 时,procps-ng 可能模拟该值或退回其他处理;应核对本机版本。即使有该字段,它也是当前估计,不能保证任意一次大块分配、未来流量突增或特定容器中的分配一定成功。

Mem 行与 Swap 行有什么区别?

物理内存行

Mem 汇总 RAM 的总量和状态,包含应用程序、内核、缓存及共享内存等用途。它不是把所有进程 RSS 简单相加得到的应用内存总和。

交换空间行

Swap 显示交换空间的总量、已使用和剩余容量。used 非零不等于当前正在严重缺内存:以前换出的不活跃页面,可能在 RAM 重新充裕后仍保留在交换空间中。没有配置交换空间时,总量可能为 0。

如果交换空间占用持续增长,换入换出持续发生,服务响应同时恶化,就需要进一步调查。可以观察:

vmstat 1

在 procps-ng vmstat 官方手册中,si 是每秒换入量,so 是每秒换出量。首份报告中的速率通常反映开机以来的平均情况,后续才反映采样间隔;进程和内存栏则是即时信息。不要把第一行当作最近 1 秒的全部活动。

vmstat 1 每秒继续采样,按 Ctrl+C 结束。不要为了让 swap used 归零就直接关闭交换空间;应先查明工作负载和内存压力。

常用选项

使用便于阅读的单位

free -h

-h 或 --human 随数值大小自动选择 Ki、Mi、Gi 等二进制单位。希望固定单位时,可分别使用 -m 与 -g:

free -m
free -g

-m 表示 MiB,-g 表示 GiB,不是十进制 MB、GB。小数可能被取整,例如不足 1 GiB 的用量在固定 GiB 显示下可能看起来很小甚至为 0;不要据此推断完全没有占用。

分别查看 buffers 与 cache

free --wide

-w 或 --wide 把 buff/cache 拆成 buffers 和 cache 两列。需要深入分析时,再结合 /proc/meminfo 和 slabtop 等工具;宽表输出不会自动指出哪个进程造成压力。

按间隔重复显示

free -h -s 2

-s 2 持续按约 2 秒间隔显示,按 Ctrl+C 停止。需要输出指定次数后自动结束,可结合 -c:

free -h -s 2 -c 5

这表示共显示 5 次,不是“先显示一次再额外显示 5 次”。它用于观察短时变化;保存历史曲线和告警应交给监控系统。

增加 RAM 与交换空间合计

free -h --total

-t 或 --total 增加显示列合计的一行。RAM 与交换空间的性能和用途不同,合计值不能当作等量的高速内存,也不是应用程序可立即分配量的保证。

如何判断是否真的缺内存?

同时观察 available 与换入换出

比起一次截图,应把同一时间范围内的以下信号结合起来:

  • available 是否持续低于平时的水平。
  • 交换空间占用是否增加。
  • vmstat 的 si、so 是否在后续采样中持续出现。
  • 服务延迟、错误和磁盘 I/O 是否同时恶化。
  • 内核日志中是否出现 OOM(Out of Memory,内存不足)及终止进程的记录。

以下命令按需分别运行;第二条会持续采样,按 Ctrl+C 结束后,再执行日志查询,不能把它们当作自动跑完的批处理:

free -h
vmstat 1
journalctl -k -g 'oom|Out of memory|Killed process'

journalctl 官方手册说明 -g 使用 Perl 兼容正则表达式,多个候选词之间使用不加反斜杠的 |。该选项需要支持它的 systemd 版本;模式包含大写字母时默认区分大小写,可能漏掉其他写法。

-k 通常限定当前启动的内核消息;日志留存、权限、发行版和 OOM 的发生范围也影响结果。没有匹配记录不能证明从未发生 OOM。分页器中按 q 退出;只读查询本身不会终止任何进程。

查找占用较多内存的进程

安装了 procps ps 的 Linux 系统可按 RSS 从大到小排序:

ps -eo pid,user,%mem,rss,comm --sort=-rss | head

RSS 是常驻内存集大小,表示进程当前驻留在 RAM 中的内存,procps ps 的 rss 通常以 KiB 显示。这个命令按 RSS 排序,而不是按输出中的 %MEM 字段排序。head 默认最多保留 10 行,其中包含表头,不能理解为一定显示 10 个进程。

共享页可能出现在多个进程的 RSS 中,直接相加会重复计算;RSS 也不是进程的全部虚拟地址空间。分析共享库、文件映射或容器时,应结合相应的 cgroup 指标,必要时采用按比例分摊共享页的 PSS(Proportional Set Size)工具,例如 smem。不要只因排名靠前就结束进程。

不要为了数字好看而强制清缓存

页缓存由内核管理,用于提高访问速度。强制清除可能增加后续磁盘读取、导致延迟,并不能修复应用内存泄漏。日常排查先查看趋势和工作负载,不把清缓存当作通用处理;只有明确的可重复性能测试,才应在理解影响后另行设计操作。

单位与自动化的注意事项

二进制单位与十进制单位

默认 -h 采用 1024 为基数的 KiB、MiB、GiB 系列;加上 --si 则改用 1000 为基数的 kB、MB、GB 系列:

free -h --si

例如 1 GiB 是 1,073,741,824 字节,1 GB 是 1,000,000,000 字节。对比监控面板或容量规划时必须统一单位;这里改变的是显示方式,不会改变真实内存容量。

不要直接解析人类可读字符串

free 的列、计算方法、语言环境和取整会影响显示,-h 的自动缩放也不适合按固定列写脚本。自动化优先读取 /proc/meminfo 的所需字段,或使用监控代理的结构化指标,并明确单位、版本与采样范围。

/proc/meminfo 里标为 kB 的传统内存数值实际以 1024 字节为单位,不能按十进制直接换算。字段可能随内核变化,应按字段名解析并处理缺失值,不能假定每台机器都出现相同字段或固定行号。

为什么容器中的 free 值可能很大?

free 读取 /proc/meminfo,具体内容取决于容器运行时和挂载方式。有时它反映宿主机范围,而不是该容器能使用的内存上限;也有环境对该文件做了容器化处理,因此应先确认指标来源。

判断容器容量时,需要结合编排平台的请求与限制、所属 cgroup 的当前用量、有效上限及 OOM 事件。在 cgroup v2 内核文档中,memory.current 表示该组及后代的当前用量,memory.max 是硬限制,memory.events 记录包括 oom 与 oom_kill 在内的事件。v1 接口不同,不应混用名称。

应定位到该容器实际所属的 cgroup,再只读查看对应指标;祖先组的限制也可能影响它。memory.max 显示 max 不表示整台机器拥有无限内存;“上限减当前用量”也不能代替完整的可分配量估计。宿主机 available 尚多时,容器仍可能因自身限制触发 OOM。

常见问答

free 几乎为 0 就表示内存不足吗?

不一定。Linux 把闲置 RAM 用于缓存时,free 可以很小。应同时查看 available、换入换出、服务延迟与趋势。

buff/cache 全部都可以立即回收吗?

不是。部分缓存和 slab 可以回收,但并非全部都能立即释放。available 已考虑这类差异,不要再把整个 buff/cache 直接加上去。

使用交换空间一定表示 RAM 不够吗?

不一定。过去换出的不活跃页可能仍留在交换空间。应结合占用增长、当前 si/so 与服务性能,区分过去的占用和当前的压力。

为什么 used 与其他工具显示不同?

不同工具和版本对缓存、可回收内存及统计范围的定义可能不同。比较同一时刻的 /proc/meminfo、procps-ng 版本和字段定义,不要把不同范围的数字直接相减。

判断时的要点

free -h 是快速了解 RAM 与交换空间的起点。是否缺内存,应结合 available、换入换出、进程占用和服务延迟;不要只凭 free 一列做决定。负载同时升高时,可参照中文 uptime 平均负载说明,继续区分 CPU 与 I/O 等其他瓶颈。