“最快的文件复制方式”将取决于系统-从存储介质到CPU。最可能的瓶颈将是存储介质,但不一定是这样。想象一下可以比您的系统更快地移动数据的高端存储,以创建物理页面映射来读取数据。
通常,移动大量数据的最快方法是尽可能少地复制它,并避免任何额外操作,特别是诸如物理磁盘头寻道之类的S-L-O-W操作。
因此,在普通单旋转磁盘工作站/台式机/笔记本电脑上进行本地复制时,最重要的是最小化物理磁盘寻道。这意味着以大块(例如1 MB)的方式进行单线程读写,以便系统可以进行任何优化,例如预读或写合并。
这可能会使您达到系统最大复制性能的95%甚至更好。即使是标准的C缓冲fopen()
/fread()
/fwrite()
也可能获得至少80-90%的最佳性能。
你可以通过以下几种方式获得最后的一些百分比。首先,将IO块大小与文件系统块大小的倍数匹配,以便始终从文件系统读取完整的块。其次,您可以使用直接IO来绕过通过页面缓存复制数据。磁盘->用户空间或用户空间->磁盘比磁盘->页面缓存->用户空间和用户空间->页面缓存->磁盘更快,但对于单旋转磁盘副本,这并不重要,即使可以测量也不会太多。
您可以使用各种dd选项来测试像这样复制文件。尝试使用“direct”或“notrunc”。
您还可以尝试使用{{link1:
sendfile()
}}完全避免将数据复制到用户空间。根据实现情况,这可能比使用直接IO更快。
预先分配目标文件可能会提高复制性能,但这取决于文件系统。如果文件系统不支持稀疏文件,则将文件预分配到特定长度可能会非常缓慢。
对于从同一物理磁盘复制和复制到相同的单个旋转物理磁盘,你几乎无法做太多事情来显着提高性能 - 磁盘头会跳动,这需要时间。
SSD则容易得多 - 要获得最大的IO速率,只需通过多个线程使用并行IO即可。但是,"正常" IO的速度可能仍然达到最大速度的80-90%。
针对其他类型的存储系统(例如大型RAID阵列和/或可以将单个文件跨越多个底层存储设备进行条带化的复杂文件系统),优化IO性能变得更加有趣和复杂。在这些系统上最大化IO涉及将软件的IO模式与存储的特性匹配,这可能相当复杂。
最大化IO速率的重要部分之一是不做会显著减慢速度的事情。从物理磁盘随机读写小块数据会很容易使IO速率降至每秒几KB。如果您的写入过程将16字节块随机写入磁盘的各个位置,磁盘将花费大量时间寻找数据并在此期间移动的数据很少。
实际上,避免使用不良IO模式比在最佳情况下花费大量精力争取提高4或5个百分点更为重要。
因为如果IO是简单系统的瓶颈,那么只需购买更快的磁盘即可。
pwrite()
或多次打开文件。对于大多数文件的并行写入,真正的问题在于物理磁头需要额外的寻道。但是,如果文件系统是高端HPC文件系统,则文件可以分布在多个磁盘上,并行写入速度可以更快。 - Andrew Henle