提高高速文件复制的写入速度?
我一直在尝试找出编写文件复制例程的最快方法,将大文件复制到RAID 5硬件上。
平均文件大小约为2 GB。
有2个窗口框(都运行win2k3)。第一个框是源,大文件位于何处。第二个盒子有一个RAID 5存储。
http://blogs.technet.com/askperf/archive/2007/05/08/slow-large-file-copy-issues.aspx
以上链接清楚地解释了为什么Windows复制,robocopy和其他常见的复制实用程序在写入性能方面受到影响。
因此,我编写了一个使用CreateFile,ReadFile& S的C / C ++程序。 WriteFile API与
NO_BUFFERING
& WRITE_THROUGH
旗帜。该程序模拟ESEUTIL.exe,从某种意义上说,它使用2个线程,一个用于读取,一个用于写入。读取器线程从源读取256 KB并填充缓冲区。一旦填充了16个这样的256 KB块,写入器线程就会将缓冲区中的内容写入目标文件。如您所见,编写器线程在一次写入中写入8MB的数据。该程序分配32个这样的8MB块...因此,写入和读取可以并行发生。
可以在上面的链接中找到ESEUtil.exe的详细信息。
注意:使用NO_BUFFERING
时,我正在处理数据对齐问题。
我使用像ATTO这样的台式标记实用程序,发现我们的RAID 5硬件在写入8MB数据块时的写入速度为每秒44MB。每分钟大约2.57 GB。
但我的程序每分钟只能达到1.4 GB。
有谁可以帮我确定问题是什么?是否有更快的API其他CreateFile
,ReadFile
,WriteFile
可用?
没有找到相关结果
已邀请:
7 个回复
爆刺疤灯
打开文件并使用WriteFile的
参数。使用
可能会或可能不会获得更好的性能。你将不得不测试看看。
通常会为您提供更加一致的速度和更好的流式传输行为,并且它可以避免使用您可能不再需要的数据来污染磁盘缓存,但总体上不一定更快。 您还应该测试以查看每个IO块的最佳大小。根据我的经验,一次复制4k文件和一次复制1Mb文件之间存在巨大的性能差异。 在我过去对此(几年前)的测试中,我发现大小低于64kB的块大小由开销占主导地位,并且总吞吐量继续提高,块大小增加到大约512KB。如果使用今天的驱动器,您需要使用大于1MB的块大小来获得最大吞吐量,我不会感到惊讶。 您当前使用的数字似乎是合理的,但可能不是最佳的。另外我很确定FILE_FLAG_WRITE_THROUGH可以防止使用磁盘缓存,因此会花费你一些性能。 您还需要注意,使用CreateFile / WriteFile复制文件不会在NTFS上复制时间戳或备用数据流等元数据。你必须自己处理这些事情。 实际上用你自己的代码替换
是相当多的工作。 附录: 我应该提一下,当我在WindowsNT 3.0(大约10年前)上使用软件Raid 0进行尝试时。速度对缓冲区内存的对齐非常敏感。事实证明,当DMA超过16个物理内存区域(64Kb)时,SCSI驱动程序必须使用特殊算法从分散/收集列表中执行DMA。要获得保证的最佳性能,需要物理上连续的分配 - 这是只有驱动程序才能请求的。这基本上是当时流行芯片组的DMA控制器中的一个错误的解决方法,并且不太可能仍然是一个问题。 但是 - 我仍然强烈建议您测试从32kb到32Mb的2个块大小的所有功率,以查看哪个更快。您可能会考虑测试一下缓冲区是否始终比其他缓冲区更快 - 这并非闻所未闻。
糖固傻染
和
,你仍然需要预先扩展文件,这样你的异步写入就不需要像文件那样扩展文件了。出于安全原因,文件扩展名始终是同步的要预先扩展,您需要执行以下操作: 启用
权限。 打开文件。 用
寻找所需的文件长度。 用
设置文件结尾。 在文件
中设置有效数据的结尾。 关闭文件。 然后... 打开要写的文件。 发出写入
亨尖玛次酥
锯康
炬卤遁蝎变
攫怂绵十
抵浮细