direct IO 与 page cache 的区别是什么,我如何判断当前是否走了 direct IO?
```
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
