Kopiowanie plików z szybkim wielowątkowym parsyncfp | INTROSERV
EUR
european

EUR

usa

USD

Poland Pl
Ex. VAT Ex. VAT 0%

Kopiowanie plików z szybkim wielowątkowym parsyncfp

Wprowadzenie

parsyncfp to równoległy wrapper wokół rsync, który przyspiesza transfer dużych kolekcji plików, uruchamiając kilka procesów rsync naraz. Każdy proces synchronizuje własną porcję plików, więc dostępne pasmo i CPU są wykorzystywane efektywniej niż przy pojedynczym strumieniu rsync.

Ten przewodnik opisuje, kiedy parsyncfp jest przydatny, jak go zainstalować i jak wykonać podstawowy transfer między dwoma serwerami.

Warning

Kopiowanie równoległe przyspiesza transfery tylko na szybkich dyskach i stabilnej sieci. Na wolnych dyskach lub systemach plików montowanych sieciowo (NFS, SMB, FUSE), zwiększanie liczby procesów równoległych często nie daje zysku prędkości i może zamiast tego dołożyć dodatkowego obciążenia do źródła, celu lub łącza między nimi. Zacznij od małej liczby procesów, zmierz wynik i zwiększaj liczbę tylko wtedy, gdy dyski i sieć nadążają.

Jak działa parsyncfp

parsyncfp używa narzędzia fpart do podziału drzewa plików źródłowych na porcje o w przybliżeniu równym rozmiarze, a następnie uruchamia kilka procesów rsync równolegle, po jednym na porcję. Ponieważ fpart dzieli drzewo przyrostowo, parsyncfp może rozpocząć transfer plików zanim pełne skanowanie drzewa źródłowego zostanie zakończone, co ma znaczenie dla bardzo dużych drzew katalogów.

Narzędzie musi być zainstalowane tylko na serwerze źródłowym. rsync obsługuje stronę odbiorczą jak zwykle.

Ten sam autor utrzymuje następcę o nazwie parsyncfp2 (pfp2), który zawiera poprawki błędów i ulepszenia w stosunku do parsyncfp oraz dodatkowo obsługuje wysyłanie z kilku hostów źródłowych jednocześnie. Dla nowych wdrożeń parsyncfp2 jest rekomendowanym wyborem. Ten przewodnik obejmuje klasyczny parsyncfp; składnia poleceń pfp2 jest w dużej mierze kompatybilna.

Kiedy parsyncfp jest przydatny

parsyncfp daje największy zysk, gdy:

  • źródło zawiera miliony małych plików, gdzie rsync spędza większość czasu na operacjach na metadanych zamiast na faktycznym transferze danych;
  • zarówno źródło, jak i cel są oparte na szybkiej pamięci masowej (NVMe, SSD lub dobrze skonfigurowane RAID);
  • sieć między źródłem a celem jest szybka i stabilna (1 Gbps lub więcej, niska utrata pakietów);
  • pojedynczy proces rsync jest ograniczony przez CPU lub przepustowość na strumień, a nie przez dysk lub łącze.

Dla małych katalogów, wolnych dysków talerzowych lub nasyconej sieci zwykły rsync zazwyczaj wystarczy.

Katalog ~/.parsyncfp

parsyncfp tworzy katalog cache o nazwie ~/.parsyncfp na serwerze źródłowym. Wewnątrz znajdziesz podkatalog fpcache, który zawiera log fpart, pliki PID działających procesów rsync oraz pliki chunk wymieniające, które ścieżki każdy rsync ma skopiować. Pliki logów są opatrzone datą i nie są nadpisywane między uruchomieniami, więc poprzednie uruchomienia można przejrzeć później.

Jeśli chcesz uruchomić kilka instancji parsyncfp jednocześnie, wskaż każdej z nich osobną lokalizację cache za pomocą opcji --altcache. parsyncfp wykrywa inne uruchomione instancje przy starcie i ostrzega o nich, więc przypadkowe nakładające się uruchomienia stają się widoczne wcześnie.

Instalacja zależności

Sam parsyncfp opiera się na rsync (transport) i fpart (do dzielenia drzewa źródłowego na porcje). Zainstaluj oba na serwerze źródłowym.

Na Debianie i Ubuntu:

apt-get install rsync fpart

Na RHEL, CentOS Stream, AlmaLinux i Rocky Linux pakiet fpart nie znajduje się w podstawowych repozytoriach. Najpierw włącz repozytorium EPEL, a następnie zainstaluj oba pakiety:

dnf install epel-release dnf install rsync fpart

Niektóre pakiety EPEL zależą od pakietów z repozytorium PowerTools lub CRB, które jest domyślnie wyłączone. Włącz odpowiednie dla swojej wersji:

# RHEL/AlmaLinux/Rocky Linux 9 i nowsze dnf config-manager --set-enabled crb # RHEL/AlmaLinux/Rocky Linux 8 dnf config-manager --set-enabled powertools

Info

Jeśli twoja dystrybucja w ogóle nie zawiera fpart (na przykład RHEL 10 lub jego przebudowy w momencie pisania) lub wolisz nie używać EPEL, zbuduj fpart ze źródeł. Oficjalne repozytorium to repozytorium fpart na GitHubie; plik README wymienia niewielki zestaw zależności do budowy (kompilator C, make i standardowe nagłówki biblioteki C).

Instalacja parsyncfp

parsyncfp to pojedynczy skrypt Perl hostowany na GitHubie. Pobierz go, ustaw jako wykonywalny i przenieś do katalogu w PATH, aby można było wywołać go bez wpisywania pełnej ścieżki:

wget https://raw.githubusercontent.com/hjmangalam/parsyncfp/master/parsyncfp chmod +x parsyncfp sudo mv parsyncfp /usr/local/bin/

Sprawdź, czy skrypt działa:

parsyncfp --help

Jeśli pojawi się ekran pomocy, parsyncfp jest gotowy do użycia.

Konfiguracja dostępu SSH do celu

parsyncfp uruchamia rsync przez SSH, więc serwer źródłowy musi móc zalogować się do celu bez hasła. Wygeneruj parę kluczy na źródle (jeśli jeszcze nie istnieje) i skopiuj klucz publiczny do celu:

ssh-keygen ssh-copy-id user@target_host

Zamień user@target_host na nazwę użytkownika i adres IP lub nazwę hosta serwera docelowego. Po tym kroku poniższe polecenie powinno połączyć się bez pytania o hasło:

ssh user@target_host

Wykonywanie transferu

Typowe polecenie parsyncfp wygląda następująco:

parsyncfp --NP=8 --altcache=/dir/local/tmp --startdir=/dir/local/ www/ [email protected]:/var/dir/

To polecenie uruchamia 8 procesów rsync, używa /dir/local/tmp jako katalogu cache i kopiuje zawartość /dir/local/www do /var/dir/ na hoście docelowym 192.168.67.1.

Info

Zwróć uwagę na końcowy ukośnik w argumencie źródłowym: www/ kopiuje zawartość katalogu www do celu (jak w przykładzie powyżej), podczas gdy www (bez ukośnika) kopiuje sam katalog www, tworząc /var/dir/www/ na celu. Jest to to samo zachowanie co w zwykłym rsync.

Kluczowe parametry polecenia

  • --NP ustawia liczbę równoległych procesów rsync. Rozsądny punkt wyjścia to 4 do 8; zwiększaj liczbę stopniowo i tylko wtedy, gdy dyski i sieć nie są jeszcze nasycone. Ustawienie --NP równego liczbie rdzeni CPU rzadko jest właściwym wyborem samym w sobie.
  • --altcache określa alternatywny katalog cache. Jest przydatny, gdy uruchamiasz kilka instancji parsyncfp naraz lub gdy domyślna lokalizacja jest na wolnym nośniku. Unikaj wskazywania na lokalizację opartą na tmpfs (taką jak /tmp w wielu dystrybucjach), ponieważ listy chunków dla bardzo dużych drzew źródłowych mogą rosnąć i nie chcesz, żeby zjadały RAM.
  • --startdir ustawia katalog roboczy używany jako baza dla ścieżek źródłowych, które po nim następują.

Argumenty po --startdir to katalogi źródłowe do skopiowania (jeden lub kilka, oddzielone spacją), a następnie cel w stylu rsync w postaci user@host:/path/.

Pełną listę opcji uzyskasz wykonując parsyncfp --help lub zaglądając do dokumentacji upstream.

Przydatne dodatkowe opcje

Gdy podstawowy transfer już działa, warto znać kilka opcji do uruchomień produkcyjnych:

  • --maxbw=500000 ogranicza całkowite pasmo używane przez wszystkie procesy rsync, w KB/s. Przydatne, gdy łącze jest współdzielone z innymi usługami.
  • --maxload=12 wstrzymuje uruchamianie nowych procesów rsync, gdy średnie obciążenie systemu przekroczy podaną wartość. Pomocne na obciążonych serwerach źródłowych, ale przeczytaj poniższe ostrzeżenie przed użyciem.
  • --chunksize=5G kontroluje, jak duży jest każdy chunk fpart. Większe chunki zmniejszają narzut na chunk przy transferach z wieloma małymi plikami; mniejsze chunki poprawiają równoległość przy transferach z kilkoma bardzo dużymi plikami.
  • --rsyncopts="-a -s -x" pozwala przekazywać dodatkowe flagi bezpośrednio do procesów rsync. Użyj go, aby włączyć kompresję (-z), ustawić niestandardowy rozmiar bloku lub zastosować inne dostrojenia rsync. Nie przekazuj --delete przez --rsyncopts; zobacz sekcję "Ograniczenia" poniżej, dlaczego nie jest to bezpieczne.
  • --verbose=2 zwiększa szczegółowość logowania, co ułatwia rozwiązywanie problemów przy pierwszych uruchomieniach.

Warning

Autor upstream udokumentował znany problem z --maxload: gdy parsyncfp przechodzi przez powtarzające się cykle wstrzymywania i wznawiania, niektóre pliki źródłowe mogą nie zostać przesłane do celu. Jeśli używasz --maxload, ustaw próg wystarczająco wysoko, aby wstrzymania nigdy się nie uruchamiały, lub sprawdź wynik osobnym testem spójności po zakończeniu transferu.

Ograniczenia

Nawet na odpowiednim sprzęcie parsyncfp ma kompromisy, które warto znać przed zwiększeniem liczby procesów:

  • parsyncfp nie obsługuje bezpiecznie opcji --delete rsync. Każdy równoległy proces rsync widzi tylko własną porcję źródła, więc jeśli --delete zostanie przekazane, każdy proces spróbuje usunąć z celu pliki, których nie ma w jego porcji, czyli pliki należące prawowicie do innych porcji. Może to wymazać duże części celu. Użyj zwykłego rsync (lub osobnego przebiegu czyszczącego), gdy potrzebujesz semantyki --delete.
  • parsyncfp nie zachowuje globalnego porządku plików między równoległymi procesami rsync, więc kolejność, w jakiej pliki pojawiają się na celu, nie jest przewidywalna. Ma to znaczenie tylko dla przepływów pracy zależnych od znaczników czasu plików lub kolejności listowania katalogów podczas samego kopiowania.
  • Na macierzach HDD wiele równoległych procesów rsync zamienia to, co byłoby sekwencyjnym wzorcem odczytu, w niemal losowy, co może być wolniejsze niż pojedynczy rsync. Dyski SSD i NVMe są znacznie mniej dotknięte.
  • Na systemach plików z bardzo dużą liczbą małych plików, narzut na metadane na plik może zdominować czas transferu. Równoległość pomaga do pewnego momentu, potem osiąga plateau.
  • Każdy proces rsync otwiera własne połączenie SSH z celem, więc wysokie wartości --NP mnożą narzut nawiązywania połączeń. Na łączach WAN z utratą pakietów lub wysokimi opóźnieniami może to pogorszyć zatory zamiast je poprawić. W takim przypadku mniejsza liczba procesów z dostrojonym rsync (kompresja, większy rozmiar bloku) często daje lepszą wydajność niż wiele równoległych.

Zobacz także

Jeśli parsyncfp okaże się cięższy, niż potrzebujesz, pakiet fpart zawiera również fpsync, prostszy wrapper równoległego rsync od tego samego autora. Używa tego samego pomysłu chunkowania, ale z mniejszą liczbą opcji i często wystarcza do jednorazowych transferów.

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA