【发布时间】:2013-10-05 14:16:12
【问题描述】:
背景: 我正在开发新的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 通过提供OVERLAPPED 结构、Linux AIO 上的io_prep_pwrite 和 POSIX AIO 上的aiocb 的aio_offset 来完成所有物理文件访问地址定位。
【问题讨论】:
-
任何对性能敏感的数据库都将使用 SSD,可能需要额外的 HDD 用于不太敏感的 I/O。在 SSD 上,由于重新映射,“物理”地址是不可见的。
标签: c++ asynchronous nosql storage acid