Wie kann ich rsync verlangsamen?

35

Ich versuche, den Inhalt eines fehlerhaften USB-Sticks zu kopieren. Wenn ich die Daten zu schnell lese, überhitzt sich der Controller-Chip des Laufwerks und das Laufwerk verschwindet aus dem System. In diesem Fall muss ich das Laufwerk ausstecken, etwa eine Minute warten, bis es abgekühlt ist, es wieder einstecken und den Kopiervorgang erneut starten.

Ich habe eine alte Sicherungskopie des Laufwerkinhalts, daher ist es naheliegend rsync, die Sicherungskopie mit den restlichen Daten auf den neuesten Stand zu bringen. Dies führt jedoch dazu, dass "zu schnell gelesen wird, das Laufwerk verschwindet" und ich muss von vorne anfangen. Kann man sagen rsync, dass nur X Megabyte Daten pro Minute gelesen werden? Ist es alternativ möglich, ihn anzuweisen, Vorgänge anzuhalten, wenn das Laufwerk verschwindet, und fortzufahren, wenn es wieder eingesteckt wird?

Kennzeichen
quelle
24
Haben Sie darüber nachgedacht, das Laufwerk zu kühlen?
AEonAX
3
Wie voll ist die Festplatte? Wenn das Laufwerk zu mehr als 50% voll ist, ist es wahrscheinlich besser, zuerst das fehlerhafte Laufwerk zu spiegeln und dann erst kompliziertere Aufgaben auf dem Spiegel zu erledigen.
Kasperd
1
@AEonAX: Obwohl es eine coole (sic!) Out-of-the-Box-Idee ist, würde ich dies nicht empfehlen: Sie setzen das Gerät einer zusätzlichen thermischen Belastung aus und es könnte vollständig ausfallen.
Piskvor

Antworten:

46

Im Gegensatz zu DopeGhotis Erfahrung schränkt das --bwlimitFlag die Datenübertragung mit meinem rsync (v3.1.2) ein.

Prüfung:

$ 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

(Hinweis: Meine timeAusgabe unterscheidet sich von den meisten timeAufrufen ( zshFunktion). Diese Zeiten wurden nicht von mir bearbeitet.)

Sonst vielleicht etwas in der Art eines Double- -execIn find. Ich glaube , das rsync -Rsollte die übergeordneten Ordner erstellen und kopieren, aber wenn nicht, dann cp --parentssollte.

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

Hinweis : Schauen Sie sich auch ddrescue an , es könnte richtig sein, wonach Sie suchen :)

Aprikosenjunge
quelle
1
Jep. DG ist möglicherweise durch das Wort "Bandbreite" verwirrt worden - dies gilt jedoch für jeden datentragenden Kanal, nicht nur für das Netzwerk. Die Manpage sagt ausdrücklich:, --bwlimit=KBPS limit I/O bandwidth; KBytes per secondkeine Erwähnung des Netzwerks. Beiläufig den Code durchsuchen, schränkt dies die Lesegeschwindigkeit, unabhängig von Ziel. Plus Anekdote: Ich benutze diese Option seit Jahren , um die Schreibgeschwindigkeit von lokal zu lokal zu begrenzen. linux.die.net/man/1/rsync
Piskvor
1
Okay, auf den zweiten Blick zählt es tatsächlich die Anzahl der geschriebenen Bytes und schläft für eine berechnete Zeit. io.c, Zeilen 832-3: if (bwlimit_writemax) sleep_for_bwlimit(n);In jedem Fall würde dies wahrscheinlich wie beabsichtigt funktionieren, kurze Bursts einlesen und dazwischen schlafen. Ich würde empfehlen, mit einem niedrigen Wert zu beginnen und vorsichtig zu erhöhen, oder einfach die langsame Übertragung über Nacht laufen zu lassen.
Piskvor
25

Ein bisschen wie eine MacGyver-Lösung, aber ich hatte in der Vergangenheit gute Erfolge damit:
Stecken Sie einen alten USB-1-Hub zwischen den Stick und den Computer. Auf keinen Fall wird es so schnell kopieren :-)

Andere Möglichkeit: Wenn Sie einen anderen Stick zur Verfügung haben, schließen Sie ihn an einen anderen USB-Port an, der mit demselben Root-Hub verbunden ist (damit er die Bandbreite mit Ihrem Problem-Stick teilt).
Starten Sie jetzt einen großen Schreibvorgang für den zusätzlichen Stick, damit beide Sticks um Bandbreite konkurrieren. Zur weiteren Kontrolle können Sie ionice verwenden , um die Priorität des Problemsticks noch weiter zu verringern .

Tonny
quelle
1
Ich bin mir sicher, dass es eine Möglichkeit geben sollte, die Ports über eine Softwarelösung als USB 1.1 zu betreiben, möglicherweise indem dem USB-Kernelmodul Optionen zugewiesen werden.
André Borie
@ AndréBorie: Es gibt - bbs.archlinux.org/viewtopic.php?pid=1342593#p1342593 , aber da es in SW wirksame Drosseln gibt, ist dies eine Art Brute-Force-Lösung.
Piskvor
@Piskvor verhandelt es eine niedrigere Übertragungsrate mit dem Gerät, genau wie es ein USB 1 Hub tun würde. Ich sehe keine "rohe Gewalt" daran.
André Borie
Okay, schlechte Wortwahl, gebe ich zu. Die IMHO-Neukonfiguration von Geräten würde jedoch spezielle Berechtigungen erfordern (root oder mindestens% adm), während die Steuerung der Lesegeschwindigkeit pro Prozess einfacher wäre. (Außerdem gibt es Geräte, die überhaupt nicht außerhalb von USB 2.0 funktionieren - ein Verstoß gegen die Spezifikation)
Piskvor
13

Mithilfe von können Sie rsync --bwlimit=RATEdie Dateiübertragungsgeschwindigkeit drosseln. Basierend auf den folgenden Kommentaren scheint dies tatsächlich zu funktionieren, indem Sie die Lesegeschwindigkeit der Daten drosseln, genau das, wonach Sie suchen.

DopeGhoti
quelle
6
ionice? linux.die.net/man/1/ionice
steve
3
ionice gibt nur Priorität, wenn zwei Dinge gelesen werden, erhalten sie standardmäßig 50/50. ionice kann das korrigieren, aber wenn es nur eins gibt, wird es 100% bekommen.
Coteyr
@coteyr Du hast recht und deshalb musst du es mit einem zweiten Bandbreiten-Essprozess auf demselben USB-Root-Hub kombinieren. Siehe meine Antwort.
Tonny
2
Zum Glück ist Ihre Antwort falsch: --bwlimitLegt ein E / A-Limit fest, nicht unbedingt ein Netzwerklimit . In verschiedenen Szenarien mehrfach getestet: Mit dieser Option beschränkt sich rsync auf das Lesen , unabhängig vom Ziel. (Dies wurde in einem ähnlichen Szenario herausgefunden, in dem schnelle Schreibvorgänge auf einem langsamen lokalen Gerät zum
Fehlschlagen führten.
1
@piskvor - danke dafür! Das ist es, was ich an diesem Ort liebe. Ich lerne
ständig
8

Weitere Lösungen zusätzlich zum rsync --bwlimit=100für 100KiB / s.

  1. Verwenden Sie ddrescuemit der --max-read-rateOption für eine vollständige Festplattenkopie. Auf diese Weise können Sie auch eine vollständige Datenträgerkopie neu starten, die nach einem Fehler unterbrochen wurde.

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

ddrescueEs gibt auch viele andere Optionen, die für die Datenwiederherstellung relevant sind. Weitere Informationen finden Sie im Handbuch hier .

  1. Verwenden Sie pv("Rohrbetrachter") mit der --rate-limitOption oder dem throttleTool, um die Anzahl der Rohre zu begrenzen. pvkann auch Fortschritte zeigen. Sie können diese Funktion für jedes Tool ausführen, das eine Pipe verwendet, oder Sie können eine Pipe verwenden:

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

    oder

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

    Weitere Einstellungen und Beispiele finden Sie auf der Manpage zu pv . Für throttle, möchten Sie vielleicht auch ausprobieren -wOption, die bestimmt , wie die Geschwindigkeit berechnet wird, finden Sie in der Drossel manpage .

jmiserez
quelle
Nun, das ist ein nützliches Werkzeug, wusste das nicht, danke! pvDie Manpage enthält noch mehr Beispiele für verschiedene Verwendungszwecke.
Piskvor
Ich habe pvimmer und immer wieder danach gegriffen, seit ich es in meinen Tagen als Tape-Jocker entdeckt habe. Damals, als tar auf Bandlaufwerke schrieb. :)
Dan Garthwaite