首页/系统/Linux 内核与性能调优速查/Buffers 与 Cached 的区别
内存与 OOM58 条

Buffers 与 Cached 的区别

Buffers 是块设备元数据缓存,Cached 是文件内容与 tmpfs 的缓存;free 的 buff/cache 为两者合计,大部分可回收、tmpfs 部分不可。

什么是 Buffers 与 Cached

free 命令里的 buff/cache 是 Buffers 与 Cached 之和。Cached 主要是文件内容缓存,也包含 tmpfs 占用的 Shmem 部分;Buffers 是块设备的元数据缓存(目录项、超级块等),现代内核下数值通常较小。二者的共性是可回收,但可回收程度不同:普通文件页可以被随时丢弃,Shmem 与脏页则需要在压力下写回或删除文件才能释放。

基本信息

查看free -h 与 /proc/meminfo 的 Buffers、Cached、Shmem
关系buff/cache = Buffers + Cached
可回收性文件页可回收,Shmem 需删除文件,脏页需写回
相关字段SReclaimable(可回收 slab)、Dirty(待写回)
判读首选MemAvailable 而不是 MemFree
同族机制页缓存、slab 缓存、tmpfs

典型使用场景

  • 解释 free 显示“used 很低但 free 也很低”的常见困惑
  • 内存告警判读:区分可回收缓存与真实占用
  • tmpfs 与共享内存排查:定位 Shmem 增长来源
  • IO 性能分析:判断缓存命中对读延迟的影响
  • 容器内存核对:区分宿主缓存与容器自身用量

对照查看

对照查看
free -h
grep -E '^(Buffers|Cached|Shmem|SReclaimable|Dirty|MemAvailable)' /proc/meminfo
df -h /dev/shm                           # tmpfs 占用是 Shmem 的主要来源之一
findmnt -t tmpfs | head -10              # 系统里都有哪些 tmpfs
cat /proc/pressure/memory                # 内存压力指标
sync; echo 3 | sudo tee /proc/sys/vm/drop_caches   # 仅排障用,生产慎用

字段与可回收性

字段内容可回收程度
Buffers块设备元数据缓存基本可回收
Cached文件内容 + Shmem文件页可回收,Shmem 需删文件
Shmemtmpfs 与共享内存不可随意回收
SReclaimableslab 可回收部分压力下可回收
Dirty待写回脏页需先写回才能释放
缓存被使用说明系统在有效利用内存,只要 MemAvailable 充足就不需要干预;定期清理缓存反而会降低读性能。
把 Cached 全部视为可回收会低估 OOM 风险:其中 Shmem 与脏页不能立即释放,内存紧张的判定要结合可用内存与压力指标。
宿主与容器的统计口径不同:宿主看到的缓存包含所有租户的写入,容器内通常看不到这部分,做对比前先确认数据来源,避免张冠李戴。
排查内存问题的顺序建议:先看可用内存与内存压力指标,再看缓存构成与增长来源,最后才考虑是否需要清理动作。

易错点

  • 把 Cached 全部视为可回收会低估 OOM 风险(Shmem 部分不可回收)
  • 判断可用内存优先看 MemAvailable,而不是 free 列,避免被缓存占用误导
  • 用 drop_caches 当作常规运维手段:缓存被清掉后业务需要重新读盘,性能下降还掩盖了真实问题
  • 误把 tmpfs 的占用当成可随时释放的缓存,实际必须以删除文件或卸载为前提

数据来源与参考

  • procps-ng 文档 free(1)
  • Linux 内核 Documentation/filesystems/proc.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌