Wie kann ich den Vorgang für Dateien mit geringer Dichte mit tar, gzip, rsync beschleunigen?

9

Ich habe eine spärliche Datei. ( du -hmeldet 3G und du -h --apparent-sizemeldet 100G.) So weit, so gut.

Wenn ich die Datei mit komprimieren taroder über das Netzwerk senden möchte rsync, benötigt sie bis zu 3G. Es scheint, dass diese Werkzeuge alle Nullen lesen.

Ich dachte, die Löcher sind irgendwie markiert und diese Werkzeuge könnten sie irgendwie einfach überspringen?

Es gibt wahrscheinlich kein Problem mit meiner Datei?

Ist das ein fehlendes Feature in tarund rsyncum nicht sucht Sparse - Dateien? Ich habe den tarParameter verwendet --sparse, aber das hat die Dinge nicht beschleunigt. Ebenso wenig wie rsyncParameter --sparse.

Gibt es eine Möglichkeit, diese Tools für Dateien mit geringer Dichte zu beschleunigen?

adrelanos
quelle

Antworten:

7

bsdtar(mindestens ab libarchive3.1.2) ist in der Lage, spärliche Abschnitte mithilfe von FS_IOC_FIEMAPioctl auf den Dateisystemen zu erkennen, die es unterstützen (obwohl es auch eine Reihe anderer APIs unterstützt), aber zumindest in meinem Test ist dies seltsamerweise der Fall nicht in der Lage, die tarDateien zu verarbeiten, die es selbst generiert (sieht aber wie ein Fehler aus).

Die Verwendung von GNU tarzum Extrahieren funktioniert jedoch, aber dann kann GNU tar einige der von bsdtar unterstützten erweiterten Attribute nicht verarbeiten.

So

bsdtar cf - sparse-files | (cd elsewhere && tar xpf -)

funktioniert, solange die Dateien keine erweiterten Attribute oder Flags haben.

Es funktioniert immer noch nicht für Dateien, die vollständig spärlich sind (nur Nullen), da das FS_IOC_FIEMAPioctl dann 0 Extent zurückgibt und es so aussieht, als würde es bsdtardas nicht richtig behandeln (ein weiterer Fehler?).

star( Schily tar ) ist eine weitere OpenSource-Tar-Implementierung, die spärliche Dateien erkennen kann (verwenden Sie die -sparseOption) und diese Fehler nicht aufweist bsdtar(aber von vielen Systemen nicht gepackt wird).

Stéphane Chazelas
quelle
2

Dieser Artikel enthält einige nützliche Vorschläge für rsyncmindestens:

Probleme

Verwenden rsync --sparse works, verursacht aber eine große Menge unnötiger Festplattenschreibvorgänge. Das Ändern von 10 Bytes bei einer Länge von 50 GB (1 GB verwendet) sollte dazu führen, dass nur ein oder zwei Blöcke geschrieben werden. Dadurch wird 1 GB geschrieben. Dies ist langsam und möglicherweise nicht gut für die Langlebigkeit der Festplatten.

Verwenden rsync --inplacefunktioniert, erstellt aber nicht spärliche Dateien.

Sie können --sparse und --inplace nicht gleichzeitig verwenden :-( Dies wird von rsync nicht zugelassen. Rsync: --sparse kann nicht mit --inplace verwendet werden

Lösung

Wenn Sie --inplace verwenden, um eine bereits vorhandene Sparse-Datei zu aktualisieren, bleibt die Datei spärlich und es werden nur wenige Blöcke geschrieben. Nur wenn rsync --inplace eine Datei erstellt, wird sie nicht spärlich.

Die Lösung besteht also darin, für jede Datei auf dem Quellcomputer eine entsprechende, richtig lange, leere, spärliche Datei auf dem Zielcomputer zu erstellen - sofern die Datei noch nicht auf dem Zielcomputer vorhanden ist.

Dann funktioniert rsync --inplace wie beabsichtigt, lässt spärliche Dateien spärlich und schreibt nur die geänderten Blöcke auf die Festplatte.

Wenn ich das richtig gelesen habe, möchten Sie zuerst eine leere Datei mit geringer Dichte auf dem Ziel erstellen. Sie können dies mit tun

truncate -s 3G filename

Sie können dann rsync --inplacedie Dateien kopieren. Dies sollte nur einmal notwendig sein.


Der gleiche Artikel schlägt die Verwendung von Virtsync vor

Ein kommerzielles Linux-Befehlszeilentool für 49 US-Dollar zum Synchronisieren des Inhalts großer Dateien (z. B. Disk-Images und Datenbanken von virtuellen Maschinen).

Dies ist möglicherweise die beste Lösung, wenn Sie bereit sind, dafür zu zahlen, da es speziell für diese Art von Situation geschrieben zu sein scheint.

terdon
quelle