Rsync più veloce di una directory enorme che non è stata modificata


13

Usiamo rsync per i server di backup.

Purtroppo la rete con alcuni server è lenta.

Ci vogliono fino a cinque minuti per rilevare rsync, che nulla è cambiato in enormi directory. Questi enormi alberi di directory contengono molti piccoli file (circa 80.000 file).

Immagino che i client rsync inviino dati per ciascuno dei file 80k.

Poiché la rete è lenta, vorrei evitare di inviare informazioni 80k volte su ciascun file.

C'è un modo per dire a rsync di fare una somma hash di un albero di sottodirectory?

In questo modo il client rsync invierebbe solo pochi byte per un enorme albero di directory.

Aggiornare

Fino ad ora la mia strategia è quella di utilizzare rsync. Ma se uno strumento diverso si adatta meglio qui, sono in grado di passare. Entrambi (server e client) sono sotto il mio controllo.

Update2

Ci sono 80k file in un albero di directory . Ogni singola directory non ha più di 2k file o sottodirectory

Update3

Dettagli sulla lentezza della rete:

time ssh einswp 'cd attachments/200 && ls -lLR' >/tmp/list
real    0m2.645s

Dimensione del file tmp / list: 2MByte

time scp einswp:/tmp/list tmp/
real    0m2.821s

Conclusione: scp ha la stessa velocità (nessuna sorpresa)

time scp einswp:tmp/100MB tmp/
real    1m24.049s

Velocità: 1,2 MB / s


1
Potresti leggere su zsync. Non l'ho usato da solo, ma da quello che ho letto, esegue il pre-rendering dei metadati sul lato server e potrebbe accelerare i trasferimenti nel tuo caso. Potrebbe valere la pena testarlo comunque. Oltre a ciò, l'unica altra soluzione di cui sono a conoscenza è la sincronizzazione a livello di blocco in tempo reale fornita con alcune soluzioni san / nas.
Aaron il

Risposte:


36

Alcuni punti non correlati:

80K sono molti file.

80.000 file in una directory? Nessun sistema operativo o app gestisce questa situazione molto bene per impostazione predefinita. Ti capita di notare questo problema con rsync.

Controlla la tua versione di rsync

Modern rsync gestisce le grandi directory molto meglio che in passato. Assicurati di utilizzare l'ultima versione.

Persino la vecchia rsync gestisce directory di grandi dimensioni abbastanza bene su collegamenti ad alta latenza ... ma i file 80k non sono grandi ... è enorme!

Detto questo, l'utilizzo della memoria di rsync è direttamente proporzionale al numero di file in un albero. Le directory di grandi dimensioni richiedono una grande quantità di RAM. La lentezza può essere dovuta alla mancanza di RAM su entrambi i lati. Esegui un test mentre guardi l'utilizzo della memoria. Linux utilizza qualsiasi RAM rimasta come cache del disco, quindi se si sta esaurendo la RAM, c'è meno cache sul disco. Se esaurisci la RAM e il sistema inizia a utilizzare lo scambio, le prestazioni saranno davvero pessime.

Assicurarsi che --checksum non sia utilizzato

--checksum(o -c) richiede la lettura di ogni singolo blocco di ogni file. Probabilmente è possibile cavarsela con il comportamento predefinito della sola lettura dei tempi di modifica (memorizzati nell'inode).

Dividi il lavoro in piccoli lotti.

Ci sono alcuni progetti come Gigasync che "ridurrà il carico di lavoro usando perl per richiamare l'albero delle directory, costruendo piccoli elenchi di file da trasferire con rsync".

La scansione della directory extra sarà una grande quantità di overhead, ma forse sarà una vincita netta.

Le impostazioni predefinite del sistema operativo non sono fatte per questa situazione.

Se stai usando Linux / FreeBSD / etc con tutte le impostazioni predefinite, le prestazioni saranno terribili per tutte le tue applicazioni. Le impostazioni predefinite presuppongono directory più piccole in modo da non sprecare RAM in cache di grandi dimensioni.

Ottimizza il tuo filesystem per gestire meglio directory di grandi dimensioni : le cartelle di grandi dimensioni rallentano le prestazioni di I / O?

Guarda la "cache dei nomi"

I sistemi operativi simili a BSD hanno una cache che accelera la ricerca di un nome nell'inode (la cache "namei"). C'è una cache namei per ogni directory. Se è troppo piccola, è un ostacolo più che un'ottimizzazione. Poiché rsync sta eseguendo un file lstat () su ciascun file, l'accesso all'inode è possibile per ciascuno dei file 80k. Ciò potrebbe far esplodere la cache. Ricercare come ottimizzare le prestazioni della directory dei file sul proprio sistema.

Prendi in considerazione un file system diverso

XFS è stato progettato per gestire directory più grandi. Vedi File system per un gran numero di file in una singola directory

Forse 5 minuti è il massimo che puoi fare.

Prendi in considerazione il calcolo del numero di blocchi del disco che stai leggendo e calcola quanto velocemente dovresti aspettarti che l'hardware sia in grado di leggere quel numero di blocchi.

Forse le tue aspettative sono troppo alte. Considera quanti blocchi di dischi devono essere letti per eseguire una risincronizzazione senza file modificati: ogni server dovrà leggere la directory e leggere un inode per file. Supponiamo che nulla sia memorizzato nella cache perché, beh, i file 80k probabilmente hanno rovinato la cache. Diciamo che sono 80k i blocchi per semplificare la matematica. Sono circa 40 milioni di dati, che dovrebbero essere leggibili in pochi secondi. Tuttavia, se è necessario cercare un disco tra ciascun blocco, ciò potrebbe richiedere molto più tempo.

Quindi dovrai leggere circa 80.000 blocchi di dischi. Quanto velocemente può farlo il tuo disco rigido? Considerando che si tratta di I / O casuali, non di una lettura lineare lunga, 5 minuti potrebbero essere piuttosto eccellenti. Quello è 1 / (80000/600), o un disco letto ogni 7,5 ms. È veloce o lento per il tuo disco rigido? Dipende dal modello.

Punto di riferimento contro qualcosa di simile

Un altro modo di pensarci è questo. Se nessun file è stato modificato, ls -Llrsvolge la stessa quantità di attività del disco ma non legge mai i dati dei file (solo metadati). Il tempo ls -Llrnecessario per correre è il limite superiore.

  • Rsync (senza i file modificati) è significativamente più lento di ls -Llr? Quindi le opzioni che stai usando per rsync possono essere migliorate. Forse -cè abilitato o qualche altro flag che legge più di semplici directory e metadati (dati inode).

  • Rsync (senza i file modificati) è quasi veloce ls -Llr? Quindi hai sintonizzato rsync nel miglior modo possibile. Devi ottimizzare il sistema operativo, aggiungere RAM, ottenere unità più veloci, cambiare file system, ecc.

Parla con i tuoi sviluppatori

I file 80k sono solo cattivi design. Pochissimi file system e strumenti di sistema gestiscono molto bene directory così grandi. Se i nomi dei file sono abcdefg.txt, considerare di memorizzarli in abdc / abcdefg.txt (notare la ripetizione). Questo suddivide le directory in più piccole, ma non richiede una grande modifica al codice.

Inoltre .... considera l'utilizzo di un database. Se hai 80k file in una directory, forse i tuoi sviluppatori stanno lavorando sul fatto che quello che vogliono veramente è un database. MariaDB o MySQL o PostgreSQL sarebbero un'opzione molto migliore per l'archiviazione di grandi quantità di dati.

Ehi, cosa c'è che non va in 5 minuti?

Infine, 5 minuti sono davvero così male? Se si esegue questo backup una volta al giorno, 5 minuti non sono molto tempo. Sì, adoro la velocità. Tuttavia, se 5 minuti sono "abbastanza buoni" per i tuoi clienti, allora sono abbastanza buoni per te. Se non hai uno SLA scritto, che ne dici di una discussione informale con i tuoi utenti per scoprire quanto velocemente si aspettano i backup.

Presumo che tu non abbia posto questa domanda se non fosse necessario migliorare le prestazioni. Tuttavia, se i tuoi clienti sono soddisfatti di 5 minuti, dichiara la vittoria e passa ad altri progetti che richiedono i tuoi sforzi.

Aggiornamento: dopo alcune discussioni abbiamo stabilito che il collo di bottiglia è la rete. Consiglierò 2 cose prima di arrendermi :-).

  • Prova a spremere più larghezza di banda dal tubo con la compressione. Tuttavia, la compressione richiede più CPU, quindi se la tua CPU è sovraccarica, le prestazioni potrebbero peggiorare. Prova rsync con e senza -ze configura il tuo ssh con e senza compressione. Tempo tutte e 4 le combinazioni per vedere se qualcuno di loro ha prestazioni significativamente migliori rispetto ad altri.
  • Guarda il traffico di rete per vedere se ci sono pause. Se ci sono pause, puoi trovare ciò che le sta causando e ottimizzare lì. Se rsync invia sempre, allora sei davvero al limite. Le tue scelte sono:
    • una rete più veloce
    • qualcosa di diverso da rsync
    • avvicinare la fonte e la destinazione. Se non riesci a farlo, puoi risincronizzare con un computer locale e poi risincronizzare con la destinazione reale? Potrebbero esserci dei benefici nel fare questo se il sistema deve essere spento durante la rsync iniziale.

80K sono molti file .: ci sono 80k file in un albero di directory . Ogni singola directory non ha più di 2k file / sottodirectory.
Guettli,

Controlla la tua versione di rsync: fatto, Assicurati che --checksum non sia usato: fatto. Dividi il lavoro in piccoli lotti: grazie darò un'occhiata a Gigasync. I valori predefiniti del sistema operativo non vengono fatti per questa situazione: fatto (il collo di bottiglia è la rete non il sistema operativo). Guarda la "cache dei nomi": fatto (è netto, non OS). Considera un file system diverso: di nuovo netto, non OS. Forse 5 minuti è il massimo che puoi fare .: Penso che potrebbe essere molto più veloce. Parla con i tuoi sviluppatori (usa DB): sarebbe un grande cambiamento. Forse un filesystem con un migliore supporto per il backup lo risolverebbe.
Guettli,

I file 2k per directory sono molto meglio. grazie per l'aggiornamento. Non avevi detto che la rete era lenta. È bassa larghezza di banda, alta latenza o entrambi? Di solito rsync funziona bene con collegamenti ad alta latenza (è stato sviluppato da qualcuno che sta lavorando al suo dottorato di ricerca in Australia mentre si occupa di computer negli Stati Uniti). Prova a farlo "ls -lLR" su ssh e tempo quanto tempo ci vuole per trasmettere il risultato. "time ssh remotehost 'cd / dest && ls -lLR'> / tmp / list". Assicurarsi che l'elenco / tmp / venga creato sull'host locale.
TomOnTime

sì, la rete è lenta. È un peccato.
Guettli,

Quanto è lento? Se usi "scp" per copiare un file 100M, quanto tempo impiega? Inoltre, qual è l'output di "time ssh remotehost 'cd / dest && ls -lLR'> / tmp / list"?
TomOnTime

2

No, questo non è possibile con rsync e sarebbe abbastanza inefficiente sotto un altro aspetto:

Normalmente, rsyncconfronta solo le date di modifica del file e le dimensioni del file. Il tuo approccio forzerebbe la lettura e il checksum del contenuto di tutti i file due volte (sul sistema locale e remoto) per trovare le directory modificate.


1
AFAIK rsync controlla i tempi e le dimensioni. Se entrambe le corrispondenze, il file non viene nuovamente trasferito (almeno nelle impostazioni predefinite). Basterebbe inviare l'hash delle tuple (nome file, dimensione, mtime). Non è necessario eseguire il checksum del contenuto.
Guettli,

Sì, hai ragione, ma comunque rsyncnon lo fa.
Sven

2

Per la sincronizzazione di un gran numero di file (dove poco è cambiato), vale anche la pena impostare noatimele partizioni di origine e destinazione. Ciò consente di risparmiare i tempi di accesso alla scrittura sul disco per ciascun file invariato.


Sì, l'opzione noatime ha senso. Lo usiamo da diversi anni. Immagino sia necessaria un'alternativa a rsync.
Guettli,

2

Puoi anche provare lsyncd, che si sincronizzerà solo quando vengono rilevate modifiche sul filesystem e solo le sottodirectory modificate. L'ho usato per directory con un massimo di due milioni di file su un server decente.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.