scp 명령을 병렬화하는 방법은 무엇입니까?

scp 명령을 병렬화하는 방법은 무엇입니까?

machineB에서 파일을 scp해야 machineC합니다 machineA. 에서 아래 쉘 스크립트를 실행하고 있습니다 machineA. SSH 키를 올바르게 설정했습니다.

파일이 에 없으면 machineB에 있어야 합니다 machineC. 아래 쉘 스크립트에 표시된 대로 모든 PARTITION1 및 PARTITION2 파일을 machineA 해당 폴더로 이동해야 합니다.

#!/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개의 파일이 있으므로 파일을 하나씩 이동하므로 꽤 느릴 수 있습니다. 프로세스 속도를 높일 수 있는 방법이 있습니까?

우분투 12.04를 실행 중입니다.

답변1

양쪽이 SSD에서 실행되지 않는 한 SCP를 병렬화하는 것은 비생산적입니다. SCP의 가장 느린 부분은 네트워크를 약화시키는 것이며, 이 경우 병렬화가 전혀 도움이 되지 않거나 양쪽의 디스크가 병렬화로 인해 더욱 악화될 것입니다. 탐색 시간이 당신을 죽일 것입니다.

machineA가 SSD에 있다고 가정하면 머신당 병렬화만으로 충분합니다. 이를 수행하는 가장 간단한 방법은 첫 번째 forloop를 서브셸로 래핑하고 배경을 지정하는 것입니다.

( 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또는 심지어 targzip또는 을 사용한 bzip2다음 scp결과 아카이브를 사용할 수 있습니다(그런 다음 에 연결하고 ssh압축 풀기 수행).

답변3

저는 이미 scp를 통해 매우 느리게 전송되는 기가비트 연결을 사용하는 동일한 네트워크에 있는 두 시스템인 scp에 문제가 있었습니다.

암호화가 필요하지 않다면 ftp나 nfs를 사용하는 것이 확실히 도움이 될 것입니다.

문제는 기계 중 하나의 RAM이 느리고 SSH 암호화 부분이 이 기계에 매우 까다롭다는 것이었습니다. ftp나 nfs를 사용하면 문제가 해결되어 15-20MB/s에서 100MBps 이상으로 향상되었습니다.

[편집하다]

방금 scp 대신 우수한 rsync를 사용하는 이것을 발견했습니다. 전체 문제를 해결하지는 못하지만 도움이 될 수 있습니다.

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

관련 정보