恒定写入磁盘速度

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

有时(尤其是随着空闲空间开始减less)磁盘速度低于100 MB / s,这取决于磁盘正在写入的盘片上的位置,而且我必须删除重要的数据。

有没有办法以一种模式(或其他方式)写入磁盘,以确保写入速度接近平均速度? 不pipe目前磁盘上有多less数据。

编辑:

一些笔记为什么我认为这应该是可能的。

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

作为一名程序员,我不知道如何才能决定数据写在哪里,甚至操作系统是否可以实现类似的function。

将磁盘分区成两个大小相等的分区。 在这些分区之间交替写入数据。 这样,你几乎可以获得所有常见的连续速度,很好地平均。 每隔几秒寻找一个磁盘几乎没有时间。 每秒一次寻找将可用时间从1000ms减少到约990ms,吞吐量减少约1%。 你可以投入更多的RAM来缓冲你不得不寻求的东西。

使用更多的分区来提高平均效果。

如果我必须在常规的Windows系统上执行此操作,那么我将使用平均写入速度更高的设备来提供更多的空间。 在120MB / s的整个磁盘上,平均写入速度达到100MB / s会给你带来麻烦。 旋转硬盘在整个磁盘上的写入速度并不稳定。

解决这个问题的通常办法是在RAM中缓冲以掩盖不经常的缓慢下降。 用作缓冲区的RAM越多,可以处理的慢度越长。 这些是你必须做出的折衷。 如果您的问题是旋转磁盘内部扇区的已知减速,那么您的设备速度不够快。

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

如果你真的坚持使用从120MB / s到80MB / s的磁盘,你应该用自己的代码进行测试,不要相信制造商的规格,所以你知道你在处理什么。 ,那么你将不得不像其他人一样玩分区游戏。 在机械盘上,会引入一些严重的头部寻找,这可能会吃掉你的改善。 为了尽量减少搜索次数 ,确保它是一个操作系统没有使用的专用磁盘更为重要。 另外,在寻找磁盘末尾之前,请使用大缓冲区并一次写入许多兆字节。 您可以直接写入块设备,并控制要写入的块,而不是分区。 我不知道如何在Windows中做到这一点。

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

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

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

一些具体的事情,我会看看解决你的问题:

  • 测量驱动器的“真实”写入性能,看它是否足够快。 这给你一个你实际背后有多远的想法。
  • 将操作系统放在单独的驱动器上,以确保数据驱动器不被除应用程序之外的任何其他应用程序所使用。
  • 获得更快的驱动器(HDD或SDD)。 使用制造商的写入速度作为初始指南是很好的,但也要对其进行彻底测试。
  • 获得更多的驱动器并将其放入RAID0(或类似的)配置中,以便更快地进行写入访问。 你会再次想要实际测试这个确认它适合你。

通过直接控制磁盘写入位置,可以实现在内外交替写入的策略。 在Windows下,您可以打开一个像“\。\ PhysicalDriveX”的磁盘并控制它的写入位置。 更多信息请参阅

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

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

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

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

  3. 反转这个映射,以便您可以将磁盘块映射到逻辑文件位置。 当然由于文件系统自己的使用,有些块是不可用的。

在这一点上,磁盘看起来像是一个通过磁盘块访问的原始磁盘。 这是一个有效的假设,这个块寻址大多是物理柱面数量单调的。 IOW如果增加磁盘块编号,气缸编号将永远不会减少(或永远不会增加 – 取决于驱动器的LBA到物理映射顺序)。

此外,请注意,磁盘的平均写入速度可以按每个磁道每个存储单元给出 。 你怎么知道的? 你需要后一个号码,唯一可行的方法就是自己进行基准测试。 你需要用数据填充整个磁盘,反复写入零页到磁盘,逐块进行,然后用所花费的数量除写入的数据总量。 您需要以直接模式访问磁盘或文件。 这应该禁用文件数据的操作系统缓冲,而不是文件系统元数据(如果不使用原始磁盘)。

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

唉,如果只有这事容易的事情。 一般情况下,磁盘中间的带宽不是平均带宽。 在基准测试期间,您还必须记录磁盘上较小部分的写入速度,例如每1%的磁盘。 这样,在写入磁盘的每个部分时,可以计算出如何在写入的“低”和“高”部分之间分割数据 。 假设你在磁盘上的0%和99%位置开始,低位的mean*1.5带宽为mean*1.5 ,而高位的mean*0.8带宽为mean*0.8 ,其中mean是你想要的平均带宽。 然后你需要把100% * 1.5/(0.8+1.5)的数据写入低位,剩下的部分( 100% * 0.8/(0.8+1.5) )写入较慢的高位。

你的缓冲区的大小需要大于块大小,因为如果硬盘坏了,需要重新定位数据等等,你必须假设硬盘的最坏情况下的延迟。我会说3秒的缓冲区是合理的。 如果您的软件运行时间较长,则可以自行增长。 这个缓冲区必须被锁定(“固定”)到物理内存,这样它才不会交换。

另一个可能的选择是去驱动(或短行程)的硬盘驱动器。 如果从4TB或更大的驱动器开始,将其驱动到2TB,则只使用盘片的外部部分,从而导致更快的吞吐率。 这个问题可能会让软件向硬盘驱动器发出供应商特有的命令来解除它。