유닉스에서 병렬 복사를 수행하는 가장 좋은 방법은 무엇입니까?


18

네트워크 파일 시스템의 폴더 내용을 로컬 컴퓨터에 정기적으로 복사해야합니다. 원격 폴더에는 비교적 작은 파일 (1000)이 많지만 네트워크 오버 헤드로 인해 일반 복사 cp remote_folder/* ~/local_folder/에는 시간이 매우 오래 걸립니다 (10 분).

파일이 순차적으로 복사되기 때문이라고 생각합니다. 각 파일은 복사가 시작되기 전에 이전 파일이 완료 될 때까지 기다립니다.

이 사본의 속도를 높이는 가장 간단한 방법은 무엇입니까? (복사를 병렬로 수행한다고 가정합니다.)

복사하기 전에 파일을 압축하면 파일이 모두 다른 서버의 다른 디스크에 저장 될 수 있기 때문에 속도를 높일 필요는 없습니다.


복사하기 전에 파일을 압축하면 더 빨리 "파일을 얻었습니까?" 당신을 늦추는 "반환".
David Schwartz

아마도 네트워크 속도가 아닌 디스크 속도 일 것입니다.이 경우 제한 요소입니다.이 경우 파일 당 병렬로 작업 을 수행하면 디스크가 지속적으로 앞뒤로 탐색해야하기 때문에 작업 속도가 느려 지지 않습니다. 파일 사이.
Joel Coehoorn

압축은 좋은 생각이 아니지만 (1000 개 이상의 파일을 압축 알고리즘을 실행하는 데 시간이 조금 걸릴 수 있음) tar는 실행 가능할 수 있습니다.
Rob

@JoelCoehoorn, 여전히 그렇지 않은 경우가 있습니다 : 예 : 여러 스핀들 + 작은 파일 (또는 단순히 임의의 읽기). 이 시나리오에서는 "병렬 cp"가 도움이됩니다.
CAFxX

답변:


8

실행중인 복사 명령을 제한하는 한 Scrutinizer가 게시 한 스크립트와 같은 스크립트를 사용할 수 있습니다.

SOURCEDIR="$1"
TARGETDIR="$2"
MAX_PARALLEL=4
nroffiles=$(ls "$SOURCEDIR" | wc -w)
setsize=$(( nroffiles/MAX_PARALLEL + 1 ))
ls -1 "$SOURCEDIR"/* | xargs -n "$setsize" | while read workset; do
  cp -p "$workset" "$TARGETDIR" &
done
wait

1
경고주의 사항 : 이 스크립트는 공백이나 글러브 문자가 포함 된 파일 이름으로 중단 됩니다.
slhck

@OldWolf-이 스크립트가 어떻게 작동하는지 설명 할 수 있습니까? 예를 들어, 병렬화는 어느 부분입니까?
dsg

3
@dsg : 명령 &의 끝에 cp있는 while루프 는 루프없이 계속해서 다음 cp 명령을 시작하도록 허용합니다 . 이 xargs명령은 파일 이름을 4 개 그룹 (MAX_PARALLEL)으로 while루프에 전달합니다.
RedGrittyBrick

나를 위해 일하지 않았다. 속도를 높일 수 있는지 잘 모르겠습니다 cp. 멀티 스레딩을 통해 계산 속도를 분명히 높일 수 있습니다 . 그러나 하드 드라이브 데이터 대처에 대해서도 마찬가지라고 생각합니다.
Adobe

9

GNU Parallel http://www.gnu.org/software/parallel/을 설치 한 경우 다음을 수행 할 수 있습니다.

parallel -j10 cp {} destdir/ ::: *

다음과 같이 GNU Parallel을 간단하게 설치할 수 있습니다.

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 3374ec53bacb199b245af2dda86df6c9
12345678 3374ec53 bacb199b 245af2dd a86df6c9
$ md5sum install.sh | grep 029a9ac06e8b5bc6052eac57b2c3c9ca
029a9ac0 6e8b5bc6 052eac57 b2c3c9ca
$ sha512sum install.sh | grep f517006d9897747bed8a4694b1acba1b
40f53af6 9e20dae5 713ba06c f517006d 9897747b ed8a4694 b1acba1b 1464beb4
60055629 3f2356f3 3e9c4e3c 76e3f3af a9db4b32 bd33322b 975696fc e6b23cfb
$ bash install.sh

자세한 내용은 GNU Parallel 소개 동영상을 참조하십시오 . https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


3

한 가지 방법은 새 파일과 다른 파일의 변경된 부분 만 변경 사항을 복사하는 rsync 를 사용 하는 것입니다.

http://linux.die.net/man/1/rsync

모든 형태의 병렬 복사 작업을 실행하면 네트워크가 초과 될 수 있으며 복사 작업이 중단되거나 소스 또는 대상 디스크의 병목 현상이 발생합니다.


2

솔직히 가장 좋은 도구는 Google의 gsutil입니다. 디렉토리 재귀로 병렬 사본을 처리합니다. 내가 본 다른 방법의 대부분은 디렉토리 재귀를 처리 할 수 ​​없습니다. 문서에서 로컬 파일 시스템에 대한 로컬 파일 시스템에 대해서는 언급하지 않았지만 매력처럼 작동합니다.

설치하는 또 다른 바이너리이지만 요즘 모든 클라우드 서비스 채택을 고려하여 이미 실행했을 수도 있습니다.


2

find를 사용한 병렬 rsync :

export SOURCE_DIR=/a/path/to/nowhere
export DEST_DIR=/another/path/to/nowhere

# sync folder structure first
rsync -a -f'+ */' -f'- *' $SOURCE_DIR $DEST_DIR

# cwd
cd $SOURCE_DIR

# use find to help filter files etc. into list and pipe into gnu parallel to run 4 rsync jobs simultaneously
find . -type f | SHELL=/bin/sh parallel --linebuffer --jobs=4 'rsync -av {} $DEST_DIR/{//}/'

회사 LAN에서 단일 rsync는 약 800Mbps를 수행합니다. 6-8 개의 작업으로 2.5Gbps 이상을 얻을 수 있습니다 (높은 부하로 인해). 디스크에 의해 제한됩니다.


0

가지고있는 토폴로지에 따라 고려해야 할 사항이 많이 있습니다. 그러나 복잡한 솔루션에 대해 생각하기 전에 작업을 두 작업으로 나누고 필요한 시간이 크게 단축되는지 확인하면됩니다.

다음에 시도해보십시오 :

  cp remote_folder/[a-l]* ~/local_folder/ &
  cp remote_folder/[!a-l]* ~/local_folder/ &
  wait
  wait

([al] *를 폴더의 내용에 따라 파일의 약 절반과 일치하는 다른 것으로 대체하고 싶을 수도 있습니다. 아마도 [0-4] *)

시간이 크게 향상되지 않으면 모든 파일을 복사해야하는지 확인하는 것이 더 중요 할 수 있습니다 (변경된 파일과 모든 파일의 비율은 얼마입니까?)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.