作用:
Buffer Cache和Page Cache都用来提升IO读写性能,大致原理如下:
- 读性能: 通过预读提前加载数据,以及缓存频繁访问数据,减少I/O次数,提升读性能;
- 写性能: 对上层的应用程序直接写入Page/Buffer即可返回,不用等待数据真正落盘;对下层的磁盘,由pdflush内核线程一次性地将多个写请求数据刷新到磁盘,减少I/O次数,提升写性能;
区别
Buffer Cache和Page Cache最大的差别在于:Page Cache是针对文件系统的缓存,Buffer Cache是针对块设备的缓存,如下图所示:
Page Cache的数据是否还要经过Buffer Cache?
在以前的Linux系统中,当Page Cache的数据需要刷新时,会先写入Buffer Cache,然后再落盘,这样就会显得冗余。为了解决这个问题,在内核版本2.6之后,Page Cache和Buffer Cache进行了整合,文件的系统的IO不再使用Buffer Cache,只有不经过文件系统直接对磁盘操作的数据会被Buffer Cache缓存。
Page Cache的同步
Page Cache的数据同步有两种方式:Write Through(写穿,同步方式)和Write back(写回,异步方式)。Write Through意味着数据写入Page Cache后还要等待数据落盘才会返回;Write back则指数据写入Page Cache后即可返回,由pdflush内核线程在特定的时候写入磁盘:
- 用户主动刷盘:调用sync(2)、fsync(2)、fdatasync(2)等系统函数;
- 操作系统刷盘(时间维度):脏页在内存中驻留时间超过一个特定的阈值;
- 操作系统刷盘(空间维度):可用内存低于一个特定的阈值;
参考: