1

Bakcground:我正在开发新的SparkleDB NoSQL 数据库,该数据库是 ACID 并且有自己的磁盘空间管理器 (DSM),用于访问数据库文件存储。DSM 允许在同一个物理文件上进行多线程并发 I/O 操作,即。异步 I/O 或重叠 I/O。我们禁用磁盘缓存,因此我们将页面直接写入磁盘,因为这是 ACID 数据库所必需的。

我的问题是:在将 I/O 请求发送到底层磁盘操作系统 I/O 子系统之前,通过从许多线程写入中安排连续的磁盘页面是否可以提高性能(如果它们是连续的,则合并要写入的数据),或者确实I/O 子系统会为您执行此操作吗?我的问题适用于 UNIX、Linux 和 Windows。

示例(所有发生在 100 毫秒的空间内):

  1. 线程 #1:将 4k 写入物理文件地址 4096
  2. 线程 #2:将 4k 写入物理文件地址 0
  3. 线程 #3:将 4k 写入物理文件地址 8192
  4. 线程 #4:将 4k 写入物理文件地址 409600
  5. 线程 #5:将 4k 写入物理文件地址 413696
  6. 使用此信息,DSM 将单个 12kb 写入操作安排到物理文件地址 0,并将单个 8kb 写入操作安排到物理文件地址 409600。

更新:DSM通过在 Linux AIO 上和POSIX AIO上提供OVERLAPPED结构来完成 Windows 上的所有物理文件访问地址定位。io_prep_pwriteaiocbaio_offset

4

1 回答 1

0

使用硬盘驱动器最有效的方法是在盘片仍在旋转时尽可能多地写入数据。这涉及减少写入量并增加每次写入的数据量。如果发生这种情况,那么拥有连续扇区的磁盘区域会有所帮助。

对于每次写入,操作系统需要将写入文件转换为驱动器上的逻辑或物理坐标。这可能涉及读取目录、搜索文件以及在目录中定位文件的映射。

在操作系统确定位置后,它会通过接口将数据发送到硬盘驱动器。您的数据可能会在此过程中多次缓存,直到将其放置到盘片上。高效的写入将使用缓存和数据接口的块大小。

现在的问题是:1)这节省了多少时间?2) 节省时间是否显着。例如,如果所有这些工作为您节省了 1 秒,那么获得的这一秒可能会在等待用户的响应时丢失。

许多程序、操作系统和驱动程序会将对硬盘的写入推迟到非关键或非高峰期。例如,当您等待用户输入时,您可能正在写入硬盘驱动器。这种写入的发布可能比优化磁盘写入更省力,并且对您的应用程序有更大的影响。

顺便说一句,这与 C++ 无关。

于 2013-09-29T19:27:58.417 回答