直接 I/O、mmap 与零复制不是同一种技术;它们改变路径中的不同部分,不能推出“没有缓存、没有 CPU 或天然持久”。
三个名称分别回答什么
直接 I/O 主要改变某些文件 I/O 与页缓存的关系;mmap 把文件等对象映射到地址空间;零复制通常是对某段复制被避免的描述,必须指明起止点。
一个方案可以减少用户态与内核态之间的复制,却仍由设备 DMA 向内存写入;也可能绕开某层缓存,但设备内部仍有缓存。脱离边界谈“零复制”没有可验证含义。
直接 I/O 的前提不是统一常量
Linux O_DIRECT 的约束与支持依赖文件系统、内核和设备等条件,对齐与支持情况不能随意固定为一个万能数值。依据:open(2)
缓冲I/O:应用 <-> 页缓存 <-> 存储路径
直接I/O:应用缓冲区 <-> 受约束的设备I/O路径
映射访问:应用地址空间 -> 文件页映射 -> 缺页时准备内容
图是语义对比,不表示所有文件系统内部实现完全相同。
映射并没有提前读入全部内容
程序建立映射后,访问尚未就绪的页可能触发准备工作。缺页、页面驻留和写回仍影响执行。共享映射和私有映射的修改语义也不同,不能用“像数组访问”推导持久性。
原创场景:首次扫描映射文件很慢,再次扫描很快。缓存与缺页工作可以解释这种差异,但不是唯一原因;需要实际观测和一致测试条件。
减少复制与所有权交接
复制被省掉后,双方可能共享某个缓冲区,生命周期约束更重要。数据在下游尚未消费前,上游不能任意复用。程序需要知道什么时候可以修改或释放资源。
因此“复制少”不自动表示接口更简单;可能把 CPU 搬运成本换成更复杂的所有权与完成管理。该关系与 DMA 的交接模型一致。
直接 I/O 不等于同步持久
缓存路径变化与持久性承诺是不同维度。不能凭 direct=1 断言掉电后数据已安全,也不能凭 mmap 修改成功断言相应内容已完成持久写入。
文件同步语义见 fsync,端到端承诺见 持久化写入。任何可靠更新设计都应审查具体接口和存储栈。
性能比较的正确边界
减少复制可能释放 CPU 与带宽,却可能受对齐、请求粒度、工作集和设备路径约束。缓冲模式适合某种负载,不能推出它对所有负载更好;直接模式在某次测试更快,也不能推出生产业务应全部切换。
企业测试报告需要写清实际支持模式、失败处理、缓存条件、请求大小、并发和完成语义。工具参数定义可查 fio,但工具参数本身不能替代接口正确性。
服务器知识库 · 系统架构 · 数据路径 · 测试验收 · 工程参考
公开资料核对:2026-10-07。文档类型:Explanation。逻辑图、场景推演与报告模板为原创,不代表实测结果、厂商内部设计或公司制度;操作仅限获授权的目标和环境。