free命令默认输出中used值高并非内存不足,因linux将空闲内存用于可回收的buff/cache;应优先关注available列(内核3.14+),它反映真正可用内存。

free 命令默认输出为什么看起来内存快用完了?
直接运行 free 时,used 列数值往往很高,容易误判为内存不足。这是因为 Linux 把大量空闲内存用于缓存(buff/cache),这部分内存随时可被进程回收——它不是“被占住”,而是“被利用”。真正该关注的是 available 列(内核 3.14+ 默认显示),它估算当前可立即分配给新进程的内存,比 free 列更真实反映可用余量。
常见错误现象:used 接近 total,但系统响应正常、swap 未使用、available 仍有数 GB。
- 别盯着
used看,优先看available - 老内核(available,可用
free -h && cat /proc/meminfo | grep -E "MemAvailable|Cached"估算 -
buff/cache高 ≠ 有问题,反而是 I/O 效率高的表现
如何让 free 输出更易读、更贴合排查场景?
free 的原始输出单位是 KB,数字长难比对;默认不刷新,无法观察动态变化。加参数能快速适配不同需求:
-
free -h:自动换算为 GB/MB,带单位,人眼友好(强烈建议始终加) -
free -h -c 5:每秒刷新一次,共 5 次,适合观察内存波动 -
free -h -w:分离buff和cache(旧版内核需此参数才显示两列) -
free -h -t:末尾加Total行,含所有内存之和(含buff/cache)
注意:-h 不能和 -b/-k/-m/-g 混用;-c 必须跟数字,否则报错 free: invalid option -- 'c'。
free 显示 swap 使用了,但实际没进程在换入换出?
swap 列非零只表示有页面被换出过,并不意味当前正在频繁交换。Linux 内核会主动将部分休眠进程的匿名页写入 swap(尤其当 swappiness > 0),这是预防性行为,不是危机信号。
- 确认是否真有压力:看
si(swap-in)和so(swap-out)值(用vmstat 1查),持续 > 0 才说明活跃交换 -
swappiness=1仍可能触发 swap,设为0仅禁用主动换出(OOM 前仍可能换) - 某些发行版(如 Ubuntu)默认启用
zram,free中的swap可能是压缩内存,延迟远低于磁盘 swap
为什么 top/htop 和 free 的 used 数值不一致?
根本原因在于统计口径不同:free 的 used = total − free − buff/cache;而 top 的 %MEM 是按进程 RSS 总和计算,不含内核内存、page cache、slab 等。两者本就不该相等。
- 对比时统一工具:查整体余量用
free -h,查进程占用用top或ps aux --sort=-%mem -
htop的柱状图默认含cache,可按F2 → Display Options → Hide kernel threads调整,但底层数据源仍是/proc/meminfo - 若发现
free的available极低,但top进程 RSS 总和很小,可能是 slab 泄漏(cat /proc/meminfo | grep SReclaimable查可回收内核缓存)
最常被忽略的一点:容器环境(Docker/Podman)中,free 显示的是宿主机内存,不是容器 cgroup 限制值——想看容器实际用量,得进容器执行 free 或查 /sys/fs/cgroup/memory/...。










