Ich habe ext3-Dateisystem mit Standardoptionen gemountet. Darauf habe ich einige ~ 100GB Dateien.
Das Entfernen solcher Dateien dauert lange (8 Minuten) und verursacht viel Datenverkehr, wodurch die Serverlast steigt.
Gibt es eine Möglichkeit, das rm nicht so störend zu machen?
Antworten:
Die interessanteste Antwort wurde ursprünglich in einem Kommentar zu der Frage begraben. Hier ist es eine erstklassige Antwort, um es sichtbarer zu machen:
Dieser Link ist eine unglaublich gründliche Analyse der Suche nach und Entdeckung einer praktikablen Lösung.
Beachten Sie auch:
Der Artikel sagt:
Das ist wahr, aber Benutzer TafT sagt, wenn Sie keine Störung wollen, dann wäre
-c3
"untätig" eine bessere Wahl als-c2
"Best-Effort". Er hat-c3
im Hintergrund gebaut und festgestellt, dass es gut funktioniert, ohne dass der Build für immer warten muss. Wenn Sie wirklich zu 100% ausgelastet sind,-c3
wird der Löschvorgang niemals abgeschlossen sein, er erwartet jedoch nicht, dass dies auf der Grundlage des durchgeführten Tests der Fall ist.quelle
Aktualisieren Sie auf ext4 oder ein anderes modernes Dateisystem, das Extents verwendet. Da ext3 das Schema für indirekte Blöcke anstelle von Extents verwendet, ist das Löschen großer Dateien unweigerlich mit viel Arbeit verbunden.
quelle
Sie können ionice versuchen. Es wird es nicht schneller machen, aber es könnte es weniger störend machen.
quelle
In Bezug auf die Effizienz ist die Verwendung eines virtuellen Raums pro Datei nicht optimal, da für jeden virtuellen Raum ein Fork und Exec erforderlich ist.
Angenommen, Sie haben eine list.txt mit den Dateien, die Sie entfernen möchten, wäre effizienter, aber es wird immer noch langsam:
Ein anderer Ansatz wäre:
nice -20 xargs -i rm {} < list.txt
(Dies wird weniger Zeit in Anspruch nehmen, aber Ihr System stark beeinträchtigen :)
oder
Ich weiß nicht, wie schnell das gehen würde, aber:
oder
Erstellen Sie einen speziellen Einhängepunkt mit einem schnellen Dateisystem (mit einem Loop-Gerät?). Verwenden Sie diesen Punkt, um Ihre riesigen Dateien zu speichern und zu löschen.
(Verschieben Sie die Dateien möglicherweise dorthin, bevor Sie sie löschen. Möglicherweise ist es schneller, oder heben Sie die Bereitstellung einfach auf, wenn die Dateien gelöscht werden sollen.)
oder
cat /dev/null > /file/to/be/deleted
(so ist es Null-Größe jetzt) , und wenn Sie wollen , dass es einfach verschwindenrm -rf <file>
jetztoder noch besser
Lass die Katze fallen und tu es einfach
# > /file/to/be/emptied
quelle
Ich hatte Probleme damit, das Verzeichnis mit einer angemessenen Geschwindigkeit zu löschen. Es stellte sich heraus, dass der Prozess die Festplatte sperrte und eine Anhäufung von Prozessen erstellte, die versuchten, auf die Festplatte zuzugreifen. ionice hat nicht funktioniert, es hat nur 99% der Festplatten-E / A weiter genutzt und alle anderen Prozesse gesperrt.
Hier ist der Python-Code, der für mich funktioniert hat. Es werden jeweils 500 Dateien gelöscht. Anschließend wird eine Pause von 2 Sekunden eingelegt, damit die anderen Prozesse ihre Arbeit erledigen können. Anschließend wird der Vorgang fortgesetzt. Funktioniert super.
quelle
Meine zwei Cent.
Ich habe dieses Problem bereits. "In sequentiellen Skripten, die schnell ausgeführt werden müssen, entfernt der Prozess eine Menge Dateien."
Um die Sache zu beschleunigen, habe ich einen weiteren Prozess (Bash-Skript) hinzugefügt, der per Cron gestartet wird. Wie ein Garbage Collector entfernt er alle Dateien in einem bestimmten Verzeichnis.
Dann habe ich das ursprüngliche Skript aktualisiert, indem ich das "rm" durch ein mv in einen "Garbage Folder" ersetzt habe (benennen Sie die Datei um, indem Sie am Ende des Namens einen Zähler hinzufügen, um Kollisionen zu vermeiden).
Das funktioniert bei mir, das Skript läuft mindestens 3 mal schneller. Dies funktioniert jedoch nur dann, wenn sich der Mülleimer und die Originaldatei unter demselben Einhängepunkt (demselben Gerät) befinden, um ein Kopieren der Dateien zu vermeiden. (MV auf demselben Gerät verbrauchen weniger IO als RM)
Hoffe das hilft ..
quelle
Beachten Sie auch, dass die Antwort von Dennis Williamson, der ionice als Workaround für das Laden vorschlägt , nur funktioniert, wenn Ihr Block-Gerät den CFQ-io-Scheduler verwendet.
quelle
Sie können versuchen, ein Schleifendateisystem zu erstellen, in dem Ihre Sicherungen gespeichert werden.
Wenn Sie die Backups löschen möchten, gehen Sie wie folgt vor:
Presto! Das gesamte virtuelle Dateisystem wird in wenigen Augenblicken gelöscht.
quelle
Sie können Multitheading mit Xargs verwenden
Dabei ist 30 die Anzahl der Threads, die Sie erstellen möchten. Wenn Sie Null verwenden, erstellt das System maximale Threads, die dem Benutzer zur Verfügung stehen, der die Aufgabe ausführt.
quelle
find
hat eine-delete
Option, die eine viel bessere Alternative ist./ dev / null ist eine Datei, kein Verzeichnis. Eine Datei kann nicht in eine Datei verschoben werden, da sonst das Risiko besteht, dass sie überschrieben wird.
Ich halte das nicht für praktisch. Es würde unnötig mehr E / A verbrauchen, als das OP möchte.
quelle
Eigentlich handelt es sich um ein Gerät, und alle darauf geschriebenen Daten werden verworfen,
mv <file> /dev/null
was Sinn machtquelle