Direct IO vs Page Cache?

spider · · 16 次点击
``` 1) Page Cache 与 Direct IO 的本质区别 Page Cache(默认 buffered IO) 应用 read()/write() 时: • 数据先进入 Linux page cache(内存缓存) • 写入通常是 先写内存 → 变 dirty page → 后台刷盘 • 内核可以做: • 合并小 IO(writeback batch) • read-ahead • 缓存热点数据减少磁盘读 优点: • 吞吐高、读性能好 • 内核能帮你合并小 IO 缺点: • 数据库/链节点自己也有 cache → 双缓存(double buffering) • 延迟可能抖(dirty writeback / flush storm) • 内存占用大 ⸻ Direct IO(O_DIRECT) 应用打开文件时带 O_DIRECT: • IO 绕过 page cache • 数据直接从用户态 buffer → 块设备 • 写入通常更接近“立刻落盘”(但仍受设备队列影响) 优点: • 延迟更可控(少了 writeback 机制) • 避免 double buffering • DB 类系统更喜欢(比如 RocksDB 常用) 缺点: • 内核无法帮你合并小 IO(batching 更依赖应用) • 小 IO 会更碎、更容易打爆 IO queue • 对齐要求(buffer/offset/blocksize 必须对齐) ```
#1
更多评论
| 维度 | 模型 | | -------- | -------- | | 缓存方式 | Page Cache / Direct I/O | | 阻塞模型 | Blocking / Non-blocking | | 事件机制 | select / poll / epoll | | 异步模型 |AIO / io_uring | | 零拷贝 | mmap / splice / sendfile |
#2