【发布时间】:2018-08-10 04:29:20
【问题描述】:
我必须将大约 25 个文件从一台机器复制到另一台机器。每个文件大小约为 15 GB。我有 1GB 链接,这两台机器都是非常强大的盒子。他们有大约 40 个 CPU。现在要复制所有这些文件,我需要 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 结合起来,以便实现并行性。
我有哪些选项可以加快速度?我准备尝试不同的东西,看看它是否对我有帮助。
【问题讨论】:
-
我猜连接开销与 15GB 文件的传输时间相比可以忽略不计。如果适合您的环境,我会尝试禁用加密或使用 arcfour 或 blowfish。
-
在 1Gb/s 链路上,每个 GB 至少需要 8 秒,因此一个 15GB 的文件需要 2 分钟,而 25 个这样的文件需要 50 分钟,因此您的网络带宽已经饱和。如果它们是强大的机器,那么像@GonzaloMatheu 建议的那样,花时间压缩数据以使其通过狭窄的管道是值得的。最好的选择是购买几个 15 美元的千兆以太网适配器……
-
我正在复制内存映射文件,所以看看压缩是否对我有帮助。过去我在启用压缩的情况下进行了类似的测试,但它根本没有帮助我.. 另外我怎样才能在这里禁用加密?如here 所述,我使用
tar和nc进行了另一次测试,看起来使用这种方法的文件传输比与scp或rsync相比更快。不知道为什么.. -
使用
tar不太可能产生影响——这只适用于数千个小文件。基本上,你的管道在整个 50 分钟内都是 100% 满的,所以物理学对你不利。您只有 2 个选项。 1) 购买更粗的管道,即 10GbE,或更多管道,即 2 倍 1GbE。或者 2) 如果只有部分数据发生变化,则通过压缩或更智能的算法(即rsync)减少数据量。 -
我会尝试使用压缩来看看它是否对我有帮助。就我而言,我是从头开始复制所有新文件。
标签: linux bash file-transfer scp gnu-parallel