Linux 内存中的 Cache 与 Buffer
所谓 Cache,就是为了弥补高速设备和低速设备之间的矛盾而设立的一个中间层。把低速设备的频繁文件数据放在 Cache 中,让高速设备可以直接通过 Cache 取到数据,从而节省时间。
缓冲 Buffer 是根据磁盘读写设计的,它把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
Cache 和 Buffer 之间的区别:
- Cache 是 CPU 与内存之间的,Buffer 是内存与磁盘之间的,都是为了解决速度不对等的问题。
- 缓存(Cache)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不需要去读硬盘了,若没有命中再去读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。Cache 缓存的是文件级别的数据(包括读和写)。
- Buffer 缓存块设备相关的元数据或原始磁盘块(如 inode、超级块、目录结构等),主要用于文件系统内部操作或对裸设备的 I/O。
- 在应用场景上,Buffer 是由各种进程分配的,被用在如输入队列等方面。一个简单的例子,如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程先把读入的字段放在 Buffer 中保存。Cache 经常被用在磁盘 I/O 请求上,如果有多个进程都要访问某个文件,于是该文件便被做成 Cache 以方便下次被访问,这样可以提高系统性能。
现代 Linux 中:
- 文件系统读写普通文件内容时,数据进入 Cached。
- 文件系统读写自己的元数据(如 ext4 的 inode table、bitmap 等)时,这些数据进入 Buffers(因为它是块设备的原始块,没有普通文件的映射关系)。
- 因此 Buffers 往往比 Cached 小得多,除非你在做大量文件系统元数据操作或直接裸盘 I/O。
# cat /proc/meminfo | grep -E '^(Cached|Buffers)'
Buffers: 24 kB
Cached: 383088 kB