【问题标题】:Arranging physical disk sectors before writing to disk在写入磁盘之前排列物理磁盘扇区
【发布时间】: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. 线程 #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 通过提供OVERLAPPED 结构、Linux AIO 上的io_prep_pwrite 和 POSIX AIO 上的aiocbaio_offset 来完成所有物理文件访问地址定位。

【问题讨论】:

  • 任何对性能敏感的数据库都将使用 SSD,可能需要额外的 HDD 用于不太敏感的 I/O。在 SSD 上,由于重新映射,“物理”地址是不可见的。

标签: c++ asynchronous nosql storage acid


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我们的 DSM 通过提供OVERLAPPED 结构、Linux AIO 上的io_prep_pwrite 和 POSIX AIO 上aiocbaio_offset 来完成 Windows 上的所有物理文件访问地址定位,是您的使用此额外提供的信息,答案仍然有效吗?
猜你喜欢
  • 2019-12-05
  • 2012-09-02
  • 2012-12-28
  • 2012-04-11
  • 1970-01-01
  • 2018-05-16
  • 2010-12-17
  • 2010-09-24
  • 2017-06-17
相关资源
最近更新 更多