内存的 buffer 和 cache

缓冲 (buffer) 和缓存 (cache) 都是为了提高进程对硬盘的读写效率,解决速度不对等的问题。

cache 用于 CPU 与内存间的读写。完整名称是 Page Cache。用来缓存从硬盘读取出来的数据。下次读取时若命中已缓存需要的数据,就不用去读硬盘,若没有命中就读硬盘。

buffer 用于内存与硬盘间的读写。完整名称是 Buffer Cache。用来缓存尚未写入硬盘的数据。减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。Linux 有一个守护进程定期清空缓冲内容(即写入硬盘)。用户也可以通过 sync 命令手动清空缓冲写到硬盘。

buffer 与 cache 合并

在不同版本的 Linux 系统中,free 命令打印的结果,有的是 cachedbuffers 分开的,有的是 buff/cache 合并在一列的。

这是因为在 Linux 内核 2.4 版本之前,buffer cache 和 page cache 是不同的存储结构。 Linux 内核 2.4 版本之后,buffer cache 被合并到了 page cache,因此使用同一个存储结构。

但是 buffer 和 cache 在功能和概念上还是保持原样,没有合并。

清空 cache

# 清空 page cache
sudo sh -c 'echo 1 > /proc/sys/vm/drop_caches'

# 清空可回收的 slab objects (包括 dentries and inodes)
sudo sh -c 'echo 2 > /proc/sys/vm/drop_caches'

# echo 3 等于 echo 1 加 echo 2 的清空
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

只执行 echo 1 > /proc/sys/vm/drop_caches 会显示 Permission denied。因为 sudo 只是让 echo 命令具有了 root 权限,但是没有让 > 命令也具有 root 权限,所以会报这个错。