buff/cache 是内核利用空闲内存提升i/o性能的机制,含buffers(块设备写入缓冲,几mb级)和cached(页缓存,加速文件读取,可自动回收),数值高不意味内存不足,只要available充足即正常。

linux 中的 buff/cache 不是“被占用却浪费的内存”,而是内核主动利用空闲物理内存提升 I/O 性能的关键机制。它由两部分组成:buffers(缓冲区)和 cached(页面缓存),合起来统称 buff/cache,数值越大通常说明系统越善于利用内存加速磁盘读写。
buff/cache 里的 buffers 是什么
Buffers 是面向**块设备写入**的临时中转区,大小通常较小(一般几 MB 到 20MB 左右)。它的核心作用是把零散、突发的写请求攒起来,合并成更连续、更高效的磁盘操作。
- 比如多个进程同时往不同文件写小段数据,内核不会立刻逐条刷盘,而是先暂存在 buffers 中
- 系统后台有 pdflush 或 writeback 进程定期将 buffers 中的“脏数据”写入磁盘
- 手动执行
sync命令会强制触发写入,清空 buffers(但不等于释放内存,只是把内容落盘) - 它缓存的是**尚未写入磁盘的原始块数据**,与具体文件逻辑无关
buff/cache 里的 cached 是什么
Cached 主要指 page cache(页缓存),它缓存的是**已从磁盘读取的文件内容**,单位是内存页(通常是 4KB),直接服务于文件读取加速。
- 当你用
cat查看一个大日志、运行一个程序或加载共享库时,对应文件的数据会被读入 cached 区域 - 下次再访问同一文件(哪怕换了个命令),内核可直接从内存返回,跳过磁盘 I/O
- cached 内存是“可回收”的——当应用急需内存时,内核会自动释放这部分空间,无需人工干预
- tmpfs、ramfs 等内存文件系统的内容也会计入 cached 统计,但它们不属于 page cache
为什么 free 命令里看到 buff/cache 很高,但系统并不卡
因为 buff/cache 占用的内存本质是“闲置资源的智能复用”。只要 available 值充足(free 命令第二行),就说明系统仍有足够内存供新进程使用。
-
used字段包含 buffers 和 cached,不能直接等同于“被程序占满” -
available是内核估算的真正可用内存,已扣除不可回收部分,并预留了 buffer/cached 的弹性空间 - 即使
free显示为 0,只要available > 0,就不代表内存不足 - 频繁触发 swap 并非因为 buff/cache 太高,而是 available 持续趋近于 0,且 dirty pages 积压过多(可通过
/proc/sys/vm/dirty_ratio调节)
要不要手动清理 buff/cache
一般不需要,也不推荐常规清理。Linux 内核的内存管理足够智能,清理反而可能降低后续 I/O 性能。
- 若需临时释放(如调试、压测前),可用:
echo 3 > /proc/sys/vm/drop_caches(仅 root) - 该操作只清 page cache、dentries 和 inodes,不影响正在使用的内存,也不会杀进程
- buffers 不在此命令范围内,它由内核根据写负载和 dirty 参数自动调控
- 生产环境避免定时执行 drop_caches,它破坏缓存局部性,可能引发短时 I/O 尖峰