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
다음 단계가 나를 위해 일했습니다.
- 첫 번째 명령을 실행
rsync --dry-run
하여 영향을 받는 파일 목록을 가져옵니다.
$ rsync -avzm --stats --safe-links --ignore-existing --dry-run \
--human-readable /data/projects REMOTE-HOST:/data/ > /tmp/transfer.log
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