Das Ausführen einer rm -rf in einem massiven Verzeichnisbaum dauert Stunden

20

Wir verwenden rsnapshot für Backups. Es speichert viele Schnappschüsse der gesicherten Datei, löscht jedoch alte. Das ist gut. Es dauert jedoch ungefähr 7 Stunden, um rm -rfeinen massiven Verzeichnisbaum zu erstellen. Das Dateisystem ist XFS. Ich bin mir nicht sicher, wie viele Dateien es gibt, aber wahrscheinlich sind es Millionen.

Gibt es überhaupt etwas zu beschleunigen? Gibt es einen Befehl, der genauso rm -rffunktioniert und nicht stundenlang dauert?

Rory
quelle
1
Ich habe verwendet find . -delete -name directoryund es ist viel schneller als rm -rf.
Paolo

Antworten:

38

Nein.

rm -rfFührt eine rekursive Tiefendurchquerung Ihres Dateisystems durch und ruft dabei unlink()jede Datei auf. Die zwei Operationen, die den Prozess langsam laufen lassen, sind opendir()/ readdir()und unlink(). opendir()und readdir()sind abhängig von der Anzahl der Dateien im Verzeichnis. unlink()ist abhängig von der Größe der zu löschenden Datei. Die einzige Möglichkeit, dies zu beschleunigen, besteht darin, entweder die Größe und Anzahl der Dateien zu verringern (was meines Erachtens nicht wahrscheinlich ist) oder das Dateisystem durch ein Dateisystem mit besseren Eigenschaften für diese Vorgänge zu ersetzen. Ich glaube, dass XFS gut für unlink () in großen Dateien ist, aber nicht so gut für große Verzeichnisstrukturen. Möglicherweise ist ext3 + dirindex oder reiserfs schneller. Ich bin nicht sicher, wie gut JFS abschneidet, aber ich bin mir sicher, dass es viele Benchmarks für die Leistung verschiedener Dateisysteme gibt.

Bearbeiten: Es scheint, dass XFS beim Löschen von Bäumen furchtbar ist , ändern Sie also definitiv Ihr Dateisystem.

David Pashley
quelle
1
Vor einigen Jahren bemerkte ich eine schreckliche Leistung bei der Verwendung von reiserfs in einem ähnlichen Anwendungsfall.
Knweiss
1
Wunderbarer Beitrag!
wzzrd
2
Es sagte fast nur "nein" :)
David Pashley
2
Ich bin mit allem einverstanden, mit Ausnahme Ihrer Aussage, dass die Aufhebungsgeschwindigkeit von der Größe der Datei abhängt. Verknüpfung aufheben entfernt lediglich die Verknüpfung zur Datei und ändert nichts an den tatsächlichen Inhalten. Es sollte kein Unterschied zwischen Dateien unterschiedlicher Größe erkennbar sein (Sie können dies selbst testen).
Kamil Kisiel
@KamilKisiel Du sagst zu Recht unlinknichts zum eigentlichen Inhalt, aber um einen unlinkSystemaufruf durchzuführen , muss der Dateisystemcode trotzdem mehr Arbeit leisten, wenn der entfernte Link der letzte zu der Datei ist und wenn er aktuell nicht geöffnet ist. Dies hängt natürlich vom Dateisystem ab, aber es kann dann einen sehr erkennbaren Unterschied geben, wenn die entfernte Datei sehr groß ist.
Juli
22

Verschieben Sie alternativ das Verzeichnis zur Seite, erstellen Sie es mit demselben Namen, denselben Berechtigungen und demselben Besitz neu und starten Sie alle Apps / Dienste neu, die sich mit diesem Verzeichnis befassen.

Sie können dann das ursprüngliche Verzeichnis im Hintergrund "nice rm", ohne sich über einen längeren Ausfall Gedanken machen zu müssen.

Greg Arbeit
quelle
Das könnte funktionieren, da ein MV sehr sehr schnell ist.
Rory
Yup - es funktioniert gut. Ich habe diese Technik oft verwendet, um maildir-basierte Postfächer zu "reparieren", bei denen ein E-Mail-Client das Gehirn verloren hat und ein Durcheinander auf der Festplatte hinterlassen hat. Das größte (einzelne) Verzeichnis, das ich auf diese Weise repariert habe, hatte ungefähr 1,5 oder 2 Millionen IIRC-Dateien. Die Gesamtausfallzeit für den Endbenutzer betrug ~ 3 Minuten. Die meisten warteten darauf, dass der E-Mail-Client und die IMAP-Prozesse abstarben.
Greg Work
7

Stellen Sie sicher, dass Sie die richtigen Mount-Optionen für XFS festgelegt haben.

Wenn Sie -ologbufs = 8 verwenden, verdreifacht logbsize = 256k mit XFS wahrscheinlich Ihre Löschleistung.

James
quelle
2
+1 für diesen Tipp ... Man sollte auch Lazy Counters für einen weiteren Leistungsschub aktivieren.
Hurikhan77
1
Einige Erklärungen zu diesen Einstellungen wären für zukünftige Leser hilfreich.
Aron Rotteveel
5

Wenn Sie die rm effektiv auf Dateiebene ausführen, dauert es lange. Deshalb sind blockbasierte Schnappschüsse so gut :).

Sie könnten versuchen, das rm in separate Bereiche aufzuteilen und es parallel auszuführen, aber ich erwarte möglicherweise keine Verbesserung. Es ist bekannt, dass XFS Probleme beim Löschen von Dateien hat. Wenn dies ein großer Teil Ihrer Arbeit ist, ist möglicherweise ein anderes Dateisystem eine gute Idee.

James
quelle
Blockbasierte Snapshots sind in diesem Fall nicht besonders gut. Eine Reihe von Dateisystemen - WAFL und ZFS - bieten ebenfalls eine gute Leistung für das Löschen von Snapshots. Sie behandeln Snapshots als erstklassige Dateisystemobjekte. Anstatt also Millionen von Dateien (langsam) zu durchlaufen, um zu bestimmen, welche Blöcke freigegeben werden sollen, müssen sie nur die mit dem Snapshot verknüpfte Blockliste durchsuchen.
Keith Smith
Hmm. Ich bin wahrscheinlich oben als zu gegenteilig eingestuft worden. Das Original-Poster muss Linux verwenden, und es gibt wirklich kein bewährtes Linux-Dateisystem, das Snapshots erstellt - obwohl btrfs und nilfs für die Zukunft interessant aussehen. Aus praktischen Gründen stimme ich zu, dass es besser ist, blockbasierte Schnappschüsse zu verwenden.
Keith Smith
+1 für den Tipp zum Teilen und Parallelisieren der Arbeitslast: xfs spielt seine Stärke bei parallelen Arbeitslasten aus.
Hurikhan77
5

Es ist gut, ionice für solche IO-intensiven Operationen zu verwenden, unabhängig vom verwendeten Dateisystem.
Ich schlage diesen Befehl vor:

ionice -n7 nice rm -fr dir_name

Für Hintergrundoperationen auf Servern mit hoher E / A-Belastung ist dies eine gute Option.

ash108
quelle
2

Ich weiß, das ist alt, aber ich dachte, ich werfe einen Vorschlag ein. Sie löschen diese Dateien nacheinander, und die Ausführung paralleler rm-Vorgänge kann zu einer Beschleunigung führen.

http://savannah.nongnu.org/projects/parallel/ parallel kann häufig anstelle von xargs verwendet werden

Also, wenn Sie alle Dateien in Deltedir löschen

find -t f deletedir | parallel -j 10 rm

Dann hätten Sie nur leere Verzeichnisstrukturen zum Löschen.

Hinweis: Sie werden wahrscheinlich immer noch die oben genannten Einschränkungen des Dateisystems treffen.

Nick Anderson
quelle
Was ist der Vorteil der Verwendung von Parallel gegenüber XARGs?
Rory
1

Wäre es hier eine alternative Möglichkeit, die Daten so zu trennen, dass Sie das eigentliche Dateisystem verschrotten und neu erstellen können, anstatt das rm auszuführen?

Muhen
quelle
3
Ich denke, rsnapshot verwendet Hardlinks als Teil der Funktion zum effizienten Verwalten mehrerer Snapshots. Wenn der Fragesteller diese Funktion mit separaten Dateisystemen verwendet, funktioniert dies nicht (da keine feste Verknüpfung über eine Dateisystemgrenze möglich ist)
David Spillett
0

Wie wäre es, wenn Sie die Feinheit des Befehls verringern? Mögen:

nice -20 rm -rf /path/to/dir/
RainyRat
quelle
5
Der Engpass ist nicht der Scheduler, sondern das Dateisystem, würde ich sagen.
Manuel Faux
In dem unwahrscheinlichen Fall, dass der Scheduler der Engpass ist, würden Sie das E / A-Subsystem nur noch härter schlagen und den Server im laufenden Betrieb noch weniger benutzbar machen.
David Mackintosh