Copiare i file con il multithreading veloce parsyncfp | INTROSERV
EUR
european

EUR

usa

USD

Italy It
Ex. VAT Ex. VAT 0%

Copiare i file con il multithreading veloce parsyncfp

Introduzione

parsyncfp è un wrapper parallelo di rsync che accelera il trasferimento di grandi raccolte di file eseguendo più processi rsync contemporaneamente. Ogni processo sincronizza la propria porzione di file, quindi la larghezza di banda disponibile e la CPU vengono utilizzate in modo più efficiente rispetto a un singolo flusso rsync.

Questa guida illustra quando parsyncfp è utile, come installarlo e come eseguire un trasferimento di base tra due server.

Warning

La copia parallela accelera i trasferimenti solo su dischi veloci e una rete stabile. Su dischi lenti o su file system montati in rete (NFS, SMB, FUSE), aumentare il numero di processi paralleli spesso non porta alcun guadagno in termini di velocità e può invece generare carico aggiuntivo sull'origine, sulla destinazione o sul collegamento tra di esse. Iniziare con un numero ridotto di processi, misurare il risultato e aumentare il numero solo se i dischi e la rete possono reggere.

Come funziona parsyncfp

parsyncfp utilizza l'utility fpart per suddividere l'albero dei file di origine in porzioni di dimensioni approssimativamente uguali, quindi avvia più processi rsync in parallelo, uno per porzione. Poiché fpart suddivide l'albero in modo incrementale, parsyncfp può iniziare a trasferire i file prima che la scansione completa dell'albero di origine sia terminata, il che è importante per alberi di directory molto grandi.

Lo strumento deve essere installato solo sul server di origine. rsync gestisce normalmente il lato ricevente.

Lo stesso autore mantiene un successore chiamato parsyncfp2 (pfp2), che include correzioni di bug e miglioramenti rispetto a parsyncfp e supporta inoltre l'invio da più host di origine contemporaneamente. Per le nuove distribuzioni, parsyncfp2 è la scelta consigliata. Questa guida tratta il parsyncfp classico; la sintassi dei comandi pfp2 è in gran parte compatibile.

Quando parsyncfp è utile

parsyncfp offre il massimo vantaggio quando:

  • l'origine contiene milioni di piccoli file, dove rsync trascorre la maggior parte del tempo in operazioni sui metadati piuttosto che nel trasferimento dati effettivo;
  • sia l'origine sia la destinazione sono supportate da uno storage veloce (NVMe, SSD o un RAID ben configurato);
  • la rete tra origine e destinazione è veloce e stabile (1 Gbps o più, bassa perdita di pacchetti);
  • un singolo processo rsync è limitato dalla CPU o dal throughput per flusso, non dal disco o dal collegamento.

Per directory di piccole dimensioni, dischi rotanti lenti o una rete saturata, è solitamente sufficiente il semplice rsync.

La directory ~/.parsyncfp

parsyncfp crea una directory di cache chiamata ~/.parsyncfp sul server di origine. Al suo interno si trova la sottodirectory fpcache, che contiene il log di fpart, i file PID dei processi rsync in esecuzione e i file di chunk che elencano quali percorsi ogni rsync deve copiare. I file di log sono datati e non vengono sovrascritti tra le esecuzioni, quindi le esecuzioni precedenti possono essere riviste in seguito.

Se si desidera eseguire più istanze di parsyncfp contemporaneamente, puntare ciascuna a una posizione di cache separata con l'opzione --altcache. parsyncfp rileva altre istanze in esecuzione all'avvio e avvisa al riguardo, quindi le sovrapposizioni accidentali diventano visibili presto.

Installazione delle dipendenze

parsyncfp stesso si basa su rsync (il trasporto) e fpart (per suddividere l'albero di origine in chunk). Installare entrambi sul server di origine.

Su Debian e Ubuntu:

apt-get install rsync fpart

Su RHEL, CentOS Stream, AlmaLinux e Rocky Linux, fpart non è presente nei repository di base. Abilitare prima il repository EPEL, quindi installare entrambi i pacchetti:

dnf install epel-release dnf install rsync fpart

Alcuni pacchetti EPEL dipendono da pacchetti del repository PowerTools o CRB, disabilitato per impostazione predefinita. Abilitare quello corretto per la propria versione:

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

Info

Se la propria distribuzione non include affatto fpart (ad esempio, RHEL 10 o le sue ricompilazioni al momento della stesura), o si preferisce non utilizzare EPEL, compilare fpart dai sorgenti. Il repository ufficiale è il repository fpart su GitHub; il README elenca un piccolo insieme di dipendenze di compilazione (un compilatore C, make e gli header della libreria C standard).

Installazione di parsyncfp

parsyncfp è un singolo script Perl ospitato su GitHub. Scaricarlo, renderlo eseguibile e spostarlo in una directory del PATH per poterlo richiamare senza digitare un percorso completo:

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

Verificare che lo script venga eseguito:

parsyncfp --help

Se appare la schermata di aiuto, parsyncfp è pronto all'uso.

Configurazione dell'accesso SSH alla destinazione

parsyncfp esegue rsync tramite SSH, quindi il server di origine deve poter accedere alla destinazione senza password. Generare una coppia di chiavi sull'origine (se non è già presente) e copiare la chiave pubblica sulla destinazione:

ssh-keygen ssh-copy-id user@target_host

Sostituire user@target_host con il nome utente e l'IP o il nome host del server di destinazione. Dopo questo passaggio, il comando seguente dovrebbe connettersi senza richiedere la password:

ssh user@target_host

Esecuzione di un trasferimento

Un tipico comando parsyncfp ha questo aspetto:

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

Questo comando avvia 8 processi rsync, utilizza /dir/local/tmp come directory di cache e copia il contenuto di /dir/local/www in /var/dir/ sull'host di destinazione 192.168.67.1.

Info

Prestare attenzione alla barra finale nell'argomento di origine: www/ copia il contenuto della directory www nella destinazione (come nell'esempio precedente), mentre www (senza barra) copia la directory www stessa, creando /var/dir/www/ sulla destinazione. Questo è lo stesso comportamento del semplice rsync.

Parametri principali del comando

  • --NP imposta il numero di processi rsync paralleli. Un punto di partenza ragionevole è da 4 a 8; aumentare il numero gradualmente e solo se i dischi e la rete non sono ancora saturi. Impostare --NP uguale al numero di core CPU raramente è la scelta giusta di per sé.
  • --altcache specifica una directory di cache alternativa. È utile quando si eseguono più istanze di parsyncfp contemporaneamente o quando la posizione predefinita si trova su uno storage lento. Evitare di puntarla a una posizione basata su tmpfs (come /tmp in molte distribuzioni), poiché le liste di chunk per alberi di origine molto grandi possono crescere e non si desidera che consumino la RAM.
  • --startdir imposta la directory di lavoro utilizzata come base per i percorsi di origine che la seguono.

Gli argomenti dopo --startdir sono le directory di origine da copiare (una o più, separate da spazio), seguite dalla destinazione in stile rsync nella forma user@host:/path/.

Per l'elenco completo delle opzioni, eseguire parsyncfp --help o consultare la documentazione upstream.

Opzioni aggiuntive utili

Una volta che il trasferimento di base funziona, è utile conoscere alcune opzioni per le esecuzioni in produzione:

  • --maxbw=500000 limita la larghezza di banda totale utilizzata da tutti i processi rsync, in KB/s. Utile quando il collegamento è condiviso con altri servizi.
  • --maxload=12 mette in pausa l'avvio di nuovi processi rsync quando il carico medio del sistema supera il valore indicato. Utile su server di origine occupati, ma vedere l'avviso di seguito prima di usarlo.
  • --chunksize=5G controlla la dimensione di ogni chunk di fpart. Chunk più grandi riducono l'overhead per chunk sui trasferimenti con molti file piccoli; chunk più piccoli migliorano il parallelismo sui trasferimenti con pochi file molto grandi.
  • --rsyncopts="-a -s -x" consente di passare flag aggiuntivi direttamente ai processi rsync sottostanti. Usarlo per abilitare la compressione (-z), impostare una dimensione di blocco personalizzata o applicare altre regolazioni di rsync. Non passare --delete tramite --rsyncopts; vedere la sezione "Limitazioni" di seguito per capire perché non è sicuro.
  • --verbose=2 aumenta il dettaglio dei log, il che facilita la risoluzione dei problemi nelle prime esecuzioni.

Warning

L'autore upstream ha documentato un problema noto con --maxload: quando parsyncfp attraversa cicli ripetuti di sospensione e ripresa, alcuni file di origine potrebbero non essere trasferiti alla destinazione. Se si utilizza --maxload, impostare la soglia abbastanza alta da non attivare mai le sospensioni, oppure verificare il risultato con un controllo di coerenza separato al termine del trasferimento.

Limitazioni

Anche su hardware adatto, parsyncfp presenta compromessi che vale la pena conoscere prima di aumentare il numero di processi:

  • parsyncfp non supporta in modo sicuro l'opzione --delete di rsync. Ogni processo rsync parallelo vede solo la propria porzione dell'origine, quindi se --delete viene passato, ogni processo proverà a eliminare i file sulla destinazione che non sono nella sua porzione, vale a dire i file che legittimamente appartengono ad altre porzioni. Questo può cancellare grandi parti della destinazione. Usare il semplice rsync (o una passata di pulizia separata) quando è necessaria la semantica di --delete.
  • parsyncfp non preserva un ordinamento globale dei file tra i processi rsync paralleli, quindi l'ordine in cui i file appaiono sulla destinazione non è prevedibile. Questo è importante solo per i flussi di lavoro che dipendono dai timestamp dei file o dall'ordine di elencazione delle directory durante la copia stessa.
  • Sugli array HDD, molti processi rsync paralleli trasformano quello che sarebbe un modello di lettura sequenziale in uno quasi casuale, che può essere più lento di un singolo rsync. Le unità SSD e NVMe sono molto meno colpite.
  • Sui file system con un numero molto elevato di file piccoli, l'overhead dei metadati per file può dominare il tempo di trasferimento. Il parallelismo aiuta fino a un certo punto, poi si stabilizza.
  • Ogni processo rsync apre la propria connessione SSH verso la destinazione, quindi valori elevati di --NP moltiplicano l'overhead di configurazione della connessione. Su collegamenti WAN con perdita di pacchetti o latenza elevata, questo può peggiorare la congestione anziché migliorarla. In tal caso, meno processi con un rsync ottimizzato (compressione, dimensione del blocco maggiore) spesso rendono meglio di molti in parallelo.

Vedere anche

Se parsyncfp risulta più pesante del necessario, il pacchetto fpart include anche fpsync, un wrapper parallelo di rsync più semplice dello stesso autore. Utilizza la stessa idea di chunking ma con meno opzioni ed è spesso sufficiente per trasferimenti occasionali.

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