如何并行化scp命令?

ars*_*nal 5 linux ubuntu shell bash scp

我需要从SCP的文件machineB,并machineCmachineA。我正在从machineA. 我已经正确设置了 ssh 密钥。

如果文件不存在的machineB,那么它应该是那里machineC。我需要将所有 PARTITION1 和 PARTITION2 文件移动到 machineA 各自的文件夹中,如下所示在我的 shell 脚本中 -

#!/bin/bash

readonly PRIMARY=/export/home/david/dist/primary
readonly SECONDARY=/export/home/david/dist/secondary
readonly FILERS_LOCATION=(machineB machineC)
readonly MAPPED_LOCATION=/bat/data/snapshot
PARTITION1=(0 3 5 7 9)
PARTITION2=(1 2 4 6 8)

dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)

length1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} "ls '$dir1' | wc -l")
length2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} "ls '$dir2' | wc -l")

if [ "$dir1" = "$dir2" ] && [ "$length1" -gt 0 ] && [ "$length2" -gt 0 ]
then
    rm -r $PRIMARY/*
    rm -r $SECONDARY/*
    for el in "${PARTITION1[@]}"
    do
        scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.
    done
    for sl in "${PARTITION2[@]}"
    do    
        scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/.
    done
fi
Run Code Online (Sandbox Code Playgroud)

目前,我在 PARTITION1 和 PARTITION2 中有 5 个文件,但一般来说它会有大约 420 个文件,所以这意味着它会一个一个地移动文件,我认为这可能会很慢。有什么办法可以加快这个过程吗?

我正在运行 Ubuntu 12.04

Den*_*ker 7

并行 SCP 会适得其反,除非双方都运行在 SSD 上。SCP 最慢的部分是网络萎缩,在这种情况下并行化根本没有帮助,或者是两边的磁盘,并行化会让情况变得更糟:寻道时间会杀了你。

你说machineA在SSD上,所以每台机器并行化应该足够了。最简单的方法是将第一个 forloop 包装在子 shell 中并将其置于后台。

( for el in "${PARTITION1[@]}"
do
    scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.
done ) &
Run Code Online (Sandbox Code Playgroud)

  • 我遇到过这样的情况:既不是磁盘带宽也不是网络带宽限制了性能。这是网络延迟。在这种情况下,我通过使用 GNU Parallel 获得了 3 倍的性能提升(请参阅其他答案)。 (3认同)