如何学习:用户态磁盘 I/O

主要观点:介绍了数据库中的文件 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 挂载文件为块设备进行直接块存储访问实验。
阅读 13
0 条评论