Jak przyspieszyć rsync?


44

Korzystam z rsync, aby zsynchronizować katalog z zewnętrznym dyskiem twardym USB. To około 150 koncertów danych. Zgaduję, że ponad 50000 plików.

W tej chwili jest po raz pierwszy synchronizowany, ale kopiuje pliki z prędkością tylko 1-5 MB / s. Wydaje się to niezwykle powolne w przypadku obudowy USB 2.0. Na dysku nie odbywają się również inne transfery.

Oto opcje, których użyłem:

rsync -avz --progress /mysourcefolder /mytargetfolder

Używam Ubuntu Server 9.10.


2
czy na pewno otrzymujesz połączenie USB2? czy kopiowanie (inne niż rsync) lub inna operacja zapisu działa z normalną prędkością? jeśli nie, to czy próbowałeś / aś kopiować z innym portem / kablem USB?
quack quixote

Zobacz także serverfault.com/questions/43014/… - tam ludzie również proponują użycie dwóch tarpoleceń potokowych lub cpio.
Blaisorblade

Odpowiedzi:


38

Do pierwszej synchronizacji wystarczy użyć

cp -a  /mysourcefolder /mytargetfolder

rsync dodaje narzut tylko wtedy, gdy miejsce docelowe jest puste.

także ... opcja -z prawdopodobnie zabija twoją wydajność, nie powinieneś jej używać, jeśli nie przesyłasz danych wolnym linkiem.


3
rsync jest tak zwany, ponieważ służy do zdalnej synchronizacji i nie jest tak naprawdę odpowiedni dla woluminu podłączonego lokalnie z tego właśnie powodu.
msanford

6
Powinien być użyteczny również do transferów lokalnych i jest znacznie bardziej elastyczny. To tylko możliwe, że przesada w przypadku pierwszej synchronizacji.
Blaisorblade

1
rsync jest także synchronizacją jednokierunkową. Bardzo dobry do tworzenia kopii zapasowych na serwerze lub z serwera. Jeśli jednak chcesz lokalnej synchronizacji TWO-Way z dyskiem wymiennym, możesz sprawdzić csync csync.org/get-it, aby nie pomylić jej z csync2, który jest zupełnie innym projektem.
Jesse the Wind Wanderer

3
rsync -avz --progress /mysourcefolder/ /mytargetfolderlub dostaniesz kopię mysourcefolderwewnętrznej mytargetfolderzamiast dublowanie zawartości
edytor

2
Ta odpowiedź nie odpowiada na pytanie. Pytanie dotyczyło sposobu optymalizacji rsync - a nie zastępowania go poleceniem cp.
oemb1905

38

Jeśli używasz rsync z szybką siecią lub dyskiem na dysk na tym samym komputerze,

nie używa kompresji -z

i używanie --inplace

przyspiesza to do wydajności dysków twardych lub sieci

kompresja wymaga dużej ilości procesora

nieużywanie w miejscu powoduje, że dysk twardy jest bardzo thrash (używa pliku tymczasowego przed utworzeniem wersji ostatecznej)

kompresja i niestosowanie w miejscu jest lepsze do robienia tego przez Internet (wolna sieć)

NOWOŚĆ: Należy pamiętać o miejscu docelowym ... jeśli włączona jest „kompresja” NTFS ... to poważnie spowalnia duże pliki (powiedziałbym, że 200 MB +) rsync wydaje się być zablokowany, jest to spowodowane tym.


Kompresja NTFS jest powolna w przypadku dużych plików
Scott Kramer

Nie widzę nic o '--inline' na stronie podręcznika
Anthony

1
To „--inplace”
Scott Kramer,

26

Użyj -Wopcji. To wyłącza porównania delta / diff. Gdy czas / rozmiar pliku różnią się, rsync kopiuje cały plik.

Usuń także -zopcję. Jest to przydatne tylko do kompresji ruchu sieciowego.

Teraz rsyncpowinno być tak szybko jak cp.


6
Drobna uwaga: -zjest przydatna tylko przy małym ruchu sieciowym. Jeśli twoja sieć jest wystarczająco szybka, spowolni to, ponieważ będziesz ograniczony przez procesor.
WhyNotHugo

3
Te wskazówki znacznie przyspieszyły przesyłanie moich plików między dwoma urządzeniami NAS, dzięki!
djhworld,

2
ale zauważ, że według strony podręcznika napisano dla -W: „Jest to ustawienie domyślne, gdy zarówno źródło, jak i miejsce docelowe są określone jako ścieżki lokalne, ale tylko wtedy, gdy nie jest włączona opcja zapisu wsadowego”.
GuoLiang Oon

13

Po pierwsze - liczba plików w tym przypadku będzie głównym czynnikiem. Średni rozmiar to 3 MB. Prawdopodobnie wąskie gardło io wpływa na szybkość w przypadku PO. Więcej tutaj - to dość sucha lektura, ale zdjęcie na okładce jest tego warte.

Więc używając rsync do skopiowania do pustego katalogu? Oto kilka sposobów na przyspieszenie:

  1. Nie -z - zdecydowanie nie używaj -z jak w OP.
  2. - brak kompresji może przyspieszyć. To może mieć największy wpływ ... mój test wynosił 13 000 plików, całkowity rozmiar 200 MB i używanie rsync 3.1.3. Zsynchronizowałem się z inną partycją na tym samym wewnętrznym dysku SSD. Z opcją --no-kompres dostaję 18 MB / s, a bez niej 15 MB / s. cp, nawiasem mówiąc, dostaje 16 MBps. Jest to jednak znacznie mniejszy średni rozmiar pliku. Ponadto - nie mogę znaleźć żadnej dokumentacji dotyczącej opcji --no-kompres. Dowiedziałem się o tym z tego postu na stackexchange.com.
  3. -W, aby skopiować pliki w całości - zawsze używaj tego, jeśli nie chcesz, aby porównywał różnice; nieważne, że celem rsync jest porównywanie różnic i tylko aktualizowanie zmian.
  4. -S, aby dobrze obsługiwać rzadkie pliki - nie zaszkodzi, jeśli nie masz rzadkich plików.
  5. --Exclude-from lub coś podobnego do wykluczenia plików, których możesz nie potrzebować, skróci czas, ale nie zwiększy prędkości transferu.
  6. Jest to możliwe, jeśli wysyłasz dane wyjściowe do pliku takiego jak ten rsync -a /source /destination >/somewhere/rsync.out 2>/somewhere/rsync.err- pierwszy> zasadniczo drukuje plik ze wszystkimi rzeczami, które normalnie zobaczysz, a 2> odnosi się do komunikatów o błędach.
  7. Wreszcie, uruchomienie wielu instancji rsync dla różnych części transferu może być bardzo pomocne.

Moim poleceniem byłoby:

rsync -avAXEWSlHh /source /destination --no-compress --info=progress2 --dry-run

Gdyby wszystko wyglądało dobrze, usunęłbym „--dry-run” i odpuściłem. A, X i E obejmują rozszerzone atrybuty i uprawnienia nie ujęte w opcji -a, l oznacza miękkie linki, H oznacza twarde łącza, a h jest czytelne dla człowieka.

Aktualizowanie już zsynchronizowanego katalogu na dysku USB, tym samym dysku lub w sieci wymaga różnych poleceń rsync, aby zmaksymalizować prędkość transferu.

Bonus - oto strona manuala rsync , a jeśli chcesz przetestować szybkość swojego dysku twardego, bonnie ++ jest dobrą opcją, a dla twojej prędkości sieci spróbuj iperf .


* Post ma prawie dziesięć lat, ale wyszukiwarki na pewno mu się podobają i wciąż go widzę. To dobre pytanie i nie sądzę, że najlepszą odpowiedzią na „jak przyspieszyć rsync” powinno być „zamiast tego użyj cp”.


1
W odniesieniu do punktu 7) mógłbym znacznie poprawić wydajność, używając tradycyjnego HDD jako źródła, rozszerzając bufor odczytu z wyprzedzeniem za pomocą „blockdev --setra 8192 / dev / sdX”. Zamierzam więc ograniczyć poszukiwania.
user2480144,

2

Nie mówisz, jaki rozmiar mają twoje pliki. Jeśli istnieje wiele małych plików, zmniejszy to ogólną szybkość transferu, zwiększając opóźnienie ruchu głowicy zarówno na dyskach źródłowych, jak i docelowych, ponieważ narzędzie otwiera nowe pliki, a system operacyjny przechowuje wpisy katalogu i inne metadane (takie jak dziennik systemu plików, jeśli używasz kronikowanie metadanych, takie jak ext3 / ext4 i NTFS, robi się domyślnie) podczas przesyłania. Proces kopiowania pliku „zacznie działać” tylko w przypadku większych obiektów, gdy odbywa się zwykłe przesyłanie zbiorcze.


0

Zdecydowanie chcesz wypróbować rclone . To jest szalone szybko:

$ tree / usr [...] katalogi 26105, pliki 293208

$ sudo rclone sync / usr / home / fred / temp -P -L --transfers 64

Przeniesiono: 17,929 G / 17,929 GB, 100%, 165,692 MB / s, ETA 0s Błędy: 75 (ponowna próba może pomóc) Czeki: 691078/691078, 100% Przeniesiono: 345539/345539, 100% Upłynął czas: 1m 50,8 s

Jest to lokalna kopia zi na dysk SSD LITEONIT LCS-256 (256 GB).

Możesz dodać --ignore-sumę kontrolną przy pierwszym uruchomieniu, aby była jeszcze szybsza.


0

Uniknąć

  • -z--compressKompresja / : spowoduje obciążenie tylko procesora, ponieważ transfer nie odbywa się przez sieć, ale przez pamięć RAM.
  • --append-verify: wznowić przerwany transfer. To brzmi jak dobry pomysł, ale ma niebezpieczny przypadek awarii: każdy plik docelowy o tym samym rozmiarze (lub większym) niż źródło zostanie Zignorowany. Ponadto sumuje na koniec cały plik, co oznacza brak znaczącego przyspieszenia --no-whole-filepodczas dodawania niebezpiecznego przypadku awarii.

Posługiwać się

  • -S/ --sparse: zamienia sekwencje zer na rzadkie bloki
  • --partiallub -Pktóry jest --partial --progress: zapisz częściowo przesłane pliki do przyszłego wznowienia. Uwaga: pliki nie będą miały nazwy tymczasowej, więc upewnij się, że nic innego nie oczekuje na użycie miejsca docelowego, dopóki cała kopia nie zostanie ukończona.
  • --no-whole-filewięc wszystko, co musi zostać wysłane ponownie, wykorzystuje transfer delta. Odczytywanie połowy częściowo przesłanego pliku jest często znacznie szybsze niż ponowne zapisywanie.
  • --inplace aby uniknąć kopiowania plików (ale tylko wtedy, gdy nic nie czyta miejsca docelowego do czasu zakończenia całego transferu)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.