Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 提高高速文件拷贝的写入速度?_C++_Windows_Copy_Raid - Fatal编程技术网

C++ 提高高速文件拷贝的写入速度?

C++ 提高高速文件拷贝的写入速度?,c++,windows,copy,raid,C++,Windows,Copy,Raid,我一直在寻找编写文件复制例程的最快方法,将大文件复制到RAID 5硬件上 平均文件大小约为2GB 有两个windows框(都运行win2k3)。第一个框是源,大文件位于其中。第二个盒子有一个RAID 5存储器 上面的链接清楚地解释了为什么windows copy、robocopy和其他常见的复制实用程序在写入性能方面会受到影响。 因此,我编写了一个C/C++程序,它使用CreateFile、ReadFile和WriteFile API,并带有无缓冲和通过标志写入。该程序模拟ESEUTIL.ex

我一直在寻找编写文件复制例程的最快方法,将大文件复制到RAID 5硬件上

平均文件大小约为2GB

有两个windows框(都运行win2k3)。第一个框是源,大文件位于其中。第二个盒子有一个RAID 5存储器

上面的链接清楚地解释了为什么windows copy、robocopy和其他常见的复制实用程序在写入性能方面会受到影响。 因此,我编写了一个C/C++程序,它使用CreateFile、ReadFile和WriteFile API,并带有
无缓冲
通过
标志写入。该程序模拟ESEUTIL.exe,从某种意义上讲,它使用两个线程,一个用于读取,一个用于写入。读卡器线程从源读取256 KB并填充缓冲区。填充16个这样的256 KB块后,写入线程将缓冲区中的内容写入目标文件。如您所见,writer线程在一次快照中写入8MB的数据。程序分配32个这样的8MB块。。。因此,写作和阅读可以并行进行。
ESEUtil.exe的详细信息可在上述链接中找到。
注意:使用
无缓冲时,我会处理数据对齐问题

我使用了ATTO等基准实用程序,发现我们的RAID 5硬件在写入8MB数据块时具有每秒44MB的写入速度。约为每分钟2.57 GB

但是我的程序每分钟只能达到1.4 GB。


有谁能帮我找出问题所在吗?是否有其他更快的API,如
CreateFile
ReadFile
WriteFile
可用?

如果不写入目标文件,读取源文件的速度有多快

源文件是否存在碎片?分段读取可能比连续读取慢一个数量级。可以使用“contig”实用程序使其连续:

网络连接两台机器的速度有多快

你有没有试过像阿托那样只写虚拟数据,而不先读它

您一次是否有多个读取或写入请求


RAID-5阵列的条带大小是多少?一次写入完整条带是写入RAID-5的最快方式。

请记住,硬盘会缓冲来自盘片和流向盘片的数据。大多数磁盘驱动器都会尝试优化读取请求,以保持盘片旋转并最小化磁头移动。驱动器在写入盘片之前尝试从主机吸收尽可能多的数据,以便尽快断开主机的连接

您的性能还取决于PC上的I/O总线流量以及磁盘和主机之间的流量。还有其他可考虑的因素,例如系统任务和运行在同一时间的程序。作为测量工具,您可能无法获得准确的性能。请记住,由于上述开销,这些计时有一个错误因素


如果你的平台有DMA控制器,尝试使用这些。

< P>如果写速度很重要,为什么不考虑RAID 0来进行硬件配置?< /P>
  • 客户需要RAID 5
  • 优于RAID 0,因为它具有更好的容错能力
  • 客户对RAID 5的性能感到满意。问题 下面是使用ATTO对硬件进行的基准测试,显示写入速度为每分钟2.57 GB(8MB 为什么复制工具不能达到接近它的效果?大约每秒钟2 GB 我们正在看的是min。到目前为止,我们只能达到每分钟约1.5 GB的速度

正确的方法是使用无缓冲的完全异步I/O。您需要发出多个I/O以保持队列运行。这使文件系统、驱动程序和Raid-5子系统能够更优化地管理I/O

您还可以打开多个文件,并向多个文件发出读取权限

注意!优秀I/O的最佳数量以及读写交错方式将在很大程度上取决于存储子系统本身。您的程序将需要高度参数化,以便您可以调整它


注意-我相信机器人技术已经改进了-你试过了吗?I

您应该使用异步IO来获得最佳性能。即使用WriteFile的
LPOVERLAPPED
参数打开文件。使用
FILE\u FLAG\u NO\u BUFFERING
,您可能会也可能不会获得更好的性能。你必须测试才能看到

FILE\u FLAG\u NO\u BUFFERING
通常会为您提供更一致的速度和更好的流行为,并且它可以避免您可能不再需要的数据污染您的磁盘缓存,但总体而言并不一定更快

您还应该进行测试,以查看每个IO块的最佳大小。根据我的经验,一次复制4k文件和一次复制1Mb文件之间存在巨大的性能差异

在我过去的测试中(几年前),我发现低于约64kB的块大小主要由开销控制,当块大小达到约512KB时,总吞吐量继续提高。如果今天的驱动器需要使用大于1MB的块大小才能获得最大吞吐量,我不会感到惊讶

您当前使用的数字似乎是合理的,但可能不是最佳的。另外,我相当肯定,FILE_FLAG_WRITE_THROUGH会阻止使用磁盘缓存,因此会降低性能

您还需要注意,使用CreateFile/WriteFile复制文件不会复制NTFS上的元数据,如时间戳或备用数据流。你必须自己处理这些事情

实际上,用自己的代码替换
CopyFile
是一项相当大的工作

增编:

我应该在尝试t时提到这一点