主要观点:介绍了数据库中的文件 I/O 相关内容,包括不同的 I/O 模式(缓冲与非缓冲)、异步 I/O 的各种方式及优先级、数据持久化的方法(如 fsync、fdatasync 等)、文件系统的特点(如 XFS 等)以及内核相关的 IO 调度器等。
关键信息:
- 在数据库中,多数数据库使用
O_DIRECT进行文件 I/O 以获得更多控制,Linux 世界中O_DIRECT存在争议。 - 异步 I/O 方式优先级为 io_uring > io_submit > aio > epoll > select,不同系统的异步 I/O 选项不同。
fsync是使数据持久化的核心原语,有保证文件完整性和数据完整性的不同方式。- 偏爱 XFS 文件系统,其整体性能较好且能处理数据库相关的特殊情况。
- 要注意 IO 调度器、vm.dirty_ratio 等内核相关内容。
重要细节: - 如 RocksDB、LMDB 等数据库依赖缓冲 I/O 和内核页缓存,使用 buffered IO 时
preadv2/prwritev2的 flags 有用。 pwritev2支持多块原子写,但受文件系统和驱动支持限制。- 不同系统(如 macOS、Windows)的异步 I/O 方式各有特点。
- macOS 不支持
O_DIRECT,需调用fcntl(F_NOCACHE);Windows 有FlushFileBuffers等等效函数。 - 文件系统可通过聚合连续块为 extent 减少元数据开销,大文件截断后删除可提高效率。
- 可通过 losetup 挂载文件为块设备进行直接块存储访问实验。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。