[LWN 新闻] Linux 原子写入:向原子缓冲 I/O 迈进

2026年3月18日 34 次阅读 0 条评论 0 人点赞

作者:Jonathan Corbet | 2026年3月

许多应用程序需要能够将多块数据写入磁盘,并确保操作要么完全成功,要么完全失败——换句话说,写入不会被"撕裂"。多年来,内核开发者一直致力于提供原子写入功能来满足这一需求。虽然某些文件系统现在已支持原子直接 I/O,但原子缓冲 I/O 仍然不支持。填补这一空白似乎注定是 2026 年 LSFMM+BPF 的话题,但感谢早期的讨论,解决方案的轮廓可能已经初现端倪。

背景介绍

Pankaj Raghav 在 2 月 13 日开始了讨论,他指出 ext4 和 XFS 现在都支持使用直接 I/O 时的原子写入,但支持原子缓冲 I/O "仍然是一个有争议的话题"。

目前有两个关于添加此功能的提案:一个来自 John Garry 的 2024 年系列补丁,以及 Ojaswin Mujoo 最近的补丁集。这些提案进展缓慢,部分原因是担心为 I/O 路径增加的复杂性,以及是否真的需要原子缓冲写入。

PostgreSQL 的需求

一个经常被提及的潜在用户是 PostgreSQL 数据库,与许多其他数据库管理器不同,它使用缓冲 I/O。PostgreSQL 代码经常需要格外小心以确保部分 I/O 操作不会损坏数据库,有时会以性能为代价。

PostgreSQL 开发者 Andres Freund 表示,该项目确实正在添加直接 I/O 支持,但其性能尚未达到缓冲 I/O 方法的水平。但他表示,直接 I/O 只对某些较大的安装有用。较小的系统,或者数据库作为较大应用程序的一部分运行(有自己内存需求)的系统,在缓冲 I/O 设置中仍会表现得更好,因为内核可以管理内存分配。

他估计,即使直接 I/O 成为 PostgreSQL 的可行选择,"超过 50% 的用户"将无法从中受益。

解决方案:Write-Through 语义

讨论中提出的一个可能的解决方案是使用 write-through 语义进行原子缓冲写入。换句话说,当用户空间发起缓冲写入并请求原子行为(使用带有 RWF_ATOMIC 标志的 pwritev2())时,内核会立即启动将数据写入磁盘的过程。

这将允许创建一个短期固定,将页面保留在内存中(如果在操作过程中将充满数据的页面之一交换到 swap,就很难进行原子写入),并允许内核防止在此操作期间对这些页面进行任何其他更改。

Jan Kara 同意 write-through 行为可能很有趣。他说,这将允许重用大部分现有的直接 I/O 基础设施,使解决方案简单得多。

后续步骤

Raghav 发布了一组建议的结论:第一步是实现带有立即启动请求操作的 write-through 行为。但仅 write-through 本身并不能保证原子行为,所以还有更多工作要做。

下一步将是确保正在写入的数据在操作过程中不被修改。幸运的是,内核长期以来有一个机制——stable pages——可以在此处发挥作用。通过防止正在写入的缓冲区被修改,内核可以防止数据损坏。

后续步骤将包括确保在开始操作之前将完整数据范围复制到页面缓存中,并确保缓冲区以单个原子操作写入。

展望未来

看起来原子缓冲写入的路径开始变得更加清晰。可能只需要再过大约半打 LSFMM+BPF 会议就能完全解决这个问题。


编译来源: 本文基于 LWN.net 文章《Toward atomic buffered I/O》翻译整理。

文章评论(0)