GNU Parallel을 사용하여 rsync 병렬화

GNU Parallel을 사용하여 rsync 병렬화

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
...
...
...
- *

테스트로 프로젝트 2개(데이터 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

나는 누구에게나 허용된 답변을 사용하지 말 것을 강력히 권장합니다. 더 나은 해결책은 최상위 디렉토리를 잡고 특정 수의 rsync 작업을 시작하는 것입니다.

나는 큰 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

합성 벤치마크(Crystal Disk)에서 순차 쓰기 성능은 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에 전달합니다. 그러나 각 파일에 대해 새 인스턴스를 만들지 마십시오.

답변2

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

  1. 첫 번째 명령을 실행 rsync --dry-run하여 영향을 받는 파일 목록을 가져옵니다.
$ rsync -avzm --stats --safe-links --ignore-existing --dry-run \
    --human-readable /data/projects REMOTE-HOST:/data/ > /tmp/transfer.log
  1. cat transfer.log다음과 같이 5초 parallel동안 병렬로 실행되도록 출력을 입력합니다 .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옵션(협회)는 영향을 받는 파일의 디렉터리 구조가 소스와 대상에서 동일하게( /data/디렉터리 내부) 유지되도록 보장하므로 명령은 소스 폴더(예: /data/projects)에서 실행되어야 합니다.

답변3

개인적으로 저는 다음과 같은 간단한 것을 사용합니다.

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

이는 비어 있지 않은 디렉터리가 여러 개 있는 경우에만 유용합니다. 그렇지 않으면 거의 모든 rsync종료 항목이 종료되고 마지막 항목이 모든 작업을 단독으로 수행하게 됩니다.

앞의 백슬래시로 인해 ls별칭이 건너뛰게 됩니다. 이렇게 하면 출력이 예상한 대로 보장됩니다.

답변4

다중 대상 동기화를 위해 다음을 사용하고 있습니다.

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

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

관련 정보