在写入磁盘之前安排物理磁盘扇区

时间:2013-09-29 18:57:13

标签: c++ asynchronous nosql storage acid

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

我的问题是: 通过在将I / O请求发送到底层磁盘OS 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会对物理文件地址0安排一次12kb写操作,对物理文件地址409600安排一次8kb写操作。
  7. 更新: DSM通过在Linux AIO上提供OVERLAPPED结构io_prep_pwrite,在POSIX AIO上提供aiocb的{​​{1}}来执行Windows上的所有物理文件访问地址定位。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

BTW,这与C ++无关。