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)实测通过。
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) | 含义 |
|---|---|---|
| total | 41027992 | 物理内存总量(约 39 GiB) |
| used | 7001728 | 已用内存 = total − free − buff/cache |
| free | 542848 | 完全未被使用的内存(不等于可用内存,见 3.8) |
| shared | 66856 | 共享内存(tmpfs、共享内存段等,来自 meminfo 的 Shmem) |
| buff/cache | 33483416 | 页面缓存(读缓存页,可回收,构成见 3.9) |
| available | 33346960 | 启动新进程而不发生 swapping 的估算可用内存,判断内存够不够看它 |
| Swap 行 | 2097148 / 1577396 / 519752 | swap 总量 / 已用 / 空闲 |
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:
| 列 | 灌入前 | 灌入后 | 变化 |
|---|---|---|---|
| free | 1961 MiB | 929 MiB | −1032 MiB(看着像"内存快没了") |
| buff/cache | 31234 MiB | 32260 MiB | +1026 MiB(正是这 1G 文件) |
| available | 32533 MiB | 32526 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) | 量大,读文件越频繁越大 |
| SReclaimable | slab 分配器中可回收的部分(如 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/压缩 swap modprobe 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 内容删了才释放)。
六、参考链接
- procps-ng 项目主页(free 源码所属项目):https://gitlab.com/procps-ng/procps
- Ubuntu 22.04 free(1) 在线手册页:https://manpages.ubuntu.com/manpages/jammy/en/man1/free.1.html
- proc(5) 手册页(/proc/meminfo 各字段定义):https://man7.org/linux/man-pages/man5/proc.5.html
- procps free 的 available 计算说明(内核 Documentation):https://docs.kernel.org/filesystems/proc.html#meminfo
- swapon(2)/swap 基础参见
swapon --help与本专栏 vmstat 篇的 si/so 解读