页缓存、写回与块 I/O

页缓存、写回与块 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.cfs/ 提供文件系统和 writeback 对接。

2. Buffered read

1
2
3
4
5
6
read_iter
-> filemap_read()
-> lookup folio in mapping
-> hit: copy to iov_iter
-> miss: readahead / a_ops->read_folio
-> wait folio uptodate

readahead 根据顺序访问动态扩大窗口。随机负载过大预读会浪费 I/O 和 cache。

3. Buffered write

1
2
3
4
5
6
generic_file_write_iter
-> generic_perform_write
-> a_ops->write_begin
-> copy from user
-> a_ops->write_end
-> folio_mark_dirty

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.cbuffer_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
2
slow device -> writeback backlog -> dirty throttling
-> application latency -> reclaim pressure

9. 观测

1
2
3
4
cat /proc/meminfo | grep -E 'Cached|Dirty|Writeback'
cat /proc/vmstat | grep -E 'dirty|writeback|pgpg'
cat /proc/pressure/io
cat /proc/diskstats

调整 dirty 参数前应先确定设备写延迟和 filesystem journal 状态。

文章互动

阅读 --

留言

0 条留言

正在加载留言…