我必须将大约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结合使用,以便实现并行性。
我有什么选择加快速度?我准备尝试不同的东西,看看它是否有助于我。
启用scp(-C标志)压缩可能会加快速度(取决于数据)。记住,你有很多CPU不应该花费很长时间来压缩。
或者,如果可能的话,另一种替代方法是使用rsync(-z使能压缩)而不是scp。 rsync添加了一些优化以使操作更快,并且还具有特殊的delta传输算法(在updatng文件的情况下)
我必须将大约25个文件从一台机器复制到另一台机器。
当你只复制差异时,rsync
是好的。从您的描述中听起来好像文件是新文件,而不仅仅是现有文件的更新。
新文件看起来与现有文件类似吗?在这种情况下,您可以这样做:
receiver$ cp existing new
receiver$ rsync sender:new new