Bakcground:我正在开发新的SparkleDB NoSQL 数据库,该数据库是 ACID 并且有自己的磁盘空间管理器 (DSM),用于访问数据库文件存储。DSM 允许在同一个物理文件上进行多线程并发 I/O 操作,即。异步 I/O 或重叠 I/O。我们禁用磁盘缓存,因此我们将页面直接写入磁盘,因为这是 ACID 数据库所必需的。
我的问题是:在将 I/O 请求发送到底层磁盘操作系统 I/O 子系统之前,通过从许多线程写入中安排连续的磁盘页面是否可以提高性能(如果它们是连续的,则合并要写入的数据),或者确实I/O 子系统会为您执行此操作吗?我的问题适用于 UNIX、Linux 和 Windows。
示例(所有发生在 100 毫秒的空间内):
- 线程 #1:将 4k 写入物理文件地址 4096
- 线程 #2:将 4k 写入物理文件地址 0
- 线程 #3:将 4k 写入物理文件地址 8192
- 线程 #4:将 4k 写入物理文件地址 409600
- 线程 #5:将 4k 写入物理文件地址 413696
- 使用此信息,DSM 将单个 12kb 写入操作安排到物理文件地址 0,并将单个 8kb 写入操作安排到物理文件地址 409600。
更新:DSM通过在 Linux AIO 上和POSIX AIO上提供OVERLAPPED
结构来完成 Windows 上的所有物理文件访问地址定位。io_prep_pwrite
aiocb
aio_offset