rin*_*ng0 6 c++ windows raid copy
我一直在努力寻找编写文件复制例程的最快方法,将大文件复制到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和其他常见的复制实用程序在写入性能方面受到影响.因此,我编写了一个C/C++程序,它使用带有NO_BUFFERING&WRITE_THROUGHflags的CreateFile,ReadFile和WriteFile API .该程序模拟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可用?
您应该使用异步IO来获得最佳性能.那就是FILE_FLAG_OVERLAPPED使用LPOVERLAPPEDWriteFile 的参数打开文件.您可能会或可能不会获得更好的表现FILE_FLAG_NO_BUFFERING.你将不得不测试看看.
FILE_FLAG_NO_BUFFERING 通常会为您提供更一致的速度和更好的流式传输行为,并且它可以避免使用您可能不再需要的数据来污染您的磁盘缓存,但总体而言不一定更快.
您还应该测试以查看每个IO块的最佳大小.根据我的经验,一次复制4k文件和一次复制1Mb文件之间存在巨大的性能差异.
在我过去对此(几年前)的测试中,我发现大小低于64kB的块大小由开销占主导地位,并且总吞吐量继续提高,块大小增加到大约512KB.如果使用今天的驱动器,您需要使用大于1MB的块大小来获得最大吞吐量,我不会感到惊讶.
您当前使用的数字似乎是合理的,但可能不是最佳的.另外我很确定FILE_FLAG_WRITE_THROUGH可以防止使用磁盘缓存,因此会花费你相当多的性能.
您还需要注意,使用CreateFile/WriteFile复制文件不会在NTFS上复制时间戳或备用数据流等元数据.你必须自己处理这些事情.
实际上用CopyFile你自己的代码替换是相当多的工作.
附录:
我应该提一下,当我在WindowsNT 3.0上使用软件Raid 0(大约10年前)尝试这个时.速度对缓冲区内存的对齐非常敏感.事实证明,当DMA超过16个物理内存区域(64Kb)时,SCSI驱动程序必须使用特殊算法从分散/收集列表中执行DMA.要获得保证的最佳性能,需要物理上连续的分配 - 这是只有驱动程序才能请求的.这基本上是当时流行芯片组的DMA控制器中的一个错误的解决方法,并且不太可能仍然是一个问题.
但是 - 我仍然强烈建议您测试从32kb到32Mb的2个块大小的所有功率,以查看哪个更快.你可能会考虑测试一下缓冲区是否总是比其他缓冲区更快 - 这并不是闻所未闻.
如果不写入目标文件,读取源文件的速度有多快?
源文件是否碎片?碎片读取可能比连续读取慢一个数量级。您可以使用“contig”实用程序使其连续:
http://technet.microsoft.com/en-us/sysinternals/bb897428.aspx
连接两台机器的网络速度有多快?
您是否尝试过只写入虚拟数据,而不先读取它,就像 ATTO 那样?
您是否同时有多个读取或写入请求?
您的 RAID-5 阵列的条带大小是多少?一次写入完整条带是写入 RAID-5 的最快方法。
| 归档时间: |
|
| 查看次数: |
9043 次 |
| 最近记录: |