我按顺序将实时数据写入空的旋转磁盘。 (编辑:它不必是顺序的,只要我能读回它就好像它是连续的。)数据以100 MB / s的速率到达并且磁盘平均写入速度为120 MB / s。
有时(特别是随着可用空间开始减少),磁盘速度低于100 MB / s,具体取决于磁盘写入盘片的位置,我必须丢弃重要数据。
有没有办法以模式(或其他方式)写入磁盘以确保接近平均速率的恒定写入速度?无论磁盘上当前有多少数据。
编辑:
关于为什么我认为这应该成为可能的一些说明。
当通常写入磁盘时,它从盘片的快速部分开始,然后写入较慢的部分。但是,如果我可以将一半数据写入快速部分,将一半数据写入慢速部分(即1秒钟可以写入50MB到快速部分,50MB写入慢速部分),它们应该在中间相遇。我可以达到恒定的速度吗?
作为一名程序员,我不知道如何确定数据写在盘子上的位置,或者即使操作系统可以实现类似的功能。
答案 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)
我担心这可能比你意识到的更难:
我会考虑一些具体的事情来解决你的问题:
答案 3 :(得分:3)
您可以通过直接控制磁盘写入位置来实现内部和外部交替写入的策略。在Windows下,您可以打开像“\。\ PhysicalDriveX”这样的磁盘并控制它写入的位置。有关详细信息,请参阅
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx
答案 4 :(得分:3)
首先,我希望您使用的是原始磁盘,而不是文件系统。如果您正在使用文件系统,则必须:
创建一个空的,非稀疏的文件,该文件的大小与文件系统一样大。
获取从逻辑文件位置到磁盘块的映射。
反转此映射,以便您可以从磁盘块映射到逻辑文件位置。当然,由于文件系统自己使用,一些块不可用。
此时,磁盘看起来像是磁盘块访问的原始磁盘。这种块寻址大多与物理柱面数量单调是一个有效的假设。 IOW如果增加磁盘块数,则柱面数将永远不会减少(或永远不会增加 - 取决于驱动器的LBA到物理映射顺序)。
另请注意,磁盘的平均写入速度可以是每个柱面或每个存储单元。你怎么知道的?你需要后一个数字,唯一可靠的方法是自己进行基准测试。您需要使用数据填充整个磁盘,重复将零页写入磁盘,逐块进行,并将写入的数据总量除以所需的数量。您需要以直接模式访问磁盘或文件。这应该禁用文件数据的OS缓冲,而不是文件系统元数据(如果不使用原始磁盘)。
此时,您需要做的就是在块编号的两个极端处写入合理大小的数据块:您需要从两端向内填充磁盘。数据块的大小取决于您可以允许搜索的带宽浪费。您还应该假设硬盘驱动器可能会偶尔寻求更新其内务处理数据。假设最坏情况下的搜索时间为15ms,则每次搜索会浪费1.5%的每秒带宽。假设你可以节省不超过5%的带宽,驱动器本身平均有1个搜索/秒,你可以每秒寻找两次。因此,您的块大小必须为your_bandwith_per_second/2
。此带宽不磁盘带宽,而是数据源的带宽。
mean*1.5
,高位置的带宽为mean*0.8
,其中{ {1}}是您所需的平均带宽。然后,您需要将mean
数据写入低位,将余数(100% * 1.5/(0.8+1.5)
)写入较慢的高位。
缓冲区的大小需要大于块大小,因为如果遇到坏块并且需要重新定位数据等,你必须假设硬盘驱动器有一些最坏情况的延迟。我会说3秒缓冲可能是合理的。如果您在软件运行时测量的延迟变得更高,它可以自行增长。必须将此缓冲区锁定("固定")到物理内存,以便它不会被交换。
答案 5 :(得分:1)
另一种可能的选择是去除(或短行程)硬盘驱动器。如果您从4TB或更大的驱动器开始并将其减速至2TB,则仅使用盘片的外部部分,从而实现更快的生产率。问题在于将获得供应商独特命令的软件发送到硬盘驱动器以进行破坏。