我经常需要将源磁盘备份到多个目标磁盘。目前的工作流程是rsync
从来源到目标1然后dd
克隆目标1到目标2。
如果我rsync
能从来源到目标1+目标2在同一读取操作中顺序执行,以大大加快速度。将文件一次读入内存,然后同步写入两个单独的硬盘。
有没有办法将rsync
文件读入内存并同时将输出传送到两个写入操作?没有有但那rsync
会更受欢迎。
答案1
综合来自多个来源的信息,有几种选择。
结论是,只有命令parallel
您可能会得到您想要的,请参见下文。
重要笔记:
- 我已经对复制进行了测试
cp
。您还应该考虑使用rsync
vscp
或其他替代命令与 结合获得的速度提升(或降低!)parallel
。 - 我已经测试过只复制一个文件。如果复制多个文件(例如,根据需要将几个大文件与许多其他小文件和子目录合并),结果可能会发生变化。
对于每个选项,我都测试了
time <option #N, copying to one target>
time <option #N, copying to two targets>
进行比较,文件大小为 1.2Gb。此外,在某些情况下,我测试了两到三次相同的命令,以评估结果的分散性。我没有计算平均值和标准差,但结果很明显。
这是我在上述测试条件下得到的结果,并附有简短注释。我将多个测试的结果(只要可用)串联在一行中。
这基本情况:
$ time cp -p source/file1 target1/
real 0m0,846s 0m0,680s 0m0,659s
user 0m0,000s 0m0,001s 0m0,016s
sys 0m0,777s 0m0,662s 0m0,643s
这复制选项:
选项
parallel
$ parallel cp -p source/file1 ::: target1/ real 0m0,745s 0m0,740s user 0m0,121s 0m0,108s sys 0m0,609s 0m0,619s $ parallel cp -p source/file1 ::: target1/ target2/ real 0m0,794s 0m0,860s user 0m0,116s 0m0,134s sys 0m1,300s 0m1,380s
选项
tee
(附加> /dev/null
以避免输出到stdout
)$ tee target1/file1 < source/file1 > /dev/null real 0m0,874s 0m1,040s 0m1,028s user 0m0,160s 0m0,172s 0m0,137s sys 0m0,714s 0m0,868s 0m0,887s $ tee target1/file1 target2/file1 < source/file1 > /dev/null real 0m1,802s 0m1,680s 0m1,833s user 0m0,136s 0m0,212s 0m0,197s sys 0m1,642s 0m1,468s 0m1,619s
复制到两个
target
s 大约会使复制到一个 s 的时间翻倍target
,这比复制到另一个 s 的时间略大一些。基本情况。选项
xargs
$ echo target1 | xargs -n 1 cp -p source/file1 real 0m0,666s user 0m0,021s sys 0m0,646s $ echo target1 target2 | xargs -n 1 cp -p source/file1 real 0m1,197s user 0m0,018s sys 0m1,173s
复制到两个
target
s 大约会使复制到一个 s 的时间翻倍target
,这与复制到基本情况。选项
find
$ find target1 -exec cp -p source/file1 {} \; real 0m2,167s user 0m0,017s sys 0m1,627s $ find target1 target2 -exec cp -p source/file1 {} \; real 0m3,905s user 0m0,020s sys 0m3,185s
复制到两个
target
s 大约会使复制到一个 s 的时间翻倍target
,这比复制到另一个 s 的时间要大得多。基本情况...明显的失败者。
“多次复制”的来源:
- https://www.cyberciti.biz/faq/linux-unix-copy-a-file-to-multiple-directories-using-cp-command/
- 如何使用命令行将文件复制到多个文件夹?
- https://stackoverflow.com/questions/195655/how-to-copy-a-file-to-multiple-directories-using-the-gnu-cp-command
性能cp
与来源rsync
:
- https://unix.stackexchange.com/questions/91382/rsync-is-very-slow-factor-8-to-10-compared-to-cp-on-copying-files-from-nfs-sha
- https://lwn.net/Articles/400489/
- https://superuser.com/questions/1170636/why-is-there-a-write-speed-difference-between-dd-cp-rsync-and-macos-finder-to
- ` cp ` 和 ` rsync ` 有什么区别?
答案2
rsync
有一个批处理模式您可以尝试一下。当您执行时,rsync --write-batch=foo from to
它将执行常规复制,但也会将指令和数据复制到文件中foo
。如果这不是文件,而是 fifo,您可以并行使用第二个 rsync 来读取 fifo 并对不同的目标执行新的 rsync。显然,新目标必须与原始目标足够相似才有意义。
例如,通过网络,你可以尝试
mkfifo myfifo
ssh remotec 'rsync -av --read-batch=- destc' <myfifo &
sleep 1
rsync -av --write-batch=myfifo srca/ remoteb:destb
--read-batch
不能与样式目标一起使用remote:destc
。