页缓存、写回与块 I/O
1. address_space
inode 的 i_mapping 连接文件 offset 与 page-cache folio。核心:
i_pages:XArray;a_ops:文件系统 I/O 回调;host:inode;- writeback/error 状态。
页缓存核心实现主要在 mm/filemap.c,fs/ 提供文件系统和 writeback 对接。
2. Buffered read
1 | read_iter |
readahead 根据顺序访问动态扩大窗口。随机负载过大预读会浪费 I/O 和 cache。
3. Buffered write
1 | generic_file_write_iter |
write 返回通常只表示数据进入页缓存。脏页由 balance_dirty_pages 限流,并由 writeback worker 或 fsync 下发。
4. fs-writeback.c
writeback 以 backing_dev_info / writeback domain 组织:
- 周期写回;
- 超过 dirty threshold;
- 内存回收;
- fsync/sync;
- filesystem sync/freeze。
writeback_single_inode() 协调 inode state 和 address_space_operations->writepages。inode dirty 类型区分数据、元数据、时间戳等。
5. Buffer head
buffer.c 的 buffer_head 表示 page 中一段块及状态,提供:
- buffer cache helpers;
submit_bh();- block mapping;
- metadata I/O;
sync_mapping_buffers()。
它是传统接口,ext4 等仍大量用于 metadata;新文件系统数据路径更多使用 iomap/bio/folio。
6. Mpage
mpage.c 为简单 block mapping 文件系统聚合连续块 I/O,减少逐 buffer 提交。复杂 extent、压缩、CoW 文件系统通常有自己的路径。
7. 错误传播
异步 writeback error 记录在 mapping errseq。后续 fsync 和某些 write 路径通过 file_check_and_advance_wb_err() 向每个 file 报告,避免错误静默丢失。
应用必须检查 write、fsync 和 close(部分错误)返回值。
8. 回收关系
clean file folio 可直接丢弃;dirty folio 需写回;正在 writeback 的 folio可能造成 reclaim stall。内存、存储延迟和脏页阈值相互影响:
1 | slow device -> writeback backlog -> dirty throttling |
9. 观测
1 | cat /proc/meminfo | grep -E 'Cached|Dirty|Writeback' |
调整 dirty 参数前应先确定设备写延迟和 filesystem journal 状态。