结论:free 输出中的 cache(页缓存)缓存的是文件内容——读写文件的数据页;buffer 缓存的是裸块设备的 I/O——文件系统元数据(目录项、inode)和绕过文件系统的直接块设备读写。现代 Linux 两者融合程度高,区别在于数据来源是"文件"还是"块设备"。
展开:历史与现实:早期两者独立——buffer cache 按块缓存、page cache 按页缓存,2.4 内核后统一为页缓存承载文件数据,buffer 仅保留块设备与元数据角色,所以 free 把它们合并显示为 buff/cache。语义上更重要的数字是 available:它估算无需 swap 即可分配给新应用的内存 ≈ free + 可回收的 cache/buffer,应用申请内存不受 cache 占用影响。易错点:1)把 buff/cache 大当成内存泄漏——它是内核故意为之,应用需要时自动回收;2)echo 3 > /proc/sys/vm/drop_caches 清缓存只适合测试冷启动性能,生产环境执行会让系统瞬间回到慢路径;3)容器里读到的 free 是宿主机数值,容器视角要看 cgroup 的 memory.stat。
free -h
# Mem: total 32G used 8G free 2G buff/cache 22G available 23G
# 应用实际可用约 23G,不是 2G
追问方向:swap cached 字段的含义、cgroup v2 如何把 page cache 计入容器内存限额。