我正在按顺序将实时数据写入一个空的旋转磁盘。(编辑:它不一定是顺序的,只要我能把它读回来,就好像它是顺序的。)数据以100 MB/s的速率到达,磁盘的平均写入速度为120 MB/s。
有时(特别是当空闲空间开始减少时),磁盘速度会低于100 MB/s,这取决于磁盘上写入的位置,而我必须删除重要的数据。
是否有任何方法以模式(或其他方式)向磁盘写入,以确保写入速度接近平均速率?不管当前磁盘上有多少数据。
编辑:
关于为什么我认为这是可能的。
当通常写入磁盘时,它从盘的快速部分开始,然后写入较慢的部分。但是,如果我可以将一半的数据写到快部分,一半的数据写到慢部分(即1秒,它可以将50 in写到快部分,50 in写到慢部分),它们应该在中间相遇。我能达到一个恒定的速度吗?
作为一名程序员,我不知道如何决定在什么地方写数据,甚至是操作系统是否可以实现类似的功能。
发布于 2014-06-19 20:11:15
将磁盘划分为两个大小相等的分区。在分区之间交替写入几秒钟的数据。这样你就可以得到几乎所有通常的顺序速度,很好地平均。每隔几秒钟就找一个磁盘,几乎没有时间。每秒一次搜索将可用时间从1000 is减少到~990 is,即吞吐量减少了~1%。您可以用于缓冲的RAM越多,您需要寻找的就越少。
使用更多的分区来增加平均效果。
发布于 2014-06-19 19:45:15
如果我不得不在普通的Windows系统上这样做,我会使用一个平均写入速度更高的设备来给我更多的空间。期望100 to /s的平均写入速度对整个磁盘的额定为120 to/s将给您带来麻烦。旋转硬盘对整个磁盘没有恒定的写入速度。
这个问题的通常解决方案是在RAM中缓冲以掩盖不常见的缓慢下降。用作缓冲区的RAM越多,所能处理的慢度范围就越长。这是你必须做的权衡。如果你的问题是已知的旋转磁盘内部扇区的减速,那么你的设备就不够快了。
另一件可能有帮助的事情是尽可能直接地访问磁盘,并确保它不会被系统的其他部分共享。使用单独的物理设备,不要用文件系统格式化它,直接写入分区空间。是的,您将不得不处理文件系统为您解决的一些问题,但您也跳过了一堆无法控制的代码。即使如此,您的应用程序也可能遇到Windows的调度问题。Windows不是一个RTOS,也没有时间保证。同样,这将有助于更多地解决文件系统清理、刷新脏页等临时减速问题。这可能对“最后100 at写入80 at/s”的问题没有多大帮助。
如果您真的被一个从120 so /s -> 80 so/s到内部的磁盘卡住了(您应该用自己的代码进行测试,而不相信来自制造的规范,这样您就知道自己在处理什么),那么您将不得不像其他人所建议的那样玩分区游戏。在一个机械磁盘上,这将引入一些严肃的头部寻找,这可能会吞噬你的进步。为了最小化搜索,更重要的是确保它是操作系统没有用于任何其他用途的专用磁盘。此外,在寻找磁盘的末尾之前,请使用大型缓冲区并一次写入多兆字节。与分区不同,您可以直接写入块设备,并控制写入哪些块。我不知道在Windows下该怎么做。
为了在Linux上解决这个问题,我很想在同一个驱动器上的两个分区上测试mdadm的raid0,看看它是否有效。如果是这样的话,那么工作就完成了,您不必编写和测试一些复杂的写入机制。
发布于 2014-06-19 20:41:23
我担心这比你意识到的要困难得多:
为了解决你的问题,我会考虑一些具体的事情:
https://stackoverflow.com/questions/24314752
复制相似问题