Come posso rallentare rsync?


35

Sto cercando di copiare il contenuto di una chiavetta USB non funzionante. Se leggo i dati troppo velocemente, il chip del controller dell'unità si surriscalda e l'unità scompare dal sistema. Quando ciò accade, devo scollegare l'unità, attendere circa un minuto affinché si raffreddi, ricollegarlo e riavviare la copia.

Ho un vecchio backup del contenuto dell'unità, quindi il modo ovvio per ottenere il resto dei dati è quello di utilizzare rsyncper aggiornare il backup, ma questo si verifica nell'intera "lettura troppo veloce, l'unità svanisce e devo ricominciare da capo "problema. C'è un modo per dire rsyncdi leggere solo X megabyte di dati al minuto? In alternativa, è possibile dirgli di sospendere le operazioni quando l'unità scompare e riprendere quando viene ricollegato?


24
Hai pensato di raffreddare l'unità?
AEonAX,

3
Quanto è piena l'unità? Se l'unità è piena per oltre il 50%, è probabilmente preferibile eseguire prima il mirroring dell'unità guasta e quindi iniziare a gestire solo cose più complicate sul mirror.
Kasperd,

1
@AEonAX: Anche se un'idea originale (sic!) Pronta all'uso, non consiglierei questo: stai mettendo ulteriore stress termico sul dispositivo e potrebbe fallire completamente.
Piskvor,

Risposte:


46

A differenza dell'esperienza di DopeGhoti, il --bwlimitflag limita il trasferimento dei dati, con my rsync (v3.1.2).

test:

$ dd if=/dev/urandom bs=1M count=10 of=data
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0871822 s, 120 MB/s

$ du -h data
10M     data

$ time rsync -q data fast
0.065 seconds

$ time rsync -q --bwlimit=1M data slow
10.004 seconds

(nota: il mio timeoutput sembra diverso dalla maggior parte delle timeinvocazioni ( zshfunzione), quei tempi non sono stati modificati da me)

Altrimenti, forse qualcosa sulla falsariga di un doppio -execin find. Io credo che rsync -Rdovrebbe creare e copiare le cartelle principali, ma se non lo fa, allora cp --parentsdovrebbe.

$ find /failing/usb -exec rsync -R {} /somewhere/safe/ \; -exec sleep 1 \;

Nota : controlla anche ddrescue , potrebbe essere giusto quello che stai cercando :)


1
Sì. DG potrebbe essersi confuso con la parola "larghezza di banda", ma ciò si applica a qualsiasi canale che trasporta dati, non solo alla rete. La pagina man dice specificamente: --bwlimit=KBPS limit I/O bandwidth; KBytes per secondnessuna menzione di rete. Sfogliare casualmente il codice, questo limita la velocità di lettura , indipendentemente dalla destinazione. Inoltre, aneddoto: utilizzo questa opzione da anni ormai per limitare la velocità di scrittura da locale a locale. linux.die.net/man/1/rsync
Piskvor il

1
Va bene, al secondo sguardo, conta effettivamente il numero di byte scritti e dorme per un tempo calcolato. io.c, righe 832-3: if (bwlimit_writemax) sleep_for_bwlimit(n);In ogni caso, probabilmente funzionerebbe come previsto, leggendo a raffiche brevi e dormendo in mezzo. Vorrei raccomandare di iniziare con un valore basso e aumentando attentamente, o semplicemente lasciare che il trasferimento lento venga eseguito durante la notte.
Piskvor,

25

Un po 'di una soluzione MacGyver, ma in passato ho avuto un buon successo: inserisci
un vecchio hub USB 1 tra la chiavetta e il computer. In nessun modo all'inferno si copierà velocemente in quel modo :-)

Altre possibilità: se hai un'altra chiavetta disponibile, inseriscila su un'altra porta USB collegata allo stesso hub di root (in modo da condividere la larghezza di banda con la chiavetta problematica).
Ora avvia una grande operazione di scrittura sullo stick extra in modo che entrambi gli stick siano in competizione per la larghezza di banda. Per un ulteriore controllo è possibile utilizzare ionice per ridurre ulteriormente la priorità sullo stick del problema.


1
Sono sicuro che dovrebbe esserci un modo per far funzionare le porte come USB 1.1 tramite una soluzione software, possibilmente dando opzioni al modulo del kernel USB.
André Borie,

@ AndréBorie: c'è - bbs.archlinux.org/viewtopic.php?pid=1342593#p1342593 , ma poiché ci sono accelerazioni efficaci in SW, questa è una soluzione un po 'bruta.
Piskvor,

@Piskvor negozia una velocità di trasferimento inferiore con il dispositivo, proprio come farebbe con un hub USB 1. Non vedo nulla di "forza bruta" al riguardo.
André Borie,

Ok, cattiva scelta della parola, lo ammetto. Ma la riconfigurazione dei dispositivi IMHO richiederebbe privilegi speciali (root o almeno% adm), mentre il controllo della velocità di lettura per processo sarebbe più semplice. (Inoltre, ci sono dispositivi che non funzionano affatto al di fuori di USB 2.0 - in violazione delle specifiche)
Piskvor

13

È possibile utilizzare rsync --bwlimit=RATEper limitare la velocità di trasferimento dei file che, in base ai commenti seguenti, in realtà sembra funzionare in modo specifico limitando la velocità di lettura dei dati, che è esattamente quello che stai cercando.



3
ionice dà la priorità, se due cose leggono allora, per impostazione predefinita ottengono 50/50. ionice può aggiustarlo, ma se c'è solo una cosa da leggere, otterrà il 100%.
Coteyr,

@coteyr Hai ragione ed è per questo che devi combinarlo con un secondo processo di consumo della larghezza di banda sullo stesso hub principale USB. Vedi la mia risposta
Tonny,

2
Fortunatamente, la tua risposta è errata: --bwlimitimposta il limite I / O, non necessariamente un limite di rete . Testato più volte in vari scenari: questa opzione fa sì che rsync si limiti alla lettura , indipendentemente dalla destinazione. (L'ho scoperto in uno scenario simile, in cui le scritture veloci su un dispositivo locale lento li hanno fatti fallire)
Piskvor,

1
@piskvor - grazie per quello! Questo è ciò che amo di questo posto; Continuo a imparare cose nuove (:
DopeGhoti il

8

Altre soluzioni, oltre a rsync --bwlimit=100, per 100 KiB / s.

  1. Utilizzare ddrescuecon l' --max-read-rateopzione per una copia completa del disco. Ciò consentirà anche di riavviare una copia completa del disco da dove era stata interrotta dopo un errore.

    ddrescue --max-read-rate=100K /failing/usb output.img output.logfile
    

ddrescueha anche molte altre opzioni rilevanti per il recupero dei dati, vedere il manuale qui .

  1. Utilizzare pv("visualizzatore di condotte ") con l' --rate-limitopzione o lo throttlestrumento per classificare i tubi di limite. pvpuò anche mostrare progressi. Puoi farlo funzionare per qualsiasi strumento che utilizza una pipe o può usare una pipe:

    tar -cf - /failing/usb | throttle -K 100 | tar -C /your/outputfolder/ -xvf -
    

    o

    tar -cf - /failing/usb | pv --rate-limit 100k | tar -C /your/outputfolder/  -xvf -
    

    Dai un'occhiata alla pagina man pv per ulteriori impostazioni ed esempi. Per throttle, potresti voler provare anche l' -wopzione, che determina come viene calcolata la velocità, vedi la manpage dell'acceleratore .


Questo è uno strumento utile, non lo sapevo, grazie! pvmanpage contiene ancora più esempi di vari usi.
Piskvor,

Ho pvcercato più volte da quando ho scoperto di nuovo nei miei giorni di jocking su nastro. Indietro quando tar ha scritto su unità a nastro. :)
Dan Garthwaite,
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.