Come velocizzare rsync per file di piccole dimensioni


15

Sto cercando di trasferire migliaia di piccoli file da un server a un altro usando il seguente comando:

rsync -zr --delete /home/user/ user@10.1.1.1::backup

Attualmente il trasferimento richiede molto tempo (non l'ho programmato). C'è un modo per renderlo più veloce? Dovrei usare un altro strumento? Dovrei usare rsync su ssh piuttosto che usare il protocollo rsync?


Sono davvero solo centinaia? Come in meno di un paio di migliaia?
Zoredache

Qualcosa in più ... 475.576 per un totale di 9,3 GB
Noodles

Ciò andrà a succhiare usando quasi tutti gli strumenti che funzionano a livello di filesystem. Ho il sospetto che se tu facessi un po 'di profilazione vedresti che un notevole ammontare di tempo viene speso chiamando stat().
Zoredache

Perché no -ama -r?
kamae

Risposte:


13

È necessario determinare il collo di bottiglia. Non è rsync. Probabilmente non è la larghezza di banda della tua rete. Come suggerito da @Zoredache , è molto probabile l'enorme numero di iop generati da tutte le stat()chiamate. Qualsiasi strumento di sincronizzazione dovrà stat i file. Durante la sincronizzazione eseguire iostatper verificare.

Quindi la domanda diventa; come ottimizzare stat? Due risposte facili:

  1. ottenere un sottosistema disco più veloce (su entrambi gli host se necessario) e
  2. ottimizza il tuo filesystem (es. per ext3 mount con noatimee aggiungi a dir_index).

Se per caso non è il limite del disco iops, allora potresti provare a dividere l'albero dir in più alberi distinti ed eseguire più rsync.


1
Grazie, esaminerò dir_index e vedrò come ottengo (usiamo già noatime). Sembra che il disco io sia il collo di bottiglia, ma stiamo già eseguendo unità SAS da 15k in RAID 5. Il passo successivo sarebbe SSD, ma la nostra società di hosting non ci offre ancora questa opzione.
Noodles

5

La compressione non è molto utile per file di piccole dimensioni (ad esempio meno di 100 byte). Per file di piccole dimensioni, a volte la versione compressa può essere persino più grande dell'originale. Prova il rsynccomando senza la -zbandiera.

sshfa bene alla sicurezza, ma non renderà il trasferimento più veloce. In effetti, renderebbe il trasferimento più lento a causa della necessità di crittografia / decrittografia.

rsyncpotrebbe non sembrare veloce la prima volta che viene eseguito perché ci sono molti dati da trasferire. Tuttavia, se si prevede di eseguire periodicamente questo comando, le esecuzioni successive potrebbero essere molto più veloci poiché rsyncè intelligente non trasferire file che non sono stati modificati.


Se usi solo il rsyncclient, userà SSH dietro le quinte. Devi fare di tutto per disabilitare la crittografia quando usi rsync. Vedi: stackoverflow.com/a/1821574/64911
mlissner

1

Quale versione di rsync stai usando? Nulla di più vecchio di 3.0.0 (su entrambe le estremità) non ha la funzione di lista file incrementale, che accelera i trasferimenti di grandi dimensioni.


Utilizzo di rsync 3.0.5 su entrambi i server.
Noodles

1

Aggiungi -v --progressalla tua riga di comando rsync

rsync viene eseguito in 2 passaggi:

  1. navigare in profondità tutti i file su entrambe le piattaforme per confrontare le loro dimensioni e mdate
  2. eseguire il trasferimento effettivo

Se stai sincronizzando migliaia di piccoli file nelle directory nidificate, può essere semplicemente che rsync passi la maggior parte del tempo andando in sottocartelle e trovando tutti i file

Se il tempo non viene impiegato per la navigazione, il tempo potrebbe semplicemente essere dovuto all'aggiunta di tutte le latenze che iniziano ogni nuovo trasferimento di file.


1

Nel caso in cui siano coinvolti filesystem ext3 o ext4, controllare che entrambi abbiano la funzione dir_index abilitata! Questo triplicato il rendimento di rsync nel mio caso.

Vedi i dettagli nella mia risposta su: /server//a/759421/80414

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.