Używam rsync
skryptu do synchronizacji danych na jednym hoście z danymi na innym hoście. Dane zawierają wiele małych plików, które przyczyniają się do prawie 1,2 TB.
Aby zsynchronizować te pliki, użyłem rsync
polecenia w następujący sposób:
rsync -avzm --stats --human-readable --include-from proj.lst /data/projects REMOTEHOST:/data/
Zawartość proj.lst jest następująca:
+ proj1
+ proj1/*
+ proj1/*/*
+ proj1/*/*/*.tar
+ proj1/*/*/*.pdf
+ proj2
+ proj2/*
+ proj2/*/*
+ proj2/*/*/*.tar
+ proj2/*/*/*.pdf
...
...
...
- *
Jako test wybrałem dwa z tych projektów (8,5 GB danych) i wykonałem powyższe polecenie. Jest to proces sekwencyjny, którego ukończenie zajmuje 14 minut 58 sekund. Tak więc dla 1,2 TB danych zajmie to kilka godzin.
Jeśli bym mógł wiele rsync
procesów równolegle (z użyciem &
, xargs
albo parallel
), byłoby zaoszczędzić swój czas.
Próbowałem z poniższym poleceniem z parallel
(po cd
przejściu do katalogu źródłowego) i wykonanie go zajęło 12 minut 37 sekund:
parallel --will-cite -j 5 rsync -avzm --stats --human-readable {} REMOTEHOST:/data/ ::: .
Powinno to zająć 5 razy mniej czasu, ale tak nie było. Myślę, że gdzieś się mylę.
Jak mogę uruchomić wiele rsync
procesów, aby skrócić czas wykonywania?
źródło
rsync
s jest naszym priorytetem.rsync
równoległych jest teraz głównym celem.Odpowiedzi:
Wykonałem dla mnie następujące czynności:
rsync --dry-run
pierwszy, aby uzyskać listę plików, których to dotyczy.cat transfer.log
doparallel
, abyrsync
równolegle uruchomić 5 s, jak następuje:Tutaj
--relative
opcja ( link ) zapewniła, że struktura katalogów dla plików, których dotyczy problem, w źródle i miejscu docelowym, pozostaje taka sama (w/data/
katalogu wewnętrznym ), więc polecenie należy uruchomić w folderze źródłowym (na przykład/data/projects
).źródło
split
i podawanie tych nazw plików równolegle. Następnie użyj rsync,--files-from
aby pobrać nazwy plików z każdego pliku i zsynchronizować je. rm backup. * split -l 3000 backup.list backup. kopie zapasowe ls. * | równoległy --line-buffer --verbose -j 5 rsync --progress -av --files-from {} / LOCAL / PARENT / PATH / REMOTE_HOST: REMOTE_PATH /receiving file list ... done
created directory /data/
.--info=name
zamiast nich-v
, a otrzymasz tylko nazwy plików i katalogów. Możesz także użyć opcji --protect-args do 'wewnętrznego' transferu rsync, jeśli w plikach mogą znajdować się spacje lub metaznaki powłoki.Osobiście używam tego prostego:
Przydaje się to tylko wtedy, gdy masz więcej niż kilka prawie pustych katalogów, w przeciwnym razie skończy się prawie każde
rsync
zakończenie, a ostatni sam wykona całą robotę.źródło
Zdecydowanie odradzam każdemu korzystanie z zaakceptowanej odpowiedzi, lepszym rozwiązaniem jest przeszukanie katalogu najwyższego poziomu i uruchomienie proporcjonalnej liczby operacji rync.
Mam duży wolumin ZFS, a moim źródłem było CIFS Mount. Oba są powiązane z 10G, aw niektórych testach porównawczych mogą nasycić link. Wydajność oceniono za pomocą
zpool iostat 1
.Napęd źródłowy został zamontowany w następujący sposób:
Za pomocą jednego
rsync
procesu:licznik io wskazuje:
W syntetycznych testach porównawczych (dysk kryształowy) wydajność sekwencyjnego zapisu dochodzi do 900 MB / s, co oznacza, że łącze jest nasycone. 130 MB / s nie jest zbyt dobra, a różnica między oczekiwaniem na weekend a dwoma tygodniami.
Zbudowałem więc listę plików i próbowałem ponownie uruchomić synchronizację (mam 64-rdzeniowy komputer):
i miał taką samą wydajność!
Alternatywnie po prostu uruchomiłem rsync w folderach głównych:
To faktycznie zwiększyło wydajność:
Podsumowując, jak wychował @Sandip Bhattacharya, napisz mały skrypt, aby uzyskać katalogi i to równolegle. Alternatywnie, przekaż listę plików do rsync. Ale nie twórz nowych instancji dla każdego pliku.
źródło
Testowanym sposobem wykonania zsynchronizowanego rsync jest: http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Parallelizing-rsync
źródło
find
?--dry-run
opcji inrsync
, będę mieć listę plików, które zostaną przesłane. Czy mogę podać tę listę plikówparallel
, aby zrównoleglić proces?mkdir -p /dest-dir/{//}\;
część? Zwłaszcza{//}
sprawa jest nieco myląca.Używam do synchronizacji wielu miejsc docelowych
Wskazówka: wszystkie połączenia ssh są ustanawiane z kluczami publicznymi w
~/.ssh/authorized_keys
źródło
Zawsze szukam w Google równoległego rsync, ponieważ zawsze zapominam o pełnej komendzie, ale żadne rozwiązanie nie działało dla mnie tak, jak chciałem - albo zawiera wiele kroków, albo wymaga instalacji
parallel
. Skończyło się na tym, że zsynchronizowałem wiele folderów:-P 5
to ilość procesów, które chcesz odrodzić - użyj 0 dla nieograniczonej liczby (oczywiście nie jest to zalecane).--bwlimit
aby uniknąć korzystania z całej przepustowości.-I %
argument dostarczony przez find (katalog znaleziony wdir/
)$(echo dir/%/ host:/dir/%/)
- drukuje katalogi źródłowe i docelowe, które są odczytywane przez rsync jako argumenty. % zostaje zastąpione przezxargs
nazwę katalogu znalezioną przezfind
.Załóżmy, że mam dwa katalogi w
/home
:dir1
idir2
. Biegnęfind /home -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo /home/%/ host:/home/%/)'
. Tak więc komenda rsync będzie działać jako dwa procesy (dwa procesy, ponieważ/home
ma dwa katalogi) z następującymi argumentami:źródło