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