磁盘IO循环文件写入问题

Disk IO Issue with circular file writes

本文关键字:问题 文件 IO 循环 磁盘      更新时间:2023-10-16

在我的软件中,我有4x 500GB的文件,我使用boost内存映射文件api以循环方式顺序写入

我在32MB块中分配区域,当在末尾分配块时,我创建了两个内存映射区域,其中第一个是文件的末尾,第二个是文件的开头,并映射到第一个区域的结束地址。

现在这对于较小的文件工作得很好。然而,对于大文件,当到达结束区域时,磁盘性能会降到最低,我不确定如何避免它。

我猜正在发生的事情是磁盘试图写入文件的两端,并且主轴必须来回跳跃。这是一件相当愚蠢的事情,特别是在进行顺序写入时,我希望操作系统能更聪明一点。

有没有人有什么办法可以避免这个问题?

我正在考虑升级到Windows 10,希望它能做得更好。但这是一个相当冒险的改变,我现在想避免。

我还应该注意到,这些文件存在一个软件RAID 1上,带有2个3TB希捷安装企业驱动器。这些驱动器的最小顺序写入速度为60MB/s,平均为120MB/s,我以30mb/s的速度写入所有文件。

代码可以在这里找到。

编辑:

所以事实证明,在写入整个文件之后,然后从头开始,操作系统实际上开始读取磁盘上的内容,即使它不需要,我认为这是导致问题的原因。

"这些驱动器的最小顺序写入速度为60MB/s" -这无关紧要,因为您没有进行顺序写入。

使用SSD缓存,或者重新考虑设计(找到一种方法来防止跨缓冲区的访问)


与速度无关:你可以使用直接映射到文件的循环缓冲区,这样你就不必使用(专有的?)技巧来映射"连续"的地址区域。粗略的想法:boost::circular_buffer相当于文件?