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 per rsync che accelera il trasferimento di grandi raccolte di file eseguendo più processi rsync contemporaneamente. Ogni processo sincronizza la propria porzione di file, in modo che la larghezza di banda e la CPU disponibili vengano 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 con una rete stabile. Su dischi lenti o file system montati in rete (NFS, SMB, FUSE), aumentare il numero di processi paralleli spesso non offre alcun guadagno di velocità e può invece aumentare il carico sull'origine, sulla destinazione o sul collegamento tra i due. Iniziate con un numero ridotto di processi, misurate il risultato e aumentate il numero solo se i dischi e la rete riescono a starci dietro.

Come funziona parsyncfp

parsyncfp utilizza l'utility fpart per suddividere l'albero dei file di origine in blocchi di dimensioni approssimativamente uguali, quindi avvia più processi rsync in parallelo, uno per blocco. 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 il lato ricevente come di consueto.

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 implementazioni, parsyncfp2 è la scelta consigliata. Questa guida tratta il classico parsyncfp; la sintassi dei comandi di pfp2 è in gran parte compatibile.

Quando parsyncfp è utile

parsyncfp offre il vantaggio maggiore quando:

  • l'origine contiene milioni di file di piccole dimensioni, per cui rsync dedica la maggior parte del tempo alle operazioni sui metadati piuttosto che al trasferimento effettivo dei dati;
  • sia l'origine che la destinazione sono supportate da storage veloce (NVMe, SSD o un RAID ben configurato);
  • la rete tra origine e destinazione è veloce e stabile (1 Gbps o superiore, bassa perdita di pacchetti);
  • un singolo processo rsync è limitato dalla CPU o dal throughput per flusso, non dal disco o dal collegamento.

Per directory piccole, dischi rotanti lenti o una rete satura, il normale rsync è di solito sufficiente.

La directory ~/.parsyncfp

parsyncfp crea sul server di origine una directory cache chiamata ~/.parsyncfp. Al suo interno troverete la sottodirectory fpcache, che contiene il log di fpart, i file PID dei processi rsync in esecuzione e i file dei blocchi che elencano i percorsi che ciascun rsync deve copiare. I file di log sono contrassegnati con la data e non vengono sovrascritti tra un'esecuzione e l'altra, quindi le esecuzioni precedenti possono essere consultate in seguito.

Se desiderate eseguire più istanze di parsyncfp contemporaneamente, assegnate a ciascuna una posizione cache separata con l'opzione --altcache. parsyncfp rileva altre istanze in esecuzione all'avvio e le segnala, in modo che eventuali esecuzioni sovrapposte accidentali diventino visibili tempestivamente.

Installazione delle dipendenze

parsyncfp stesso si basa su rsync (il trasporto) e fpart (per suddividere l'albero di origine in blocchi). Installate 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. Abilitate prima il repository EPEL, quindi installate 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. Abilitate quello corretto per la vostra versione:

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

Info

Se la vostra distribuzione non include affatto fpart (ad esempio RHEL 10 o le sue ricompilazioni al momento della stesura di questo testo), oppure preferite non usare EPEL, compilate fpart dal sorgente. Il repository ufficiale è il repository GitHub di fpart; il README elenca un piccolo insieme di dipendenze di compilazione (un compilatore C, make e gli header standard della libreria C).

Installazione di parsyncfp

parsyncfp è un unico script Perl ospitato su GitHub. Scaricatelo, rendetelo eseguibile e spostatelo in una directory presente nel vostro PATH, in modo da poterlo richiamare senza digitare il percorso completo:

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

Verificate che lo script venga eseguito:

parsyncfp --help

Se compare 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 essere in grado di accedere alla destinazione senza password. Generate una coppia di chiavi sull'origine (se non ne esiste già una) e copiate la chiave pubblica sulla destinazione:

ssh-keygen ssh-copy-id user@target_host

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

ssh user@target_host

Esecuzione di un trasferimento

Un tipico comando parsyncfp è simile a questo:

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 cache e copia il contenuto di /dir/local/www in /var/dir/ sull'host di destinazione 192.168.67.1.

Info

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

Parametri principali del comando

  • --NP imposta il numero di processi rsync paralleli. Un punto di partenza ragionevole è tra 4 e 8; aumentate il numero gradualmente, e solo se dischi e rete non sono ancora saturi. Impostare --NP pari al numero di core della CPU raramente è di per sé la scelta giusta.
  • --altcache specifica una directory cache alternativa. È utile quando eseguite più istanze di parsyncfp contemporaneamente, oppure quando la posizione predefinita si trova su storage lento. Evitate di puntarla verso una posizione basata su tmpfs (come /tmp su molte distribuzioni), poiché gli elenchi dei blocchi per alberi di origine molto grandi possono diventare voluminosi e non è opportuno che occupino RAM.
  • --startdir imposta la directory di lavoro utilizzata come base per i percorsi di origine successivi.
  • Gli argomenti dopo --startdir sono le directory di origine da copiare (una o più, separate da spazi), seguite dalla destinazione in stile rsync nella forma user@host:/path/.

Per l'elenco completo delle opzioni, eseguite parsyncfp --help oppure consultate la documentazione upstream.

Opzioni aggiuntive utili

Una volta che il trasferimento di base funziona, vale la pena conoscere alcune opzioni per gli utilizzi 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 non appena il carico medio del sistema supera il valore indicato. Utile su server di origine molto occupati, ma consultate l'avviso più sotto prima di utilizzarla.
  • --chunksize=5G controlla la dimensione di ciascun blocco fpart. Blocchi più grandi riducono l'overhead per blocco nei trasferimenti con molti file piccoli; blocchi più piccoli migliorano il parallelismo nei trasferimenti con pochi file molto grandi.
  • --rsyncopts="-a -s -x" consente di passare flag aggiuntivi direttamente ai processi rsync sottostanti. Usatela per abilitare la compressione (-z), impostare una dimensione di blocco personalizzata o applicare altre ottimizzazioni di rsync. Non passate --delete tramite --rsyncopts; consultate la sezione Limitazioni più sotto per capire perché ciò non è sicuro.
  • --verbose=2 aumenta il livello di dettaglio del log, facilitando la risoluzione dei problemi nelle prime esecuzioni.

Warning

L'autore originale ha documentato un problema noto relativo a --maxload: quando parsyncfp attraversa ripetuti cicli di sospensione e ripresa, alcuni file di origine potrebbero non essere trasferiti alla destinazione. Se utilizzate --maxload, impostate la soglia abbastanza alta da evitare che le sospensioni vengano mai attivate, oppure verificate il risultato con un controllo di coerenza separato al termine del trasferimento.

Limitazioni

Anche su hardware adeguato, parsyncfp comporta compromessi che è bene 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 viene passata l'opzione --delete, ogni processo cercherà di eliminare sulla destinazione i file che non fanno parte del proprio blocco, cioè file che appartengono legittimamente ad altri blocchi. Questo può cancellare ampie porzioni della destinazione. Utilizzate il normale rsync (oppure un passaggio di pulizia separato) quando avete bisogno della semantica di --delete.
  • parsyncfp non preserva un ordine globale dei file tra i processi rsync paralleli, quindi l'ordine in cui i file compaiono sulla destinazione non è prevedibile. Questo è rilevante solo per i flussi di lavoro che dipendono dai timestamp dei file o dall'ordine di elenco delle directory durante la copia stessa.
  • Su array HDD, molti processi rsync paralleli trasformano quello che sarebbe un pattern di lettura sequenziale in uno quasi casuale, il che può risultare più lento rispetto a un singolo rsync. Gli SSD e i drive NVMe ne risentono molto meno.
  • Su 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 una propria connessione SSH verso la destinazione, quindi valori elevati di --NP moltiplicano l'overhead di stabilimento della connessione. Su collegamenti WAN con perdita di pacchetti o alta latenza, questo può peggiorare la congestione anziché migliorarla. In questo caso, un numero inferiore di processi con un rsync ottimizzato (compressione, dimensione di blocco maggiore) spesso ottiene prestazioni migliori rispetto a molti processi paralleli.

Vedi anche

Se parsyncfp risulta più pesante del necessario, il pacchetto fpart include anche fpsync, un wrapper parallelo per rsync più semplice, dello stesso autore. Utilizza la stessa logica di suddivisione in blocchi, 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