【问题标题】:speed up file transfers from one machine to other machine加快文件从一台机器到另一台机器的传输
【发布时间】: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 文件的传输时间相比可以忽略不计。如果适合您的环境,我会尝试禁用加密或使用 arcfourblowfish
  • 在 1Gb/s 链路上,每个 GB 至少需要 8 秒,因此一个 15GB 的文件需要 2 分钟,而 25 个这样的文件需要 50 分钟,因此您的网络带宽已经饱和。如果它们是强大的机器,那么像@GonzaloMatheu 建议的那样,花时间压缩数据以使其通过狭窄的管道是值得的。最好的选择是购买几个 15 美元的千兆以太网适配器……
  • 我正在复制内存映射文件,所以看看压缩是否对我有帮助。过去我在启用压缩的情况下进行了类似的测试,但它根本没有帮助我.. 另外我怎样才能在这里禁用加密?如here 所述,我使用tarnc 进行了另一次测试,看起来使用这种方法的文件传输比与scprsync 相比更快。不知道为什么..
  • 使用tar 不太可能产生影响——这只适用于数千个小文件。基本上,你的管道在整个 50 分钟内都是 100% 满的,所以物理学对你不利。您只有 2 个选项。 1) 购买更粗的管道,即 10GbE,或更多管道,即 2 倍 1GbE。或者 2) 如果只有部分数据发生变化,则通过压缩或更智能的算法(即rsync)减少数据量。
  • 我会尝试使用压缩来看看它是否对我有帮助。就我而言,我是从头开始复制所有新文件。

标签: linux bash file-transfer scp gnu-parallel


【解决方案1】:

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

rsync 在您只复制差异时很好。根据您的描述,这些文件听起来好像是新文件,而不仅仅是现有文件的更新。

新文件是否与现有文件相似?在这种情况下,您可以这样做:

receiver$ cp existing new
receiver$ rsync sender:new new

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我有一个正在复制的内存映射文件。你认为压缩在这里会有帮助吗?我尝试使用scprsync 复制一个文件,我注意到 scp 不知何故更快?不知道为什么..就我而言,我们没有更新任何东西..只是再次复制新文件..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2011-07-12
    • 2015-08-07
    相关资源
    最近更新 更多