Effizienteste Methode zum Ausdünnen eines Backups, das Hardlinks verwendet

Effizienteste Methode zum Ausdünnen eines Backups, das Hardlinks verwendet

Ich habe eine Backup-Festplatte, die Hunderte von Backups derselben Maschine von verschiedenen Daten enthält. Das Backup wurde mit rsync und Hardlinks erstellt, d. h. wenn sich eine Datei nicht ändert, erstellt das Backup-Skript einfach einen Hardlink zu der Datei in einem älteren Backup. Wenn sich eine Datei also nie ändert, haben Sie im Wesentlichen eine Kopie auf der Backup-Festplatte, aber sagen wir 100 Hardlinks dazu in jedem Verzeichnis, die das Backup jedes Datums darstellen (sagen wir back-1, back-2, ... back-n). Wenn ich es ausdünnen möchte, lösche ich eine Teilmenge davon, aber nicht alle. Angenommen, ich möchte back_5, back_6, ... löschen back_10(nur als Beispiel, in meinem realen Szenario gibt es viel mehr). Dann versuche ich, es zu parallelisieren über:

echo back_5 back_6 back_10 | xargs -n 1 -P 0 rm -rf

Dies dauert mehrere Stunden. Gibt es also eine schnellere Möglichkeit, dies zu tun?

Antwort1

Ich kann nicht erkennen, wie Ihre Verwendung vonxargsauf diese Weise ist alles andere als langsam. Meine Manpage sagt, -P ist die Anzahl der Prozesse und -n ist die Anzahl der Argumente. Es gibt keinen speziellen Wert für -P0, also wird das wahrscheinlich ignoriert (oder, wenn es berücksichtigt wird, erhalten Sie null Prozesse, was 24 Stunden Nichts erklären würde!). Und -n1stellt sicher, dass Sie einen bekommenAusführung(2) für jeden Dateinamen, was ungefähr die langsamste Methode ist, die möglich ist.

Ich bezweifle, dass die Parallelisierung dieser Arbeit Ihnen viel bringt. Ich würde denken,

$ echo filenames ... | xargs rm -rf 

würde ausreichen. Sie können mit Werten wie experimentieren, -P4wenn Sie möchten. DurchnichtDurch die Begrenzung der Anzahl der Befehlszeilenargumente minimieren Sie die Aufrufe /bin/rmund lassen die Befehle seriell durch Ihren Festplattencache laufen.

Antwort2

Der DF meldet eine kleine Zahl, da Sie hauptsächlich Verzeichnisse löschen, die relativ klein sind. Außerdem werden je nach Dateisystem Änderungen an Verzeichnissen und Änderungen an der Anzahl der Links zu einer Datei sofort protokolliert und/oder mit der Festplatte synchronisiert, da sie für die Fehlerbehebung kritisch und daher langsamer sind.

Das ist tatsächlich ein Beweis für die Effizienz Ihrer Verlinkung!

Antwort3

Meiner Erfahrung nach besteht die beste Möglichkeit zum Beschleunigen von auf rsync+Hardlink basierenden Backups darin, die Anzahl der vorhandenen Dateien zu verringern.

Eine große Anzahl kleiner Dateien verlangsamt rsynceine Menge.

Wenn Sie Ihre Daten so organisieren können, dass Ihre Verzeichnisse, die hauptsächlich kleine Dateien und nur Lesezugriff haben, automatisch gelöscht werden tar, sollte sich Ihr Sicherungsskript erheblich beschleunigen. (Mit Tools wie archivemountkönnen Sie dann auf diese Archive zugreifen, ohne sie zu extrahieren.)

Die Parallelisierung des Sicherungsskripts hilft wahrscheinlich nicht oder könnte es sogar verlangsamen (ein vorhersehbarer Festplattenzugriff ist optimaler).

Antwort4

Auch diese Antwort beruht auf Erfahrungen und nicht auf harten Fakten.

Ich finde, dass es beim Löschen vieler Dateien in ähnlichen Bäumen mit vielen Querverweisen schneller erscheint, isolierte Teilbäume parallel zu löschen. Ich versuche, dies anhand eines Diagramms zu erklären:

topdir1
    |-a1
    |-b1
    |-c1

topdir2
    |-a2
    |-b2
    |-c2

topdir3
    |-a3
    |-b3
    |-c3

Ich habe den Eindruck, dass es schneller ist , parallel , , zu löschen und dann mit , , , usw. fortzufahren, als , , parallel zu löschen topdir1. (Meine Theorie hierzu ist, dass das mehrfache parallele Aufheben der Verknüpfung „derselben“ Dateien zu Konflikten beim Inode-Link-Referenzzähler führt, aber ich betone, dass ich dies nicht mit konkreten Daten überprüft habe.)topdir2topdir3a1b1c1a2b2c2

for topdir in *
do
    echo "Removing $topdir..."
    for sub in "$topdir"/*; do rm -rf "$sub" & done
    wait
    rm -rf "$topdir"
done

verwandte Informationen