free 命令详解与参数实测(Ubuntu 22.04)

free 命令逐参数实测详解:默认输出逐列解读与 /proc/meminfo 逐字段对账、-b/-k/-m/-g/-h 与 --kilo/--mega/--si 两套单位族、-t 汇总行、-w 宽版、-l 低高水位、-s/-c 连续采样,并以 1G 文件页面缓存灌入与删除实验讲透 available 与 free 的区别,全部回显在 Ubuntu 22.04(procps-ng 3.3.17)实测通过。

Linux命令Linux系统UbuntuUbuntu 22.04命令行系统信息2026/10/15

free 命令详解与参数实测(Ubuntu 22.04)

目标:全面掌握 free 的每一个参数——默认输出逐列解读、-b/-k/-m/-g/-h 二进制单位族与 --kilo/--mega/--si 十进制单位族、-t 汇总行、-w 宽版、-l 低高水位、-s/-c 连续采样,并用 1G 文件页面缓存灌入与删除实验讲透 available 与 free 的区别、buff/cache 的构成与去向,全部命令与回显已在 Ubuntu 22.04(procps-ng 3.3.17)实测通过。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • free 版本:procps-ng 3.3.17(free --version 实测)
  • free 属于 procps 软件包,Ubuntu 22.04 默认预装
  • 实测机器内存:40 GiB(total 41027992 KiB),已启用 2 GiB swap 文件(/swapfile,已用约 1.5 GiB)
  • 演示数据:/root/demo/free/bigfile(1 GiB 测试文件,用于页面缓存灌入实验,实验后删除)

二、命令概览

2.1 语法与测试数据准备

free 的语法为 free [options],不接收位置参数。它每秒级刷新读取一次 /proc/meminfo,把内核的内存统计翻译成 Mem 与 Swap 两行人类可读的表格,是内存巡检的第一入口。

本文的对比实验基于一个 1 GiB 的演示文件(页面缓存灌入用):

dd if=/dev/zero of=/root/demo/free/bigfile bs=1M count=1024 status=none && ls -lh /root/demo/free/bigfile
-rw-r--r-- 1 root root 1.0G Oct 15 14:22 /root/demo/free/bigfile

2.2 --help 全量输出

free --help 输出全部参数清单(逐行照抄实测回显,可作为参数速查):

free --help

Usage:
 free [options]

Options:
 -b, --bytes         show output in bytes
     --kilo          show output in kilobytes
     --mega          show output in megabytes
     --giga          show output in gigabytes
     --tera          show output in terabytes
     --peta          show output in petabytes
 -k, --kibi          show output in kibibytes
 -m, --mebi          show output in mebibytes
 -g, --gibi          show output in gibibytes
     --tebi          show output in tebibytes
     --pebi          show output in pebibytes
 -h, --human         show human-readable output
     --si            use powers of 1000 not 1024
 -l, --lohi          show detailed low and high memory statistics
 -t, --total         show total for RAM + swap
 -s N, --seconds N   repeat printing every N seconds
 -c N, --count N     repeat printing N times, then exit
 -w, --wide          wide output

     --help     display this help and exit
 -V, --version  output version information and exit

For more details see free(1).

💡 技术拓展:free 的单位参数其实有两套体系,横向对比——

体系换算基数选项对应 SI 名称
二进制(IEC)1024-b/-k/-m/-g/--tebi/--pebi/-hKiB、MiB、GiB
十进制(SI)1000--kilo/--mega/--giga/--tera/--peta、-h --siKB、MB、GB

40 GiB 内存换算成 SI 口径是 42 GB,两套体系相差 2.4%。巡检脚本对账外部监控数据(常按十进制上报)时尤其要分清,本文 3.2、3.3 分别实测。

参数速查表:

参数作用
-b / -k / -m / -g以字节 / KiB / MiB / GiB 显示(均按 1024 换算)
--kilo / --mega / --giga 等以 KB / MB / GB 显示(按 1000 换算)
-h人类可读(自动选最大合适单位,默认按 1024)
--si配合 -h 改用 1000 进制
-l显示低/高内存水位明细
-t末尾追加 Mem + Swap 的 Total 行
-s N每 N 秒重复输出
-c N连续输出 N 次后退出(配合 -s)
-w宽版:把 buff/cache 拆分为 buffers 与 cache 两列

2.3 版本信息

free --version
free from procps-ng 3.3.17
free -V
free from procps-ng 3.3.17

--version 与 -V 等价。

三、参数逐项实测

3.1 默认输出(KiB)——逐列解读

无参数的 free 输出两行表格:

free
               total        used        free      shared  buff/cache   available
Mem:        41027992     7001728      542848       66856    33483416    33346960
Swap:        2097148     1577396      519752

两个要点:其一,本版本(3.3.17)默认单位是 KiB,输出中没有任何单位提示行,第一眼要看数量级;其二,各列含义如下:

列实测值(KiB)含义
total41027992物理内存总量(约 39 GiB)
used7001728已用内存 = total − free − buff/cache
free542848完全未被使用的内存(不等于可用内存,见 3.8)
shared66856共享内存(tmpfs、共享内存段等,来自 meminfo 的 Shmem)
buff/cache33483416页面缓存(读缓存页,可回收,构成见 3.9)
available33346960启动新进程而不发生 swapping 的估算可用内存,判断内存够不够看它
Swap 行2097148 / 1577396 / 519752swap 总量 / 已用 / 空闲

used 列的计算关系可用实测数值验证:41027992 − 542848 − 33483416 = 7001728,与 used 完全一致。

与 /proc/meminfo 的对账:free 的所有数值都来自 /proc/meminfo,用 -k(同为 KiB)对账应逐字段相等:

free -k
               total        used        free      shared  buff/cache   available
Mem:        41027992     7001728      542848       66856    33483416    33346960
Swap:        2097148     1577396      519752
grep -E 'MemTotal|MemFree|MemAvailable|Buffers|^Cached|SReclaimable|Shmem|SwapTotal|SwapFree|SwapCached' /proc/meminfo
MemTotal:       41027992 kB
MemFree:          542848 kB
MemAvailable:   33346960 kB
Buffers:          855924 kB
Cached:         29727452 kB
SwapCached:        42036 kB
SwapTotal:       2097148 kB
SwapFree:         519752 kB
Shmem:             66856 kB
SReclaimable:    2900040 kB

对照结果(同一时刻采样,逐字段相等):total=MemTotal、free=MemFree、available=MemAvailable、shared=Shmem、Swap 行三项=SwapTotal/(SwapTotal−SwapFree)/SwapFree。实测确认 free 没有"加工"数据,排障时可以放心用它定位 meminfo 原始字段。

3.2 -b / -k / -m / -g / -h:二进制单位族

五个选项都按 1024 换算,只是粒度不同:

free -b | head -2
               total        used        free      shared  buff/cache   available
Mem:     42012663808  7169765376   555876352    68460544 34287022080 34147291136
free -k
               total        used        free      shared  buff/cache   available
Mem:        41027992     7001724      542848       66856    33483420    33346964
Swap:        2097148     1577396      519752
free -m
               total        used        free      shared  buff/cache   available
Mem:           40066        6838         529          65       32698       32564
Swap:           2047        1540         507
free -g
               total        used        free      shared  buff/cache   available
Mem:              39           6           0           0          31          31
Swap:              1           1           0
free -h
               total        used        free      shared  buff/cache   available
Mem:            39Gi       6.7Gi       529Mi        65Mi        31Gi        31Gi
Swap:          2.0Gi       1.5Gi       507Mi

实测要点:

  • -b 是字节数(42 012 663 808),适合脚本做精确算术;-k 与默认输出完全相同(默认即 KiB);-m(MiB)是最常用的巡检粒度;
  • -g 粒度太粗:free 列只有 529 MiB,被截成 0——小于 1 GiB 的数值显示为 0,容易误判为"内存耗尽",巡检慎用;
  • -h 自动选择单位(Gi/Mi/M 后缀),最适合人看,脚本取数则用 -m/-k/-b。

3.3 --kilo / --mega / --si:十进制单位族

十进制族按 1000 换算:

free --kilo
               total        used        free      shared  buff/cache   available
Mem:        42012663     7022084     2185154       68476    32805425    34294939
Swap:        2147479     1625272      522207
free --mega
               total        used        free      shared  buff/cache   available
Mem:           42012        7022        2185          68       32805       34294
Swap:           2147        1625         522

注意 total=42012663 KB(十进制)与 -k 的 41027992 KiB 是同一块内存的两种口径,相差约 2.4%(1024³/1000³ 换算)。

--si 表示"换算基数改用 1000",但它只影响 -h 的自动换算——单独使用时输出与默认 KiB 一致(实测确认无效),必须配合 -h:

free -h --si
               total        used        free      shared  buff/cache   available
Mem:             40G        6.6G        2.1G         65M         31G         32G
Swap:           2.0G        1.5G        498M

与 3.2 的 free -h 对比:39Gi(二进制)变成了 40G(十进制),后缀也从 Gi 变成 G。对外披露容量(如工单、采购单)建议用十进制口径,与硬件厂商一致。

3.4 -t(--total):追加 Mem + Swap 汇总行

free -h -t
               total        used        free      shared  buff/cache   available
Mem:            39Gi       6.7Gi       529Mi        65Mi        31Gi        31Gi
Swap:          2.0Gi       1.5Gi       507Mi
Total:          41Gi       8.2Gi       1.0Gi

Total 行 = Mem 行 + Swap 行(41 ≈ 39 + 2,8.2 ≈ 6.7 + 1.5),适合一眼评估"内存 + 交换空间"的总盘子和实际压力(used 8.2 GiB / 41 GiB)。注意 available 列在 Total 行为空——swap 没有 available 的估算值,无法相加。

3.5 -w(--wide):宽版拆分 buffers 与 cache

free -w
               total        used        free      shared     buffers       cache   available
Mem:        41027992     7002500      542028       66860      855924    32627540    33346184
Swap:        2097148     1577396      519752
free -h -w
               total        used        free      shared     buffers       cache   available
Mem:            39Gi       6.7Gi       529Mi        65Mi       835Mi        31Gi        31Gi
Swap:          2.0Gi       1.5Gi       507Mi

默认输出把两块缓存合并为 buff/cache 一列;-w 拆成:

  • buffers:块设备 I/O 的缓冲区(文件系统元数据,实测 835 MiB);
  • cache:文件数据页缓存 + SReclaimable 等可回收页(实测 31 GiB)。

两者都可回收,加起来就是默认输出的 buff/cache(855924 + 32627540 = 33483464,与默认口径的 33483416 相差几十 KiB,为两次采样间的正常波动)。

3.6 -l(--lohi):低/高内存水位明细

free -l
               total        used        free      shared  buff/cache   available
Mem:        41027992     6913908      328244       66864    33785840    33434744
Low:        41027992    40699748      328244
High:              0           0           0

Low/High 源自 32 位时代的"高端内存"(ZONE_HIGHMEM)概念:当时内核无法直接寻址全部物理内存,内存被分为可直接映射的 Low 与需要映射窗口的 High。在 64 位机器上没有高端内存区,实测 High 全为 0、Low 与物理内存总量相同(Low 行的 used 含缓存,故数值偏大)。排查老 32 位系统的内存问题时此列才有意义,现代 64 位服务器通常忽略。

3.7 -s N 与 -c N:连续采样

-s 2 -c 3 表示每 2 秒输出一次、共 3 次后退出:

free -s 2 -c 3
               total        used        free      shared  buff/cache   available
Mem:        41027992     6913908      328244       66864    33785840    33434744
Swap:        2097148     1582276      514872

               total        used        free      shared  buff/cache   available
Mem:        41027992     6854904      387128       66864    33785960    33493764
Swap:        2097148     1582276      514872

               total        used        free      shared  buff/cache   available
Mem:        41027992     6910256      331668       66864    33786068    33438416
Swap:        2097148     1582276      514872

实测要点:

  • 每次输出都带完整表头,适合直接粘贴归档;
  • 三次采样间 used/free 有几百 MiB 的自然波动(缓存回收与再填充),判断内存泄漏要看长时间趋势而非两次采样;
  • -s N 单独使用会无限循环(Ctrl-C 退出);-c 必须配合 -s 才有意义;
  • 想要"固定位置刷新"的表盘效果,用 watch -n 2 free -h(watch 自动清屏重画)。

3.8 available 与 free 的区别(重点实测)

这是 free 命令最容易误读的一处:free 列只统计"一个字节都没被用"的内存,而内核会把大量内存用作页面缓存(读过的文件内容缓存在内存里加速二次读取)——这部分内存看似"被用了",但应用需要时可立即回收。available 列就是"free + 可回收的页面缓存"的内核估算值。

实验一:写入并读取 1 GiB 文件,把页面缓存灌大(基线时已删除旧演示文件,free 有 1961 MiB):

rm -f /root/demo/free/bigfile && sleep 2
free -m
               total        used        free      shared  buff/cache   available
Mem:           40066        6869        1961          65       31234       32533
Swap:           2047        1550         497
dd if=/dev/zero of=/root/demo/free/bigfile bs=1M count=1024 status=none && cat /root/demo/free/bigfile > /dev/null && ls -lh /root/demo/free/bigfile
-rw-r--r-- 1 root root 1.0G Oct 15 14:27 /root/demo/free/bigfile
free -m
               total        used        free      shared  buff/cache   available
Mem:           40066        6876         929          65       32260       32526
Swap:           2047        1550         497
grep -E 'MemFree|MemAvailable' /proc/meminfo
MemFree:          952120 kB
MemAvailable:   33307596 kB

对比两份 free -m:

列灌入前灌入后变化
free1961 MiB929 MiB−1032 MiB(看着像"内存快没了")
buff/cache31234 MiB32260 MiB+1026 MiB(正是这 1G 文件)
available32533 MiB32526 MiB−7 MiB(噪声级,几乎不动)

同一时刻 meminfo 也确认:MemFree 952120 kB ≈ 929 MiB,而 MemAvailable 33307596 kB ≈ 32526 MiB,与 available 列一致。

结论一目了然:1G 文件被读入页面缓存后,free 掉了 1G,available 纹丝不动。判断"这台机器内存还够不够"必须看 available,看 free 会得出荒谬结论。

实验二:删除这个文件,观察缓存去向:

rm -f /root/demo/free/bigfile
free -m
               total        used        free      shared  buff/cache   available
Mem:           40066        6696        2083          65       31285       32706
Swap:           2047        1549         498

删除文件约 2 秒后,buff/cache 从 32310 回落到 31285(约 −1 GiB),free 从 1117 回升到 2083 MiB——已删除文件的缓存页会被内核尽快回收,不需要任何手工干预,available 全程稳定。

3.9 buff/cache 的构成(与 meminfo 逐字节对账)

buff/cache = meminfo 的 Buffers + Cached + SReclaimable 三项之和。用 3.1 的实测数据验证:855924(Buffers)+ 29727452(Cached)+ 2900040(SReclaimable)= 33483416,与 free 输出的 buff/cache 33483416 逐字节相等。

三项分工:

meminfo 字段作用特点
Buffers块设备元数据缓冲(inode、目录项等)量小(本机 836 MiB)
Cached文件数据页缓存(含 tmpfs/Shmem 66856 kB)量大,读文件越频繁越大
SReclaimableslab 分配器中可回收的部分(如 dentry/inode 缓存)随文件系统活动增长

三者都是"空闲时被拿去做缓存、紧张时可被回收"的内存,这正是 available 远大于 free 的原因。

3.10 Swap 行与 swapon --show

Swap 行(3.1 实测):总量 2097148 KiB(2 GiB)、已用 1577396 KiB(约 1.5 GiB)、空闲 519752 KiB。用 swapon --show 查明 swap 的物理形态:

swapon --show
NAME      TYPE SIZE USED PRIO
/swapfile file   2G 1.5G   -2
cat /proc/swaps
Filename				Type		Size		Used		Priority
/swapfile                               file		2097148		1577396		-2

两处输出一致:本机是 2 GiB 的 swap 文件(TYPE=file)而非独立分区,优先级 -2(多 swap 设备时数值大的优先使用)。free 的 Swap 行 used 与 swapon 的 USED 完全对应。

💡 技术拓展:swap 在 Linux 上有多种实现形态,横向对比——

形态建立方式优点缺点
swap 分区安装时划分或 fdisk+mkswap性能稳定、无文件碎片容量调整需重新分区
swap 文件dd+mkswap+swapon(本机形态)随时增减、灵活文件系统层多一跳、需防碎片
zram/压缩 swapmodprobe zram内存内压缩、无盘 I/O消耗少量 CPU

判断 swap 压力不能只看 used 大小,还要看换入换出速率(vmstat 的 si/so 列,见本专栏 vmstat 篇):used 高但长期 si/so≈0 说明只是历史驻留,无需处理。

SwapCached(实测 42036 kB)指"换出后又被读回、页内容同时存在于 swap 与内存"的部分,它同时计入 Mem 的缓存与 swap 的已用,属于正常统计口径,不代表异常。

3.11 无效参数与退出码

free --bogus >/dev/null 2>&1; echo rc=$?
rc=1

无效参数时 free 向 stderr 输出 free: unrecognized option '--bogus' 并打印 usage(free --help 的内容),退出码为 1。脚本里可借非零退出码捕获调用错误。

四、实战示例

4.1 巡检一行命令:内存水位判断

free -m
               total        used        free      shared  buff/cache   available
Mem:           40066        6838         529          65       32698       32564
Swap:           2047        1540         507

判断顺序:① available 32564 MiB / total 40066 MiB ≈ 81%,余量充足;② swap used 1540 MiB 偏高但需结合换入换出速率判断(4.5);③ free 只有 529 MiB 不是问题——内存被用作页面缓存正是 Linux 的设计。

4.2 观察内存趋势:连续采样

free -s 2 -c 3

(回显见 3.7。)内存泄漏排查姿势:固定间隔采样并把 used 列画成趋势线,连续数小时单调上涨才可下结论;配合 ps aux --sort=-rss | head 找到内存大户。

4.3 「内存去哪了」:页面缓存灌入与回收全流程

把 3.8 的两个实验串起来就是完整的解释链:读大文件 → free 降、buff/cache 升、available 不动(缓存占内存)→ 删文件 → buff/cache 回落、free 回升(内核回收)。下次有人问"1G 文件读完内存怎么少了 1G",用这组实测数据回答。

4.4 与 /proc/meminfo 对账脚本

怀疑 free 输出异常时,与内核原始数据逐字段核对(回显见 3.1):free -k 的六列分别等于 meminfo 的 MemTotal/MemFree/MemAvailable/Shmem/(Buffers+Cached+SReclaimable)/(total−free−buff/cache),Swap 行对应 SwapTotal/(SwapTotal−SwapFree)/SwapFree。对不上才需要怀疑系统问题,对得上则一切正常。

五、注意事项与常见问题

Q1:free 列很小,是不是内存不足? 不是。free 只统计"完全未用"的内存,Linux 会主动把空闲内存用作页面缓存(本机 31 GiB)。判断标准是 available:本机 available 31 GiB,非常健康。记住口诀:看 available,不看 free。

Q2:buff/cache 要不要手工清理? 通常不要。它是可回收缓存,应用申请内存时内核自动让路(3.8 实验二的回收耗时仅数秒)。网上流传的 echo 3 > /proc/sys/vm/drop_caches 会把干净的缓存全部丢弃、导致后续磁盘读变慢,仅在内存测试场景有意使用,生产环境不建议。

Q3:swap used 一直 1.5G,需要处理吗? 先看换入换出速率:vmstat 的 si/so 长期为 0 就说明只是历史驻留(曾经内存紧张换出过,之后没被换回),不影响性能;若 si/so 持续非零,才是真正的 swap 压力,应加内存或排查内存泄漏。

Q4:脚本取数用哪个单位选项? 算术用 -b(字节,无损);展示用 -m;不要用 -g(小于 1 GiB 显示 0,见 3.2 实测);对外报表用 --mega(十进制 MB,与供应商口径一致)。

Q5:free 的数和监控系统的对不上? 三个常见口径差:①单位体系——free 默认 KiB(1024 进制),监控系统常用十进制 GB(见 3.3,40 GiB = 42 GB);②采样时刻不同,used 本身有波动;③某些监控统计的是进程 RSS 之和,不含内核缓存口径。对账时用 free -k 与 /proc/meminfo 先在机器内部核对(见 4.4)。

Q6:shared 列是什么? tmpfs 与共享内存段占用的内存(meminfo 的 Shmem,本机 66856 KiB)。/dev/shm、shmget 建的共享内存都算在内;它计入 buff/cache 但部分不可被直接回收(tmpfs 内容删了才释放)。

六、参考链接