磁盘的写入速度恒定

时间:2014-06-19 19:25:30

标签: windows io disk

我按顺序将实时数据写入空的旋转磁盘。 (编辑:它不必是顺序的,只要我能读回它就好像它是连续的。)数据以100 MB / s的速率到达并且磁盘平均写入速度为120 MB / s。

有时(特别是随着可用空间开始减少),磁盘速度低于100 MB / s,具体取决于磁盘写入盘片的位置,我必须丢弃重要数据。

有没有办法以模式(或其他方式)写入磁盘以确保接近平均速率的恒定写入速度?无论磁盘上当前有多少数据。

编辑:

关于为什么我认为这应该成为可能的一些说明。

当通常写入磁盘时,它从盘片的快速部分开始,然后写入较慢的部分。但是,如果我可以将一半数据写入快速部分,将一半数据写入慢速部分(即1秒钟可以写入50MB到快速部分,50MB写入慢速部分),它们应该在中间相遇。我可以达到恒定的速度吗?

作为一名程序员,我不知道如何确定数据写在盘子上的位置,或者即使操作系统可以实现类似的功能。

6 个答案:

答案 0 :(得分:7)

如果我必须在常规Windows系统上执行此操作,我会使用具有更高平均写入速度的设备来为我提供更多空间。期望在整个磁盘上平均写入速度为100MB / s(额定速度​​为120MB / s)会给您带来麻烦。旋转硬盘在整个磁盘上没有恒定的写入速度。

此问题的常见解决方案是在RAM中缓冲以掩盖不常见的减速。您用作缓冲区的RAM越多,您可以处理的缓慢范围就越长。这些都是你必须做出的权衡。如果你的问题是已知的旋转磁盘内部扇区减速,那么你的设备就不够快。

可能有帮助的另一件事是尽可能直接访问磁盘并确保它不被系统的其他部分共享。使用单独的物理设备,不要使用文件系统对其进行格式化,直接写入分区空间。是的,你必须处理文件系统为你解决的一些问题,但你也跳过一堆你无法控制的代码。即使这样,您的应用程序也可能会遇到Windows的调度问题。 Windows不是RTOS,在时间上没有保证。再次,这将有助于更多的文件系统清理临时减速,刷新脏页等。它可能无助于“最后100GB写入80MB / s”问题。

如果你真的遇到了120MB / s的磁盘 - >从外到内80MB / s(您应该使用自己的代码进行测试,不要相信制造商的规格,以便了解您正在处理的内容),然后您将不得不像其他人建议的那样玩分区游戏。在机械磁盘上​​,这将引入一些严重的头部搜索,这可能会耗费你的改进。为了最大限度地减少搜索,确保它是操作系统不用于其他任何东西的专用磁盘甚至更重要。此外,在寻找磁盘末尾之前,使用大缓冲区并一次写入许多兆字节。您可以直接写入块设备并控制写入的块,而不是分区。我不知道如何在Windows中执行此操作。

要在Linux上解决这个问题,我很想在同一个驱动器上的两个分区上测试mdadm的raid0,看看是否有效。如果是这样,那么工作就完成了,你不必编写和测试一些复杂的写机制。

答案 1 :(得分:5)

将磁盘分区为两个大小相等的分区。在分区之间交替写入几秒钟的数据。这样你几乎可以得到所有常用的顺序速度,很好地平均。每隔几秒就有一次磁盘搜索几乎没有时间吃掉。每秒一次搜索将可用时间从1000ms减少到~990ms,这是吞吐量减少约1%。你可以用来缓冲的内存越多,你需要的就越少。

使用更多分区来增加平均效果。

答案 2 :(得分:5)

我担心这可能比你意识到的更难:

  • 如果您的平均120 MB / s写入速度是制造商的价值,那么它很可能是乐观的"充其量。
  • 即使是基准的写入速度通常也是在非分区/格式化的驱动器上完成的,并且会高于您在实际使用中通常看到的速度(一个好问题要高出多少)。
  • 更重要的值是驱动器的最低写入速度。例如,从Tom's Hardware 2013 HDD Benchmarks开始,平均速度为120 MB / s的驱动器的最小速度为76 MB / s。
  • 其他应用程序同时使用的驱动器(例如Windows)的写入速度要低得多。
  • 更重要的价值是驱动器实际测量的性能。我会创建一个类似于您的用例的简单应用程序,它尽可能快地将数据写入驱动器,直到它填满驱动器。这样做几十(12)次以获得更真实的平均/最小/最大写入速度值...它可能会低于您的预期。
  • 正如您所指出的,即使您的真实"假设您没有其他地方可以写入数据,如果您在磁盘填满之前遇到慢速写入速度,则平均写入速度高于100 MB / s。在这种情况下,使用缓冲区并没有帮助。
  • 我不确定您是否可以在硬盘上实际指定要写入的物理位置,而不会进入驱动器的固件。即使你可以,这也是我解决问题的最后选择。

我会考虑一些具体的事情来解决你的问题:

  • 衡量"真实"写驱动器的性能,看它是否足够快。这让你知道你实际上有多远。
  • 将操作系统放在单独的驱动器上,以确保数据驱动器不被您的应用程序以外的任何其他设备使用。
  • 获得更快的驱动器(HDD或SDD)。可以使用制造商的写入速度作为初始指南,但也要彻底测试它们。
  • 获取更多驱动器并将其置于RAID0(或类似)配置中,以便更快地进行写访问。您再次想要对此进行测试以确认它适合您。

答案 3 :(得分:3)

您可以通过直接控制磁盘写入位置来实现内部和外部交替写入的策略。在Windows下,您可以打开像“\。\ PhysicalDriveX”这样的磁盘并控制它写入的位置。有关详细信息,请参阅

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx

答案 4 :(得分:3)

首先,我希望您使用的是原始磁盘,而不是文件系统。如果您正在使用文件系统,则必须:

  1. 创建一个空的,非稀疏的文件,该文件的大小与文件系统一样大。

  2. 获取从逻辑文件位置到磁盘块的映射。

  3. 反转此映射,以便您可以从磁盘块映射到逻辑文件位置。当然,由于文件系统自己使用,一些块不可用。

  4. 此时,磁盘看起来像是磁盘块访问的原始磁盘。这种块寻址大多与物理柱面数量单调是一个有效的假设。 IOW如果增加磁盘块数,则柱面数将永远不会减少(或永远不会增加 - 取决于驱动器的LBA到物理映射顺序)。

    另请注意,磁盘的平均写入速度可以是每个柱面每个存储单元。你怎么知道的?你需要后一个数字,唯一可靠的方法是自己进行基准测试。您需要使用数据填充整个磁盘,重复将零页写入磁盘,逐块进行,并将写入的数据总量除以所需的数量。您需要以直接模式访问磁盘或文件。这应该禁用文件数据的OS缓冲,而不是文件系统元数据(如果不使用原始磁盘)。

    此时,您需要做的就是在块编号的两个极端处写入合理大小的数据块:您需要从两端向内填充磁盘。数据块的大小取决于您可以允许搜索的带宽浪费。您还应该假设硬盘驱动器可能会偶尔寻求更新其内务处理数据。假设最坏情况下的搜索时间为15ms,则每次搜索会浪费1.5%的每秒带宽。假设你可以节省不超过5%的带宽,驱动器本身平均有1个搜索/秒,你可以每秒寻找两次。因此,您的块大小必须为your_bandwith_per_second/2。此带宽磁盘带宽,而是数据源的带宽。

    唉,如果只是这样容易的事情。通常情况下,磁盘中间的带宽平均带宽。在您的基准测试期间,您还必须记录磁盘较小部分的写入速度,例如磁盘的每1%。这样,当写入磁盘的每个部分时,您可以找出如何在" low"之间分割数据。而且"高"您正在写的部分。假设您从磁盘上的0%和99%位置开始,低位置的带宽为mean*1.5,高位置的带宽为mean*0.8,其中{ {1}}是您所需的平均带宽。然后,您需要将mean数据写入低位,将余数(100% * 1.5/(0.8+1.5))写入较慢的高位。

    缓冲区的大小需要大于块大小,因为如果遇到坏块并且需要重新定位数据等,你必须假设硬盘驱动器有一些最坏情况的延迟。我会说3秒缓冲可能是合理的。如果您在软件运行时测量的延迟变得更高,它可以自行增长。必须将此缓冲区锁定("固定")到物理内存,以便它不会被交换。

答案 5 :(得分:1)

另一种可能的选择是去除(或短行程)硬盘驱动器。如果您从4TB或更大的驱动器开始并将其减速至2TB,则仅使用盘片的外部部分,从而实现更快的生产率。问题在于将获得供应商独特命令的软件发送到硬盘驱动器以进行破坏。