GNU Parallel을 사용하여 병렬화 rsync


18

rsync스크립트를 사용하여 한 호스트의 데이터를 다른 호스트의 데이터와 동기화했습니다. 데이터에는 거의 1.2TB에 기여하는 수많은 소형 파일이 있습니다.

해당 파일을 동기화하기 위해 rsync다음과 같은 명령을 사용 하고 있습니다.

rsync -avzm --stats --human-readable --include-from proj.lst /data/projects REMOTEHOST:/data/

proj.lst의 내용은 다음과 같습니다.

+ proj1
+ proj1/*
+ proj1/*/*
+ proj1/*/*/*.tar
+ proj1/*/*/*.pdf
+ proj2
+ proj2/*
+ proj2/*/*
+ proj2/*/*/*.tar
+ proj2/*/*/*.pdf
...
...
...
- *

테스트로 두 프로젝트 (8.5GB의 데이터) 중 두 가지를 선택하여 위의 명령을 실행했습니다. 순차적 프로세스이므로 완료하는 데 14 분 58 초가 소요됩니다. 따라서 1.2TB의 데이터에는 몇 시간이 걸립니다.

나는 여러 수 할 경우 rsync병렬 프로세스 (사용 &, xargs또는 parallel), 내 시간을 절약 할 것이다.

parallel( cd소스 디렉토리에 연결 한 후) 아래 명령을 사용 하여 실행하는 데 12 분 37 초가 걸렸습니다.

parallel --will-cite -j 5 rsync -avzm --stats --human-readable {} REMOTEHOST:/data/ ::: .

시간이 5 배 단축 되었으나 그렇지 않았습니다. 나는 어딘가에 잘못 가고 있다고 생각합니다.

rsync실행 시간을 줄이기 위해 여러 프로세스를 어떻게 실행할 수 있습니까?


1
네트워크 대역폭에 제한이 있습니까? 디스크 iops? 디스크 대역폭?
Ole Tange

가능하면 총 대역폭의 50 %를 사용하려고합니다. 그러나 여러 rsyncs를 병렬화하는 것이 최우선 과제입니다.
Mandar Shinde

네트워크 대역폭, 디스크 iops, 디스크 대역폭 및 실제로 사용 된 대역폭을 알려주시겠습니까?
Ole Tange

사실, 나는 위의 매개 변수에 대해 모른다. 당분간 최적화 부분을 무시할 수 있습니다. 여러 개의 rsync병렬 병렬이 현재 주요 초점입니다.
Mandar Shinde

제한이 CPU가 아닌 경우 병렬로 진행할 필요가 없습니다. 심지어 문제를 악화시킬 수도 있습니다 (소스 또는 대상 디스크에서 디스크 암 이동이 충돌 함).
xenoid

답변:


16

다음 단계는 나를 위해 일했습니다.

  1. rsync --dry-run영향을받는 파일 목록을 얻으려면 첫 번째를 실행하십시오 .
$ rsync -avzm --stats --safe-links --ignore-existing --dry-run \
    --human-readable /data/projects REMOTE-HOST:/data/ > /tmp/transfer.log
  1. I는 출력 공급 cat transfer.log로를 parallel5 개 실행하기 위해 rsync, 다음과 같이 병렬들 :
$ cat /tmp/transfer.log | \
    parallel --will-cite -j 5 rsync -avzm --relative \
      --stats --safe-links --ignore-existing \
      --human-readable {} REMOTE-HOST:/data/ > result.log

여기서 --relative옵션 ( link )은 소스 및 대상에서 영향을받는 파일의 디렉토리 구조가 디렉토리 내에서 동일하게 유지 /data/되도록 명령을 소스 폴더 (예 :)에서 실행해야합니다 /data/projects.


5
파일 당 rsync를 수행합니다. split해당 파일 이름을 사용하여 전체 파일 목록을 분할하고 병렬로 제공하는 것이 더 효율적일 것입니다 . 그런 다음 rsync를 사용 --files-from하여 각 파일에서 파일 이름을 가져 와서 동기화하십시오. rm backups. * split -l 3000 backup.list 백업. ls 백업. * | 병렬 --line-buffer --verbose -j 5 rsync --progress -av --files-from {} / LOCAL / PARENT / PATH / REMOTE_HOST : REMOTE_PATH /
Sandip Bhattacharya

1
두 번째 rsync 명령은 파일이 아닌 result.log의 행을 어떻게 처리합니까? 즉 receiving file list ... done created directory /data/.
Mike D

1
최신 버전의 rsync (3.1.0 이상)에서는 --info=name대신에 사용할 수 -v있으며 파일과 디렉토리의 이름 만 얻을 수 있습니다. 파일에 공백이나 쉘 메타 문자가있을 수있는 경우 --protect-args를 'inner'전송 rsync에도 사용할 수 있습니다.
치타

13

나는 개인적 으로이 간단한 것을 사용합니다 :

ls -1 | parallel rsync -a {} /destination/directory/

비어 있지 않은 디렉토리가 몇 개 이상인 경우에만 유용합니다. 그렇지 않으면 거의 모든 rsync종료와 마지막으로 모든 작업을 단독으로 수행하게됩니다.


이것은 잘 작동합니다-무언가를하고 있는지 알기가 어렵 기 때문에 -v 대 병렬은 더 수다 스럽습니다. 또한 -j 30을 병렬로 (즉, rsync 명령 전에) 기본값 인 CPU 코어 당 하나가 아니라 30 개의 작업을 실행합니다.
Criggie

12

나는 누군가가 허용 된 대답을 사용하지 못하게 할 것을 강력히 권장합니다. 더 나은 해결책은 최상위 디렉토리를 크롤링하고 비례 수의 rync 작업을 시작하는 것입니다.

큰 zfs 볼륨이 있고 소스는 cifs 마운트였습니다. 둘 다 10G와 연결되어 있으며 일부 벤치 마크에서는 링크를 포화시킬 수 있습니다. 를 사용하여 성능을 평가 하였다 zpool iostat 1.

소스 드라이브는 다음과 같이 마운트되었습니다.

mount -t cifs -o username=,password= //static_ip/70tb /mnt/Datahoarder_Mount/ -o vers=3.0

단일 rsync프로세스 사용 :

rsync -h -v -r -P -t /mnt/Datahoarder_Mount/ /StoragePod

io 미터는 다음과 같이 읽습니다.

StoragePod  30.0T   144T      0  1.61K      0   130M
StoragePod  30.0T   144T      0  1.61K      0   130M
StoragePod  30.0T   144T      0  1.62K      0   130M

이는 합성 벤치 마크 (크리스탈 디스크)에서 순차 쓰기 성능이 900MB / s에 가까워 링크가 포화 상태임을 의미합니다. 130MB / s는 그리 좋지 않고 주말과 2 주를 기다리는 것의 차이점입니다.

그래서 파일 목록을 작성하고 동기화를 다시 시도했습니다 (64 코어 시스템이 있음).

cat /home/misha/Desktop/rsync_logs_syncs/Datahoarder_Mount.log | parallel --will-cite -j 16 rsync -avzm --relative --stats --safe-links --size-only --human-readable {} /StoragePod/ > /home/misha/Desktop/rsync_logs_syncs/Datahoarder_Mount_result.log

그리고 같은 성능을 보였습니다!

StoragePod  29.9T   144T      0  1.63K      0   130M
StoragePod  29.9T   144T      0  1.62K      0   130M
StoragePod  29.9T   144T      0  1.56K      0   129M

대안으로 간단히 루트 폴더에서 rsync를 실행했습니다.

rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/Marcello_zinc_bone /StoragePod/Marcello_zinc_bone
rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/fibroblast_growth /StoragePod/fibroblast_growth
rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/QDIC /StoragePod/QDIC
rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/sexy_dps_cell /StoragePod/sexy_dps_cell

실제로 성능이 향상되었습니다.

StoragePod  30.1T   144T     13  3.66K   112K   343M
StoragePod  30.1T   144T     24  5.11K   184K   469M
StoragePod  30.1T   144T     25  4.30K   196K   373M

결론적으로 @Sandip Bhattacharya가 등장했을 때 작은 스크립트를 작성하여 디렉토리를 가져 와서 병렬 처리하십시오. 또는 파일 목록을 rsync로 전달하십시오. 그러나 각 파일마다 새 인스턴스를 만들지 마십시오.


5

병렬화 된 rsync를 수행하는 테스트 된 방법은 다음과 같습니다. http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Parallelizing-rsync

rsync는 훌륭한 도구이지만 때로는 사용 가능한 대역폭을 채우지 않습니다. 고속 연결을 통해 여러 개의 큰 파일을 복사 할 때 종종 문제가됩니다.

다음은 서버 fooserver에서 src-dir의 큰 파일 당 하나의 rsync를 dest-dir로 시작합니다.

cd src-dir; find . -type f -size +100000 | \
parallel -v ssh fooserver mkdir -p /dest-dir/{//}\; \
  rsync -s -Havessh {} fooserver:/dest-dir/{} 

작성된 디렉토리가 잘못된 권한으로 끝나고 더 작은 파일이 전송되지 않을 수 있습니다. 마지막으로 rsync를 실행하여 문제를 해결하려면 다음을 수행하십시오.

rsync -Havessh src-dir/ fooserver:/dest-dir/ 

데이터를 푸시 할 수는 없지만 데이터를 가져와야하고 파일을 numeric.png (예 : 000000.png)라고하는 경우 다음을 수행 할 수 있습니다.

seq -w 0 99 | parallel rsync -Havessh fooserver:src/*{}.png destdir/

피하기 위해 다른 대안 find?
Mandar Shinde

1
찾기의 -maxdepth를 제한하십시오.
Ole Tange

--dry-run에서 옵션을 사용하면 rsync전송 될 파일 목록이 표시됩니다. parallel프로세스를 병렬화하기 위해 해당 파일 목록을 제공 할 수 있습니까 ?
Mandar Shinde

1
고양이 파일 | 병렬 -v ssh fooserver mkdir -p / dest-dir / {//} \; rsync -s -Havessh {} fooserver : / dest-dir / {}
Ole Tange

mkdir -p /dest-dir/{//}\;부분을 설명해 주 시겠습니까? 특히 {//}문제는 약간 혼란 스럽다.
Mandar Shinde

1

다중 대상 동기화의 경우

parallel rsync -avi /path/to/source ::: host1: host2: host3:

힌트 : 모든 SSH 연결은 공개 키를 사용하여 설정됩니다. ~/.ssh/authorized_keys


1

나는 항상 전체 명령을 잊어 버렸기 때문에 항상 병렬 rsync를 위해 Google을 사용하지만 원하는대로 솔루션을 찾지 못했습니다. 여러 단계를 포함하거나 설치해야 parallel합니다. 이 단일 라이너를 사용하여 여러 폴더를 동기화했습니다.

find dir/ -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo dir/%/ host:/dir/%/)'

-P 5 스폰하려는 프로세스의 양입니다. 0을 무제한으로 사용하십시오 (권장하지 않음).

--bwlimit 모든 대역폭 사용을 피하십시오.

-I %find가 제공 한 인수 (에서 찾은 디렉토리 dir/)

$(echo dir/%/ host:/dir/%/)-rsync가 인수로 읽는 소스 및 대상 디렉토리를 인쇄합니다. %는 xargs에서 찾은 디렉토리 이름으로 바뀝니다 find.

하자 내가 두 디렉토리가 있다고 가정 /home: dir1dir2. 나는 달린다 find /home -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo /home/%/ host:/home/%/)'. 따라서 rsync 명령은 /home다음 인수를 사용하여 두 개의 프로세스 (두 개의 디렉토리가 있으므로 두 개의 프로세스)로 실행됩니다 .

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