我有一个我需要在Linux系统上复制的文件的列表-每个文件的大小范围为10到100GB。
我只想复制到本地文件系统。有没有一种方法可以以简单的方式并行执行此操作-多个进程分别负责复制文件?
我可以轻松地编写一个多线程程序来执行此操作,但是我有兴趣了解是否有一种低级的Linux方法可以执行此操作。
我有一个我需要在Linux系统上复制的文件的列表-每个文件的大小范围为10到100GB。
我只想复制到本地文件系统。有没有一种方法可以以简单的方式并行执行此操作-多个进程分别负责复制文件?
我可以轻松地编写一个多线程程序来执行此操作,但是我有兴趣了解是否有一种低级的Linux方法可以执行此操作。
Answers:
如果您的系统没有受到影响(例如,文件可能在缓存中),那么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。
如前所述,这是一个可怕的想法。但是我相信每个人都应该能够执行自己的可怕计划,所以...
for FILE in *;do cp $FILE <destination> &;done
星号可以用文件的正则表达式替换,也可以用$(cat <listfile>)
文本文档全部替换。“&”号在后台启动命令,因此循环将继续,并生成更多副本。
如前所述,这将完全摧毁您的IO。所以...我真的不建议这样做。
克里斯托弗·卡雷尔(Christopher Karel)
不会浪费您机器响应能力的唯一答案不是精确的“复制”,但速度非常快。如果您不打算在新位置或旧位置编辑文件,则硬链接实际上就像一个副本,并且(仅)如果您使用的是同一文件系统,则可以非常非常快地创建它们。
检查一下cp -l
,看看是否适合您。
这是一个分布式/并行和分散式文件复制工具,它将对文件进行分块并并行复制所有块。如果您拥有支持多个流的SSD或带有多个磁盘头的某种设置,它可能只会对您有所帮助。
对于认为这不是一个好主意的人,我会说这取决于。您可以拥有大型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时绝对显示出更好的性能。平行。