知识卡片

Direct I/O与Buffered I/O的权衡

专业/工作 · 551.f

内容

Buffered I/O让所有数据都先经过内核的Page Cache,好处是能借助DMA在磁盘和缓存间搬数据而不占CPU、并且能靠缓存命中减少实际的物理I/O次数,但如果应用自己已经有一套缓存机制(如数据库管理系统),再让内核缓存一遍就是重复劳动,还多引入了一次用户态与内核态之间的数据拷贝。Direct I/O在打开文件时设置O_DIRECT标志,让数据直接在用户空间和磁盘之间传输,跳过内核缓冲区,代价是失去了内核缓存带来的合并优化,因此通常要搭配异步I/O一起使用才能避免阻塞。发散:这是”谁来管理缓存”的责任下放问题——凡是应用层已经有更懂自身访问模式的缓存策略时,内核的通用缓存反而是负担,这个矛盾在很多”通用系统 vs 专用优化”的场景里都会重演。

参考来源

《Linux开源存储全栈详解从Ceph到容器存储》第3章《Linux存储栈》