并行文件复制


9

我有一个我需要在Linux系统上复制的文件的列表-每个文件的大小范围为10到100GB。

我只想复制到本地文件系统。有没有一种方法可以以简单的方式并行执行此操作-多个进程分别负责复制文件?

我可以轻松地编写一个多线程程序来执行此操作,但是我有兴趣了解是否有一种低级的Linux方法可以执行此操作。


1
并行文件复制不会带来明显的提速。(至少从理论上讲不应该。)
TarnayKálmán10年


1
@TarnayKálmán,除非您具有集群,覆盖,RAID或“非raid”样式的文件系统,或者具有相对较高延迟或繁忙网络的任何上述文件系统;或工作负载,其中每个文件的延迟是该文件复制时间的重要部分(1e5 +非常小的文件,内容寻址的后端等)。在这种情况下,并发处理将非常有用。
rvalue

Answers:


11

如果您的系统没有受到影响(例如,文件可能在缓存中),那么GNU Parallel http://www.gnu.org/software/parallel/可能对您有用:

find . -print0 | parallel -0 -j10 cp {} destdir

这将运行10个并发时间cp

优点:很容易阅读。

缺点:GNU Parallel在大多数系统上不是标准的-因此您可能必须安装它。

观看介绍视频以了解更多信息:http : //www.youtube.com/watch?v=OpaiGYxkSuQ

另请参阅https://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/了解并行磁盘I / O。


3

出于非常简单的原因,没有底层机制:这样做会破坏系统性能。使用磁盘驱动器时,每次写入都会争用磁头的放置,从而导致大量的I / O等待。使用SSD,最终将使您的一个或多个系统总线饱和,从而导致其他问题。


目前,使用单个cp似乎不是这种错误,我敢肯定,对于多个并行“ cp”来说,存在一个令人满意的介质,在这种情况下,您的I / O通道不会完全饱和...
乔恩2010年

1
饱和的巴士是快乐的巴士。空闲带宽是浪费的带宽。
rvalue

3

如前所述,这是一个可怕的想法。但是我相信每个人都应该能够执行自己的可怕计划,所以...

for FILE in *;do cp $FILE <destination> &;done

星号可以用文件的正则表达式替换,也可以用$(cat <listfile>)文本文档全部替换。“&”号在后台启动命令,因此循环将继续,并生成更多副本。

如前所述,这将完全摧毁您的IO。所以...我真的不建议这样做。

克里斯托弗·卡雷尔(Christopher Karel)


3

不会浪费您机器响应能力的唯一答案不是精确的“复制”,但速度非常快。如果您不打算在新位置或旧位置编辑文件,则硬链接实际上就像一个副本,并且(仅)如果您使用的是同一文件系统,则可以非常非常快地创建它们。

检查一下cp -l,看看是否适合您。


2

这是一个分布式/并行和分散式文件复制工具,它将对文件进行分块并并行复制所有块。如果您拥有支持多个流的SSD或带有多个磁盘头的某种设置,它可能只会对您有所帮助。

https://github.com/hpc/dcp


1

对于认为这不是一个好主意的人,我会说这取决于。您可以拥有大型RAID系统或并行文件系统,它们将提供比一个cp进程可以处理的性能更好的性能。然后,是的,您需要使用“并行工具”。

让我们来看这个例子:

timeout 10 strace -e write -c cp /dev/zero /dev/null
strace: Process 24187 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.655188           4    166222           write
------ ----------- ----------- --------- --------- ----------------
100.00    0.655188                166222           total

然后这个

timeout 0.01 strace -e write  cp /dev/zero /dev/null
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
strace: Process 24567 detached

因此,在这种情况下,由“ cp”执行的每个系统调用写入都是64KiB,并且在我的系统上持续10秒钟,我可以提供以下带宽:65536 * 166222/10 = 1089352499 =〜1,08GB / s

现在,让我们通过2个流程启动此工作负载(我有4个核心,但是我的桌面用于其他工作,这里仅是一个示例):

timeout 10 strace -e write -c cp /dev/zero /dev/null & timeout 10 strace -e write -c cp /dev/zero /dev/null &  wait
[1] 26106
[2] 26107
strace: Process 26113 detached
strace: Process 26112 detached
% time     seconds  usecs/call     calls    errors syscall
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
------ ----------- ----------- --------- --------- ----------------
100.00    0.624108           4    162616           write
100.00    0.638468           4    162451           write
------ ----------- ----------- --------- --------- ----------------
100.00    0.624108                162616           total
100.00    0.638468                162451           total
------ ----------- ----------- --------- --------- ----------------
[1]-  Exit 124                timeout 10 strace -e write -c cp /dev/zero /dev/null

因此,我们可以看到使用2核启动该处理器的性能几乎可以提高一倍。

因此,如果我们所处的环境不同于1xHard驱动器到1xHard驱动器,而是一个RAID阵列(或多个NVMe,所以我同意的不是最常见的情况,但我每天都在处理),则在使用多个common时绝对显示出更好的性能。平行。


-1

您应该尝试这样:

    $ seq 3 | 并行cp -v / etc / passwd passwd {}

这会将文件passwd从/ etc /目录复制3次到$ HOME

或者如果您的文件位于主目录中

    $ seq 3 | 并行cp -v passwd {,{}}

这会将文件passwd复制3次到$ HOME中

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.