我必须将大约25个文件从一台机器复制到另一台机器。每个文件大小约为15 GB。我有1GB的链接,这两台机器都是非常强大的盒子。他们有大约40 CPUS。现在要复制所有这些文件,我需要50分钟。
下面是我在我应该复制文件的盒子上运行的脚本。它复制了/data01/test_primary
文件夹中的15个文件以及它在/data02/test_secondary
中复制的其他10个文件。逻辑非常简单,我弄清楚从哪个本地机器复制数据,如果本地机器关闭,那么我去远程机器并复制数据。
export PRIMARY=/data01/test_primary
export SECONDARY=/data02/test_secondary
export dir3=/bat/data/snapshot/20180227
PRIMARY_FILES=(685 959 682 679 688 651 909 906 657 881 884 878 853 707 847)
SECONDARY_FILES=(950 883 887 890 1001 994 997 1058 981 833)
export LOCATION_1="machineA"
export LOCATION_2="machineB"
export LOCATION_3="machineC"
do_Copy() {
el=$1
PRIMSEC=$2
scp golden@"$LOCATION_1":"$dir3"/proc_"$el"_5.data "$PRIMSEC"/. || scp golden@"$LOCATION_2":"$dir3"/proc_"$el"_5.data "$PRIMSEC"/. || scp golden@"$LOCATION_3":"$dir3"/proc_"$el"_5.data "$PRIMSEC"/. || exit 1
}
export -f do_Copy
parallel -j 5 do_Copy {} $PRIMARY ::: ${PRIMARY_FILES[@]} &
parallel -j 5 do_Copy {} $SECONDARY ::: ${SECONDARY_FILES[@]} &
wait
echo "All copied."
我认为我的脚本的主要问题是我可能会为每个文件打开一个单独的scp连接,这会增加很多不必要的开销。我可以在这里优化一下吗?所以我想我可以在这里做一些改进,以便它可以快速复制。截至目前,我正在将scp与gnu-parallel结合使用,以便实现并行性。
我有什么选择加快速度?我准备尝试不同的事情,看看它是否有助于我。
答案 0 :(得分:1)
启用 scp ( - C标志)压缩可能会加快速度(取决于数据)。记住,你有很多CPU不需要很长时间来压缩。
或者,如果可能的话,另一种选择是使用 rsync (-z启用压缩)而不是scp。 rsync添加了一些优化以使操作更快,并且还具有特殊的delta传输算法(在updatng文件的情况下)