Warum ist rm auf einem externen Speicherlaufwerk (über USB verbunden, Typ fuseblk) mit 50 GB Dateien langsam?

21

Ich habe versucht, rsnapshot zum Erstellen von Backups zu verwenden, finde es aber unbrauchbar. Es ist zwar in der Lage, ein Verzeichnis (50 GB) in wenigen Minuten zu unterscheiden und zu duplizieren (jede Datei fest zu verknüpfen), und ich kann das gesamte Verzeichnis in etwa einer halben Stunde cp, aber es dauert weit über eine Stunde, um es zu löschen. Selbst bei direkter Verwendung rm -rfvkann es bis zu einer halben Sekunde dauern, bis eine einzelne Datei erstellt wurde, während die Befehle cpund linksofort ausgeführt werden.

Warum ist rm so langsam? Gibt es eine schnellere Möglichkeit, Hardlinks rekursiv zu entfernen? Es macht für mich keinen Sinn, dass das Kopieren einer Datei weniger Zeit in Anspruch nimmt als das Entfernen.

Das Dateisystem, an dem ich arbeite, ist ein externes Speicherlaufwerk, das über USB verbunden ist und fuseblk eingibt (was meiner Meinung nach ntfs bedeutet). Auf meinem Computer läuft Ubuntu Linux.

Ausgabe von oben:

Cpu(s):  3.0%us,  1.5%sy,  0.0%ni, 54.8%id, 40.6%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8063700k total,  3602416k used,  4461284k free,   557604k buffers
Benubird
quelle
1
Wenn fuseblkdas Laufwerk gemountet ist, bedeutet dies nicht, dass es sich um ein NTFS-Laufwerk handelt, sondern nur, dass es als FUSE-Blockgerät gemountet ist. Das könnte fast alles sein.
Chris Down
1
@ChrisDown Stimmt, aber ich weiß, dass es entweder NTFS oder ext3 ist, und ich bin mir ziemlich sicher, dass es, wenn es ext3 wäre, per mount ohne Argumente als solches gemountet würde.
Benubird
1
Dies hängt davon ab, wie viele Dateien sich im Verzeichnis befinden (Sie haben nicht angegeben, wie viele). Insbesondere wird NTFS langsamer, wenn sich nur mehr als 3 KB Dateien im Verzeichnis befinden. So ziemlich jedes andere Dateisystem ist viel leistungsfähiger. Sehen Sie sich all die vielen anderen Beiträge zu SO / SE an, die sich auf die Leistung des Dateisystems auswirken.
smci

Antworten:

28

Letztlich egal , was Sie tun, rmhat laufen unlinkauf jeder einzelnen Datei , die Sie entfernen möchten (auch wenn Sie rufen rm -rauf das übergeordnete Verzeichnis). Wenn viele Dateien entfernt werden müssen, kann dies sehr lange dauern.

Bei der Ausführung sind zwei Prozesse besonders zeitaufwendig rm -r:

  1. readdir, gefolgt von,
  2. eine Anzahl von Anrufen an unlink.

Das Auffinden aller Dateien und das anschließende Durchsuchen jeder einzelnen Datei, um sie zu entfernen, kann sehr, sehr lange dauern.

Wenn Sie dies "unbrauchbar" finden, weil es das Verzeichnis für einige Zeit unbrauchbar macht, ziehen Sie in Betracht, das übergeordnete Verzeichnis zu verschieben, bevor Sie es entfernen. Dies gibt den Namen frei, den das Programm wieder verwenden kann, ohne dass dies zu umständlich ist.

Unter der Annahme , dass das Dateisystem wirklich ist NTFS (es aus Ihrer Frage unklar ist), ist NTFS im Allgemeinen ziemlich langsam bei Löschen große Teile von Dateien. Sie könnten erwägen, ein geeigneteres Dateisystem für Ihre Zwecke zu verwenden (die neueren ext-Dateisysteme bieten eine recht gute Löschleistung, wenn Sie keine anderen besonderen Anforderungen haben). FUSE selbst ist im Allgemeinen auch nicht besonders schnell. Sie könnten überlegen, ob Sie dies auf eine Weise tun können, bei der FUSE nicht verwendet wird.

Chris Down
quelle
2
+1 Es hängt wirklich viel vom genauen Dateisystem ab - viele sind für einige Vorgänge sehr leistungsfähig, während andere nur schleppend arbeiten (häufig für das Erstellen und Entfernen von Dateien und den Datenzugriff).
Peterph
15

Warum ist rm so langsam? Ich habe keine Ahnung. Aber ich kenne einen schnelleren Weg:

mkdir blank
rsync -a --delete blank/ test/

Update: Diese Antwort auf Serverfault enthält einige Erklärungen. Es sieht so aus, als ob rsync die Dateien in einer bestimmten Reihenfolge löscht, wodurch der Dateisystembaum ausgeglichen bleibt und niemals neu ausgeglichen werden muss. rm löscht einfach die Dateien und führt beim Entfernen zu einem erheblichen Ausgleich. Es gibt einige Informationen über eine Neugewichtung hier .

rjmunro
quelle
1
Haben Sie dies verglichen und verglichen mit rm -rf? rsyncmuss noch unlink()alle dateien rein test/, und das ist wohl was die zeit braucht.
MattBianco
Ich habe es nicht formal bewertet, aber ich habe es versucht, nachdem ich die Benchmarks eines anderen gelesen hatte, und der Unterschied war erheblich. Ich kann diesen Beitrag nicht mehr finden, aber diese Antwort auf serverfault enthält eine Erklärung und Quelle für ein noch schnelleres Löschprogramm.
rjmunro
Aber die schnellste Methode muss unlink(2)im Verzeichnis sein (und daran denken, es fsckspäter zu tun ) ...
MattBianco
Eine Tatsache ist eine Tatsache. Just timed es, und es ist fast doppelt so schnell. Nachdem ich GNU coreutils rm Code gelesen habe, wundere ich mich nicht einmal ...
Dominik George
1

Naja, ich hatte mal ein ähnliches Problem mit deinem. Ich fand, dass Ihr "wa" hoch ist, Sie könnten verwenden

iostat -x 1

Wenn Sie überprüfen möchten, ob die Auslastung Ihrer Festplatte hoch ist, bedeutet dies, dass die Festplatte ziemlich ausgelastet ist. Überprüfen Sie, ob andere Prozesse kontinuierlich auf die Festplatte schreiben.

Verwenden Sie zur Vereinfachung

vmstat 1

um zu überprüfen, ob b hoch oder r < b ist . Das deutet auf etwas Falsches hin. In Ihrer Situation denke ich, dass die Festplatte der ursprüngliche Grund ist.

Fibonacci
quelle