Wie kann verhindert werden, dass das Entfernen von Teilbäumen (`rm -rf`) andere Prozesse für Festplatten-E / A aushungert?

8

Wir haben ein sehr großes (Multi-GB) Nginx-Cache-Verzeichnis für eine ausgelastete Site, das wir gelegentlich auf einmal löschen müssen. Ich habe dies in der Vergangenheit gelöst, indem ich den Cache-Ordner in einen neuen Pfad verschoben, einen neuen Cache-Ordner am alten Pfad erstellt und dann rm -rfden alten Cache-Ordner erstellt habe.

In letzter Zeit, wenn ich den Cache an einem geschäftigen Morgen leeren muss, rm -rfhungert die E / A von meinen Serverprozessen nach dem Festplattenzugriff, da sowohl Nginx als auch der Server, für den es verfügbar ist, leseintensiv sind. Ich kann den Anstieg des Lastdurchschnitts beobachten, während die CPUs im Leerlauf sitzen und rm -rf98-99% der Festplatten-E / A aufnehmen iotop.

Ich habe es ionice -c 3beim Aufrufen versucht rm, aber es scheint keine nennenswerte Auswirkung auf das beobachtete Verhalten zu haben.

Gibt es eine Möglichkeit zu zähmen rm -rf, um die Festplatte mehr zu teilen? Muss ich eine andere Technik verwenden, die sich an ihnen orientiert ionice?

Aktualisieren:

Das betreffende Dateisystem ist ein AWS EC2-Instanzspeicher (die primäre Festplatte ist EBS). Der /etc/fstabEintrag sieht folgendermaßen aus:

/dev/xvdb       /mnt    auto    defaults,nobootwait,comment=cloudconfig 0       2
David Eyk
quelle
Sie sollten wahrscheinlich auch das Dateisystem erwähnen, das Sie verwenden und wie (Mount-Optionen).
Cristian Ciupitu
Aktualisiert. Falls es darauf ankommt, ist dies auch unter Ubuntu 12.04.
David Eyk
Beachten Sie, dass die E / A-Leistung unter Amazon EBS ziemlich schlecht sein kann. Siehe perfcap.blogspot.com/2011/03/…, das ein langfristiges Maximum von 100 iops mit kurzfristigen (1 Minute) Bursts von bis zu 1000 empfiehlt. Es klingt so, als ob Ihr Fall viel höher ist als der in einer Minute. daher das Problem.
Moshe Katz
Richtig, deshalb verwenden wir für den Cache einen Instanzspeicher, nicht EBS. Siehe meinen Update-Kommentar. Entschuldigung, wenn das nicht klar war.
David Eyk
Entschuldigung, ich bin spät dran, aber Sie könnten cgroups und den blkio-Controller untersuchen: kernel.org/doc/Documentation/cgroups/blkio-controller.txt
AndreasM

Antworten:

3

Alle auf dieser Seite gesammelten Daten. Im Folgenden finden Sie einige Optionen zum Löschen eines großen Dateiverzeichnisses. In der Beschreibung finden Sie Einzelheiten dazu, wie dies hergestellt wurde.

Befehl verstrichene Systemzeit% CPU cs1 * (Vol / Invol)
rsync -a –delete leer / a 10,60 1,31 95% 106/22
finde b / -Typ f-lösche 28,51 14,46 52% 14849/11
finde c / -Typ f | xargs -L 100 rm 41,69 20,60 54% 37048/15074
finde d / -Typ f | xargs -L 100 -P 100 rm 34,32 27,82 89% 929897/21720
rm-rf f 31,29 14,80 47% 15134/11

* cs1 ist ein freiwilliger und unfreiwilliger Kontextwechsel

Back2Basics
quelle
Während dies theoretisch die Frage beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Tom O'Connor
Faszinierend! Ich werde es versuchen.
David Eyk
rsyncläuft gerade. Vielleicht ist es zu früh, um es zu sagen, und es könnte geholfen werden, dass ich es nicht mitten in einem geschäftigen Morgen laufen lasse, aber der Server reagiert immer noch und der Lastdurchschnitt ist überschaubar.
David Eyk
Die genaue Anrufung, die ich benutze:ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ /mnt/nginx-cache-old
David Eyk
Nun, das hat nur 4 Stunden gedauert. ;) Ich werde diese Antwort akzeptieren (sorry @aferber), da mir der unkomplizierte Aufruf gefällt und er anfällig für niceund zu sein scheint ionice, oder zumindest den Server nicht so zerstört hat wie er rm -rf.
David Eyk
9

Durch das Entfernen von Dateien werden nur Metadatenoperationen im Dateisystem ausgeführt, die nicht von ionice beeinflusst werden.

Der einfachste Weg wäre, wenn Sie den Speicherplatz gerade nicht benötigen, dies außerhalb der Spitzenzeiten durchzuführen rm.

Die komplexere Art und Weise, wie MIGHT arbeiten könnte, besteht darin, die Löschvorgänge über die Zeit zu verteilen. Sie können Folgendes versuchen (beachten Sie, dass Ihre Pfade und Dateinamen KEINE Leerzeichen enthalten!):

while find dir -type f | head -n 100 | xargs rm; do sleep 2; done
while find dir -type d -depth | head -n 100 | xargs rmdir; do sleep 2; done

Beachten Sie auch, dass Sie rm -fden ersten Befehl nicht verwenden können, da die Schleife dann nicht gestoppt wird (dies hängt vom Fehler-Exit-Code ab, rmwenn kein Argument vorhanden ist).

Sie können es optimieren, indem Sie die Anzahl der Löschvorgänge pro Zyklus (im Beispiel 100) und die Schlafdauer ändern. Es funktioniert jedoch möglicherweise nicht wirklich, da das Dateisystem die Metadatenaktualisierungen möglicherweise immer noch so zusammenfasst, dass Sie Probleme mit Ihrer E / A-Last bekommen. Sie müssen es nur versuchen.

aferber
quelle
Das Entfernen so vieler Dateien dauert lange, daher gibt es wirklich keine "Off-Peak" -Periode, die dies umfasst. :(
David Eyk
Die whileSchleife scheint den Trick zu tun, wenn head -n 50. 100 erhöhte den Lastdurchschnitt immer noch langsam über den kritischen Wert, was mir sagt, dass zu viele Ressourcenkonflikte vor sich gingen.
David Eyk
Mann, das dauert lange!
David Eyk
Bei der Suche werden weiterhin alle Dateien im Verzeichnis und alle Unterverzeichnisse für jede Iteration der while-Schleife aufgelistet. Sie könnten wahrscheinlich besser mit so etwas wie
Randy Orrison
1
Bei der Suche werden weiterhin alle Dateien im Verzeichnis und alle Unterverzeichnisse für jede Iteration der while-Schleife aufgelistet. Sie könnten es wahrscheinlich besser machen mit etwas wie find dir -type f -print0 | xargs -l50 -0 rmwait wobei rmwait ein Skript ist, das rm "$ @" ausführt; sleep 2. Beachten Sie die Verwendung von -print0 und -0, um Dateinamen mit Leerzeichen zu behandeln. -l50 weist xargs an, jeweils nur 50 auszuführen.
Randy Orrison
-1

Sie können es mit dem Befehl "nice" koppeln. ionice -c 3 nice -19 rm -rf /some/folder

Dies ändert die Priorität des Prozesses auf der Maschine.

Back2Basics
quelle
Leider nicescheint es ungefähr so ​​viel Wirkung zu haben, wie ionicenichts nennenswertes.
David Eyk
@ DavidEyk. Wenn nice und ionice keinen "wahrnehmbaren" Effekt haben, bedeutet dies entweder, dass nichts anderes in nennenswerter Weise um Ressourcen kämpft, oder Sie bemerken den Effekt einfach nicht mit bloßem Auge. Sie sollten es wirklich mit iostat und vmstat vergleichen, um den tatsächlichen Effekt zu sehen.
Michael Martinez
Ich glaube, @aferber hat dies in seiner Antwort angesprochen: "Durch das Entfernen von Dateien werden nur Metadatenoperationen im Dateisystem ausgeführt, die nicht von ionice beeinflusst werden." Ich habe den Konflikt gesehen - meine Serverprozesse hungerten nach Lesezeit, während die CPU ausfiel und zu rm -rf99% eingeschaltet war iotop.
David Eyk