在Unix上执行并行复制的最佳方法是什么?


18

我通常必须将网络文件系统上文件夹的内容复制到本地计算机上。远程文件夹上有许多文件(1000个),它们都相对较小,但是由于网络开销,常规副本cp remote_folder/* ~/local_folder/需要很长时间(10分钟)。

我相信这是因为文件是按顺序复制的-每个文件都等到前一个文件完成后才开始复制。

提高此副本速度的最简单方法是什么?(我假设它是并行执行复制的。)

在复制之前压缩文件并不一定会加快处理速度,因为它们可能全部保存在不同服务器上的不同磁盘上。


在复制之前压缩文件会大大加快处理速度,因为不再需要“您是否获得了该文件”,“是的,我做到了”,“下一个是这里”,“还可以”,...就是这些让您慢下来的“周转”。
David Schwartz 2013年

限制因素可能是磁盘速度,而不是网络速度,如果是这种情况,则并行执行每个文件操作会使速度变慢,而不是更快,因为您将迫使磁盘不断地来回搜索文件之间。
Joel Coehoorn 2013年

尽管压缩不是一个好主意(运行压缩算法可能需要花费一千多个文件),但tar还是可行的。
罗布

@JoelCoehoorn仍然有这种情况,例如:多个主轴+小文件(或只是随机读取)。在这种情况下,“ parallel cp”会有所帮助。
CAFxX

Answers:


8

只要限制正在运行的复制命令,就可以使用脚本,例如Scrutinizer发布的脚本。

SOURCEDIR="$1"
TARGETDIR="$2"
MAX_PARALLEL=4
nroffiles=$(ls "$SOURCEDIR" | wc -w)
setsize=$(( nroffiles/MAX_PARALLEL + 1 ))
ls -1 "$SOURCEDIR"/* | xargs -n "$setsize" | while read workset; do
  cp -p "$workset" "$TARGETDIR" &
done
wait

1
但是请注意警告:该脚本会中断包含空格或通配符的文件名。
slhck 2011年

@OldWolf-您能解释一下此脚本的工作原理吗?例如,并行化是哪一部分?
dsg

3
@dsg:命令&末尾的@ cp允许while循环继续并无需等待就启动下一个cp命令。该xargs命令将文件名以4组(MAX_PARALLEL)的形式传递给while循环。
RedGrittyBrick 2011年

不适合我。我不确定是否可以加快速度cp。您显然可以通过多线程来加快计算速度。但是我不认为硬盘数据处理同样适用。
Adobe

9

如果您安装了GNU Parallel http://www.gnu.org/software/parallel/,则可以执行以下操作:

parallel -j10 cp {} destdir/ ::: *

您可以通过以下方式简单地安装GNU Parallel:

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 3374ec53bacb199b245af2dda86df6c9
12345678 3374ec53 bacb199b 245af2dd a86df6c9
$ md5sum install.sh | grep 029a9ac06e8b5bc6052eac57b2c3c9ca
029a9ac0 6e8b5bc6 052eac57 b2c3c9ca
$ sha512sum install.sh | grep f517006d9897747bed8a4694b1acba1b
40f53af6 9e20dae5 713ba06c f517006d 9897747b ed8a4694 b1acba1b 1464beb4
60055629 3f2356f3 3e9c4e3c 76e3f3af a9db4b32 bd33322b 975696fc e6b23cfb
$ bash install.sh

观看GNU Parallel的介绍视频以了解更多信息:https : //www.youtube.com/playlist?list=PL284C9FF2488BC6D1


3

一种方法是使用rsync,它将仅复制更改-新文件和其他文件的更改部分。

http://linux.die.net/man/1/rsync

运行任何形式的并行复制操作可能会淹没您的网络,并且复制操作只会陷入停顿或遭受源磁盘或目标磁盘瓶颈的困扰。


2

老实说,最好的工具是Google的gsutil。它通过目录递归处理并行副本。我见过的大多数其他方法都无法处理目录递归。他们并没有在文档中特别提及本地文件系统到本地文件系统副本,但它的工作原理很吸引人。

这是另一个要安装的二进制文件,但是考虑到当今所有云服务的采用,您可能已经运行了一个二进制文件。


2

使用find并行rsync:

export SOURCE_DIR=/a/path/to/nowhere
export DEST_DIR=/another/path/to/nowhere

# sync folder structure first
rsync -a -f'+ */' -f'- *' $SOURCE_DIR $DEST_DIR

# cwd
cd $SOURCE_DIR

# use find to help filter files etc. into list and pipe into gnu parallel to run 4 rsync jobs simultaneously
find . -type f | SHELL=/bin/sh parallel --linebuffer --jobs=4 'rsync -av {} $DEST_DIR/{//}/'

在企业局域网上,单个rsync的速度约为800Mbps;通过6-8个工作,我能够获得超过2.5Gbps的速度(以高负载为代价)。受磁盘限制。


0

根据您所拥有的拓扑,可能需要考虑许多事项。但是,在开始考虑复杂的解决方案之前,您可以简单地尝试将任务分为两个工作,并检查所需时间是否会大大减少:

下次尝试:

  cp remote_folder/[a-l]* ~/local_folder/ &
  cp remote_folder/[!a-l]* ~/local_folder/ &
  wait
  wait

(您可能希望将[al] *替换为与文件一半匹配的其他内容-可能是[0-4] *-取决于文件夹的内容)

如果时间没有得到显着改善,则检查是否有必要复制所有文件(更改后的文件与所有文件的比率是多少)可能更为重要。

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.