并发、缓存一致性与故障恢复

并发、缓存一致性与故障恢复

1. 锁层次

VFS 常见锁:

保护
s_umount super freeze/unmount
mount lock/seqlock mount topology
i_rwsem inode/目录操作
i_lock inode state/flags/lists
d_lock dentry fields
rename lock rename/pathwalk sequence
file_lock fdtable update
folio lock page cache folio state
mapping xarray lock page cache index

具体文件系统还有 transaction、extent、allocation group、journal、log 等锁。

2. Lockless fast path

  • fd lookup 使用 RCU;
  • pathwalk 优先 RCU-walk;
  • dcache hash lookup 配合 sequence validation;
  • mount/path rename 通过 seqlock 检测变化。

无锁读取不是无同步,而是读取后验证;失败需重试或转慢路径。

3. Dentry/inode 一致性

本地 fs 通常由 VFS mutation 更新 dcache;网络/stacked fs 可能通过 d_revalidate 检查远端/lower 状态。negative dentry timeout 和 attribute cache 会影响“何时看到新文件”。

4. Data/metadata ordering

持久化涉及:

1
2
3
4
5
6
7
8
application data
-> page cache/DIO
-> filesystem allocation
-> journal/log/CoW transaction
-> bio
-> block layer
-> device volatile cache
-> media

文件系统只能在设备正确实现 flush/FUA 时兑现顺序。

5. fsync 语义

fsync 目标是该文件所需数据和 metadata;rename/create 的目录项持久性可能还需 parent fsync。不同文件系统的 journal/CoW 实现不同,但应用应使用通用 crash-safe protocol,而不依赖偶然行为。

6. Freeze/unmount

  • freeze 阻断新写并同步,供 snapshot;
  • unmount 先从 namespace detach,再等待/关闭 super;
  • lazy unmount 只断开可见路径,活动引用仍存在;
  • forced unmount 可能让后续 I/O 返回错误。

7. 崩溃恢复

  • journal replay;
  • log replay;
  • orphan cleanup;
  • checkpoint/roll-forward;
  • CoW tree root 选择;
  • fsck/offline repair;
  • online scrub。

恢复机制无法修复所有硬件 silent corruption;checksum、scrub 和备份仍必要。

8. Writeback error

异步错误可能在后续 fsync 才报告。多进程对同一 inode 打开的 file 各自跟踪 errseq,应用必须检查并记录第一次持久化错误。

9. Deadlock 防护

存储路径分配内存常使用 GFP_NOFS/memalloc_nofs,避免回收再次进入同一文件系统。新增代码不能在 filesystem transaction lock 下随意 GFP_KERNEL 分配或调用可递归 VFS 操作。

10. 测试

  • fsx/xfstests;
  • fault injection;
  • dm-flakey;
  • 强制掉电;
  • fsfreeze;
  • ENOSPC/inode exhaustion;
  • I/O error;
  • concurrent rename/unlink/mmap;
  • mount namespace stress。

文章互动

阅读 --

留言

0 条留言

正在加载留言…