如何並行化 scp 指令?

如何並行化 scp 指令?

machineB我需要 scp 來自和machineC到的檔案machineA。我正在運行下面的 shell 腳本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

目前,我在 PARTITION1 和 PARTITION2 中有 5 個文件,但一般來說它會有大約 420 個文件,所以這意味著它將一個一個地移動文件,我認為這可能會非常慢。有什麼辦法可以加快這個過程嗎?

我運行的是 Ubuntu 12.04

答案1

並行 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 ) &

答案2

您可以使用 GNU Parallel 來幫助您並行執行多個任務。

但是,在您的情況下,您似乎正在為每個文件傳輸建立單獨的安全連接,這確實可能效率很低,特別是如果其他電腦不在本地網路上。

最好的方法是使用專門進行批量文件傳輸的工具 - 例如,rsync它也可以透過普通 ssh 進行工作。

如果 rsync 不可用,作為替代方案,您可以使用zip、 或甚至targzipbzip2,然後使用scp生成的存檔(然後使用 進行連接ssh,並進行解包)。

答案3

我已經遇到了 scp 的問題,同一網路上的兩台機器具有千兆位元連接,透過 scp 傳輸速度非常慢。

如果您不需要加密,那麼使用 ftp 或 nfs 肯定會有所幫助。

我發現問題是其中一台機器的 RAM 很慢,而且 ssh 加密部分對該機器的要求非常高。使用 ftp 或 nfs 解決了我的問題,我的速度從 15-20 MB/s 提高到 100+ MBps。

[編輯]

我剛剛發現它使用優秀的 rsync 而不是 scp。不能解決您的全部問題,但可以提供協助。

https://gist.github.com/KartikTalwar/4393116

相關內容