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ła nakładka na rsync, która przyspiesza transfer dużych zbiorów plików, uruchamiając jednocześnie kilka procesów rsync. Każdy proces synchronizuje swoją część plików, dzięki czemu dostępne pasmo i moc CPU są wykorzystywane wydajniej niż w przypadku pojedynczego strumienia rsync.

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

Warning

Kopiowanie równoległe przyspiesza transfery tylko na szybkich dyskach i przy stabilnej sieci. Na wolnych dyskach lub systemach plików montowanych sieciowo (NFS, SMB, FUSE) zwiększenie liczby procesów równoległych często nie daje żadnego przyrostu szybkości, a zamiast tego może dodatkowo obciążyć źródło, cel lub łącze między nimi. Zacznij od niewielkiej liczby procesów, zmierz wynik i zwiększaj ich liczbę tylko wtedy, gdy dyski i sieć są w stanie nadążyć.

Jak działa parsyncfp

parsyncfp wykorzystuje narzędzie fpart do podziału drzewa plików źródłowych na fragmenty o w przybliżeniu równej wielkości, a następnie uruchamia równolegle kilka procesów rsync, po jednym na fragment. Ponieważ fpart dzieli drzewo przyrostowo, parsyncfp może rozpocząć transfer plików, zanim zakończy się pełne skanowanie drzewa źródłowego, co ma znaczenie w przypadku bardzo dużych drzew katalogów.

Narzędzie trzeba zainstalować tylko na serwerze źródłowym. Stronę odbierającą obsługuje rsync w zwykły sposób.

Ten sam autor utrzymuje następcę o nazwie parsyncfp2 (pfp2), który zawiera poprawki błędów i ulepszenia względem parsyncfp, a dodatkowo obsługuje wysyłanie z kilku hostów źródłowych jednocześnie. W przypadku nowych wdrożeń zalecanym wyborem jest parsyncfp2. Ten przewodnik dotyczy klasycznego parsyncfp; składnia poleceń pfp2 jest w dużej mierze zgodna.

Kiedy parsyncfp jest przydatny

parsyncfp daje największą korzyść, gdy:

  • źródło zawiera miliony małych plików, gdzie rsync spędza większość czasu na operacjach na metadanych, a nie na rzeczywistym przesyłaniu danych;
  • zarówno źródło, jak i cel są oparte na szybkim magazynie danych (NVMe, SSD lub dobrze skonfigurowany RAID);
  • sieć między źródłem a celem jest szybka i stabilna (1 Gb/s lub więcej, niska utrata pakietów);
  • pojedynczy proces rsync jest ograniczany przez CPU lub przepustowość pojedynczego strumienia, a nie przez dysk lub łącze.

W przypadku małych katalogów, wolnych dysków talerzowych lub obciążonej sieci zwykły rsync zazwyczaj wystarcza.

Katalog ~/.parsyncfp

parsyncfp tworzy na serwerze źródłowym katalog pamięci podręcznej o nazwie ~/.parsyncfp. Wewnątrz znajduje się podkatalog fpcache, w którym przechowywany jest dziennik fpart, pliki PID uruchomionych procesów rsync oraz pliki fragmentów wskazujące, które ścieżki ma skopiować każdy proces rsync. Pliki dziennika mają znacznik daty i nie są nadpisywane między uruchomieniami, dzięki czemu poprzednie uruchomienia można później przejrzeć.

Jeśli chcesz uruchomić kilka instancji parsyncfp jednocześnie, wskaż każdej z nich osobną lokalizację pamięci podręcznej za pomocą opcji --altcache. parsyncfp wykrywa przy starcie inne działające instancje i ostrzega o nich, dzięki czemu przypadkowo nakładające się uruchomienia stają się widoczne wcześnie.

Instalowanie zależności

Sam parsyncfp opiera się na rsync (transport) oraz fpart (do podziału drzewa źródłowego na fragmenty). Zainstaluj oba na serwerze źródłowym.

Na Debianie i Ubuntu:

apt-get install rsync fpart

Na RHEL, CentOS Stream, AlmaLinux i Rocky Linux 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 repozytorium 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 udostępnia fpart (na przykład RHEL 10 lub jego przebudowy w chwili pisania tego tekstu) albo wolisz nie korzystać z EPEL, zbuduj fpart ze źródeł. Oficjalnym repozytorium jest repozytorium fpart na GitHub; plik README zawiera niewielki zestaw zależności potrzebnych do kompilacji (kompilator C, make oraz standardowe nagłówki biblioteki C).

Instalowanie parsyncfp

parsyncfp to pojedynczy skrypt Perla hostowany na GitHubie. Pobierz go, nadaj mu uprawnienia do wykonywania i przenieś do katalogu znajdującego się w twojej zmiennej PATH, aby móc go wywoływać bez podawania pełnej ścieżki:

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

Sprawdź, czy skrypt się uruchamia:

parsyncfp --help

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

Konfigurowanie dostępu SSH do celu

parsyncfp uruchamia rsync przez SSH, więc serwer źródłowy musi mieć możliwość zalogowania się na serwer docelowy bez hasła. Wygeneruj parę kluczy na źródle (jeśli jeszcze jej nie ma) i skopiuj klucz publiczny na serwer docelowy:

ssh-keygen ssh-copy-id user@target_host

Zastąp user@target_host nazwą użytkownika oraz adresem IP lub nazwą hosta swojego 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 pamięci podręcznej i kopiuje zawartość /dir/local/www do /var/dir/ na hoście docelowym 192.168.67.1.

Info

Zwróć uwagę na ukośnik na końcu argumentu źródłowego: www/ kopiuje zawartość katalogu www do celu (jak w powyższym przykładzie), natomiast www (bez ukośnika) kopiuje sam katalog www, tworząc /var/dir/www/ na celu. Jest to takie samo zachowanie jak w przypadku zwykłego rsync.

Kluczowe parametry polecenia

  • --NP ustawia liczbę równoległych procesów rsync. Rozsądnym punktem wyjścia jest wartość od 4 do 8; zwiększaj tę liczbę stopniowo, i tylko wtedy, gdy dyski i sieć nie są jeszcze nasycone. Ustawienie --NP równe liczbie rdzeni CPU rzadko jest samo w sobie właściwym wyborem.
  • --altcache określa alternatywny katalog pamięci podręcznej. Jest przydatne, gdy uruchamiasz kilka instancji parsyncfp jednocześnie lub gdy domyślna lokalizacja znajduje się na wolnym magazynie danych. Unikaj wskazywania lokalizacji opartej na tmpfs (takiej jak /tmp w wielu dystrybucjach), ponieważ listy fragmentów dla bardzo dużych drzew źródłowych mogą znacznie się rozrosnąć, a nie powinny zajmować pamięci RAM.
  • --startdir ustawia katalog roboczy używany jako baza dla następujących po nim ścieżek źródłowych.
  • Argumenty po --startdir to katalogi źródłowe do skopiowania (jeden lub kilka, oddzielone spacjami), po których następuje cel w stylu rsync w postaci user@host:/path/.

Pełną listę opcji uzyskasz, uruchamiając parsyncfp --help, lub znajdziesz ją w dokumentacji projektu.

Przydatne dodatkowe opcje

Gdy podstawowy transfer już działa, warto poznać kilka opcji przydatnych w środowisku produkcyjnym:

  • --maxbw=500000 ogranicza łączną przepustowość wykorzystywaną 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 mocno obciążonych serwerach źródłowych, ale przed użyciem zapoznaj się z ostrzeżeniem poniżej.
  • --chunksize=5G kontroluje rozmiar każdego fragmentu fpart. Większe fragmenty zmniejszają narzut przypadający na fragment w transferach z dużą liczbą małych plików; mniejsze fragmenty poprawiają równoległość w transferach z niewielką liczbą bardzo dużych plików.
  • --rsyncopts="-a -s -x" pozwala przekazać dodatkowe flagi bezpośrednio do bazowych procesów rsync. Użyj tej opcji, aby włączyć kompresję (-z), ustawić niestandardowy rozmiar bloku lub zastosować inne dostrojenia rsync. Nie przekazuj --delete przez --rsyncopts; wyjaśnienie, dlaczego jest to niebezpieczne, znajdziesz w sekcji Ograniczenia poniżej.
  • --verbose=2 zwiększa poziom szczegółowości dziennika, co ułatwia diagnozowanie problemów przy pierwszych uruchomieniach.

Warning

Autor projektu udokumentował znany problem z opcją --maxload: gdy parsyncfp przechodzi przez powtarzające się cykle wstrzymania i wznowienia, niektóre pliki źródłowe mogą nie zostać przesłane do celu. Jeśli używasz --maxload, ustaw próg na tyle wysoko, aby wstrzymania nigdy się nie uruchamiały, albo zweryfikuj wynik za pomocą osobnego sprawdzenia spójności po zakończeniu transferu.

Ograniczenia

Nawet na odpowiednim sprzęcie parsyncfp wiąże się z kompromisami, o których warto wiedzieć przed zwiększeniem liczby procesów:

  • parsyncfp nie obsługuje bezpiecznie opcji rsync --delete. Każdy równoległy proces rsync widzi tylko swój własny fragment źródła, więc jeśli przekazana zostanie opcja --delete, każdy proces będzie próbował usunąć na celu pliki, których nie ma w jego fragmencie — czyli pliki, które prawowicie należą do innych fragmentów. Może to spowodować usunięcie dużych części zawartości celu. Użyj zwykłego rsync (lub osobnego etapu czyszczenia), gdy potrzebujesz semantyki --delete.
  • parsyncfp nie zachowuje globalnej kolejności plików pomię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ą na to znacznie mniej podatne.
  • Na systemach plików z bardzo dużą liczbą małych plików narzut metadanych przypadający na plik może zdominować czas transferu. Równoległość pomaga do pewnego momentu, a potem osiąga plateau.
  • Każdy proces rsync otwiera własne połączenie SSH z celem, więc wysokie wartości --NP zwielokrotniają narzut związany z nawiązywaniem połączenia. W łączach WAN z utratą pakietów lub wysokim opóźnieniem może to raczej pogorszyć przeciążenie niż je zmniejszyć. W takim przypadku mniejsza liczba procesów z dostrojonym rsync (kompresja, większy rozmiar bloku) często działa lepiej niż wiele procesów równoległych.

Zobacz także

Jeśli parsyncfp okaże się bardziej rozbudowany, niż potrzebujesz, pakiet fpart zawiera także fpsync — prostszą równoległą nakładkę na rsync tego samego autora. Wykorzystuje tę samą ideę podziału na fragmenty, 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