加速从一台机器到另一台机器的文件传输

问题描述 投票:2回答:2

我必须将大约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结合使用,以便实现并行性。

我有什么选择加快速度?我准备尝试不同的东西,看看它是否有助于我。

linux bash file-transfer scp gnu-parallel
2个回答
1
投票

启用scp(-C标志)压缩可能会加快速度(取决于数据)。记住,你有很多CPU不应该花费很长时间来压缩。

或者,如果可能的话,另一种替代方法是使用rsync(-z使能压缩)而不是scp。 rsync添加了一些优化以使操作更快,并且还具有特殊的delta传输算法(在updatng文件的情况下)


0
投票

我必须将大约25个文件从一台机器复制到另一台机器。

当你只复制差异时,rsync是好的。从您的描述中听起来好像文件是新文件,而不仅仅是现有文件的更新。

新文件看起来与现有文件类似吗?在这种情况下,您可以这样做:

receiver$ cp existing new
receiver$ rsync sender:new new
© www.soinside.com 2019 - 2024. All rights reserved.