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
、 或甚至tar
和gzip
或bzip2
,然後使用scp
生成的存檔(然後使用 進行連接ssh
,並進行解包)。
答案3
我已經遇到了 scp 的問題,同一網路上的兩台機器具有千兆位元連接,透過 scp 傳輸速度非常慢。
如果您不需要加密,那麼使用 ftp 或 nfs 肯定會有所幫助。
我發現問題是其中一台機器的 RAM 很慢,而且 ssh 加密部分對該機器的要求非常高。使用 ftp 或 nfs 解決了我的問題,我的速度從 15-20 MB/s 提高到 100+ MBps。
[編輯]
我剛剛發現它使用優秀的 rsync 而不是 scp。不能解決您的全部問題,但可以提供協助。