Beschleunigen / Vermeiden Sie die Berechnung von Rsync-Dateilisten

12

Ich verwende rsync 3.1.1, um zwei Discs synchron zu halten, von denen sich eine im Netzwerk befindet und als Samba-Freigabe bereitgestellt wird /mnt/ROUTER_WD_2TB/. Dies ist die Quelle mit einer Geschwindigkeit von maximal 30-40 MB / s aufgrund von Netzwerkbeschränkungen. Das andere, das Ziel, wird lokal gemountet (Peak 110 MB / s) und ist /mnt/BACKUP_HITACHI_2TB/.

Ich benutze den folgenden rsync-Befehl:

rsync  -haAXi --quiet --append-verify --delete /mnt/ROUTER_WD_2TB/* /mnt/BACKUP_HITACHI_2TB/.

Die Datenträger enthalten viele Dateien, von denen die meisten klein sind.

Das Problem ist, dass rsync ziemlich lange dauert (10-20 m), bevor mit dem Verschieben von Dateien begonnen wird. Ich denke, weil es Dateilisten für eine sehr große Anzahl kleiner Dateien berechnen muss. Während dieses Zeitraums liegt die Newtwork-Auslastung bei niedrigen 200-500 KB / s, während beim Übertragen von Dateien die Geschwindigkeit etwa 40 MB / s beträgt.

Es kommt normalerweise vor, dass rsync ungefähr 15 m benötigt, um endlich etwas zu finden, das kopiert werden muss, dann 5 Sekunden benötigt, um es zu kopieren, und dann weitere 5 Minuten nach anderen zu kopierenden Dateien sucht. Alles in allem dauert eine 5-Sekunden-Kopie 20 Minuten!

Gibt es Maßnahmen, die ich ergreifen könnte, um diesen langen Zeitraum vor dem Kopieren der Dateien zu vermeiden, außer Ordner auszuschließen? Welche Art von "Cache" kann ich implementieren, damit rsync nicht die gesamte Dateiliste von Grund auf neu erstellen muss?

AF7
quelle
1
Haben Sie eine Lösung aus diesem Thread ausprobiert? unix.stackexchange.com/questions/189878/…
UVV
@ UVV Ich habe das nicht getan. Ich kann das tun, aber 1) rsync scheint in meinem Fall aus irgendeinem Grund bereits keinen vollständigen Kern zu verwenden (= Ich bin mir nicht sicher, ob ich CPU-begrenzt bin oder ob die Einschränkung woanders liegt) und 2) Dies ist nur Auf einer Dual-Core-CPU wäre selbst bei einer zweifachen Verbesserung noch ein großer Verbesserungsspielraum vorhanden.
AF7
Ja, das scheint mir verrückt zu sein. Warum ist rsync so langsam? Selbst mit "--size-only" scheint es ewig zu dauern, bis rsync seine inkrementelle Dateiliste erstellt. Warum? Ich kann die Dateigrößen manuell überprüfen und feststellen, welche sich viel schneller geändert haben! Was macht es so viel Zeit zu verschwenden und wie schalte ich diese ausgefallenen Funktionen aus? EDIT: Ah, egal, ich hatte versehentlich die 'c'-Flagge gesetzt. Ohne die Prüfsummen geht es dabei sehr schnell.
Ben Farmer

Antworten:

5

Wenn rsyncSie zwischen zwei lokalen Dateibäumen kopieren, werden die meisten Optimierungen deaktiviert (einschließlich des Delta-Algorithmus, für den es bekannt ist). Wenn Sie ein rsyncauf Ihrem Remote-Server ausführen können (sodass Sie ein echtes Client-Server-Szenario in Ihrem Netzwerk erhalten), erhalten Sie eine erhebliche Traktion.

Dennoch sind hier andere Optionen zu berücksichtigen

  1. Kopieren, ohne sich Gedanken über das Löschen alter Dateien machen zu müssen. Auf diese Weise können Sie möglicherweise häufiger eine schnellere Übertragung durchführen und die langsamere Bereinigung nur einmal am Tag ablehnen:

    cp -au /mnt/ROUTER_WD_2TB/. /mnt/BACKUP_HITACHI_2TB/
    
  2. Verwenden Sie eine Variante des rsyncStandardlöschalgorithmus, um zu vermeiden, dass vor der Übertragung eine vollständige Liste der Dateien erstellt wird:

    rsync -haAXi --quiet --delete --delete-during /mnt/ROUTER_WD_2TB/ /mnt/BACKUP_HITACHI_2TB/
    
  3. Teilen Sie die Verzeichnisse der obersten Ebene in separate Aufgaben auf und führen Sie sie parallel aus. Sie werden vielleicht feststellen, dass dies nicht wirklich hilft, wenn Sie an die Festplatten-E / A gebunden sind, und beim Drehen von Platten wird dies mit ziemlicher Sicherheit die Situation verschlimmern.

    for d in /mnt/ROUTER_WD_2TB/*
    do
        rsync -haAXi --quiet --delete --delete-during "$d" /mnt/BACKUP_HITACHI_2TB/ >"/tmp/rsync.${d/*\/}.log" 2>&1 &
    done
    wait
    cat /tmp/rsync.*.log
    rm -f /tmp/rsync.*.log
    

Wenn keiner dieser Vorschläge hilft, lohnt es sich, einen weiteren hinzuzufügen, --verboseum rsynczu sehen, was er tut. Ich vermute, es klappert durch alle unveränderten Dateien, und wenn Sie genug Dateien haben, dauert dies einfach lange.

Roaima
quelle
--delete --delete-duringIch habe es nicht für mich getan - das hat immer noch eine inkrementelle Dateiliste gesendet -, sondern bin --delete --delete-beforedirekt zu: gegangen building file list, was ein großer Fortschritt zu sein scheint. Meiner Ansicht nach.
mlissner
Nein, das ist leider rückwärts. Wenn Sie verwenden --delete-before, werden rsynczwei Durchgänge im Dateibaum ausgeführt: einer zum Löschen und der nächste zum Kopieren.
Roaima
Vielen Dank. In diesem Fall ... eine Möglichkeit, das Erstellen der inkrementellen Dateiliste zu vermeiden?
mlissner
@mlissner es hängt von verschiedenen Faktoren ab. Das mit Abstand größte Problem ist, ob Sie lokal zu lokal oder lokal zu remote kopieren.
Roaima
Für mich ist alles lokal zu lokal, obwohl einer der Einheimischen ein USB-Laufwerk ist?
mlissner
-2

Sie können verwenden -vv, um das gesamte Protokoll von anzuzeigen rsync.

namaiiee
quelle
1
Wie würde dies die Frage beantworten, dh wie würde dies die Dinge beschleunigen?
Kusalananda
Sie konnten nur die Protokolle sehen, was zeigt, warum das Starten von rsync so lange gedauert hat. Vielleicht gibt es Dateien, die Sie von rsync überspringen können, um die Zeit zu verkürzen.
Namaiiee