复合页

Linux 内核在 5.16 版本 12 中对其内存管理系统进行了一次巨大的重构,引入了 folio —— 复合页的概念,folio 本质上就是一组 pages,之所以需要 folio 是因为随着计算机硬件的飞速发展,计算机处理数据的速度也越来越快,有很多压测数据都表明当内核使用更大的数据块的时候其 I/O 性能会更高,内核中有很多需要操作比 page 更大的数据块的场景

struct page 返璞归真,删繁就简,去除了之前的那些扩展,回归单一的语义 —— 代表单个内存页,然后将 page 内嵌到 folio 结构体中,以 folio 表示一个复合页 (folio 也可以表示一个单页)。

Page Cache 和 Buffer Cache

Buffer Cache 是对粒度更细的设备块的缓存,而 Page Cache 是基于虚拟内存的页单元缓存,因此还是会基于 Buffer Cache,也就是说如果是缓存文件内容数据就会在内存里缓存两份相同的数据,存在冗余和不一致的问题。在 Linux 2.4 版本之后,kernel 就将两者进行了统一,Buffer Cache 不再以独立的形式存在,而是以融合的方式存在于 Page Cache 中:

image.png

写回缓存(writeback)

当 Page Cache 中的某些缓存页被更新之后,这些内存页会被标记为 PG_dirty,也就是"脏"数据。内核需要某种机制来确保内存中的 dirty pages 能被写回到磁盘:

手动写回

读缓存

预读策略

Buffer I/O 整体

image.png