Wie kann man "du" -Zusammenfassungen zwischenspeichern oder auf andere Weise beschleunigen?

33

Wir haben ein großes Dateisystem, bei dem eine vollständige Zusammenfassung du(Datenträgerverwendung) über zwei Minuten dauert. Ich möchte einen Weg finden, um eine Zusammenfassung der Festplattennutzung für beliebige Verzeichnisse in diesem Dateisystem zu beschleunigen.

Bei kleinen Zweigen ist mir aufgefallen, dass die duErgebnisse irgendwie zwischengespeichert zu sein scheinen, da wiederholte Anfragen viel schneller sind, aber bei großen Zweigen wird die Geschwindigkeit vernachlässigbar.

Gibt es eine einfache Methode zum Beschleunigen duoder aggressiveren Zwischenspeichern von Ergebnissen für Zweige, die seit der vorherigen Suche nicht geändert wurden?

Oder gibt es einen alternativen Befehl, mit dem sich die Datenträgernutzung schneller zusammenfassen lässt?

Ian Mackinnon
quelle
8
Zwei Minuten scheinen mir nicht so lang zu sein. Aber die eigentliche Frage ist: "Möchtest du wirklich etwas im Cache haben?" Sollten Sie nicht genaue, möglichst aktuelle und tatsächliche Festplattenblockzählungen angeben?
Bruce Ediger
Ich bin damit einverstanden, dass das Ersetzen duschlecht wäre, aber ein schnelleres Wrapper-Skript mit einer identischen Oberfläche wäre für uns sehr nützlich. Außerdem würde ich erwarten, dass das Cachen von Ergebnissen in Abhängigkeit von der Zeit der letzten Änderung (und unter der Annahme, dass keine festplattenweiten Vorgänge, z. B. Defragmentierung, ausgeführt werden) zu genauen Größenergebnissen führt: Fehlt mir etwas?
Ian Mackinnon
2
Wenn Sie sich Sorgen über eine zu hohe Datenträgernutzung machen, können Sie ein Kontingent einrichten.
Pyasi
2
Bruce - Sie könnten die gleiche Frage stellen find. Aber dann ist da noch was locate.
Yuval
Wenn Sie mit Android arbeiten , sehen Sie sich StatFseine superschnelle Schätzung der Verzeichnisgröße an. Es war fast 1000x schneller für große, komplexe Verzeichnisse im Vergleich zu du.
Joshua Pinter

Antworten:

21

Was Sie sehen, wenn Sie einen du-Befehl erneut ausführen, ist der Effekt der Festplattenpufferung. Sobald Sie einen Block gelesen haben, wird sein Plattenpuffer im Puffercache aufbewahrt, bis dieser Block benötigt wird. Für Sie müssen Sie das Verzeichnis und den Inode für jede Datei im Verzeichnis lesen. Die du-Ergebnisse werden in diesem Fall nicht zwischengespeichert, sondern können mit weitaus weniger Festplatten-E / A-Vorgängen abgeleitet werden.

Während es möglich wäre, das System zum Zwischenspeichern dieser Informationen zu zwingen, würde die Gesamtleistung darunter leiden, da der erforderliche Pufferplatz für Dateien, auf die aktiv zugegriffen wird, nicht verfügbar wäre.

Das Verzeichnis selbst hat keine Ahnung, wie groß eine Datei ist, daher muss auf den Inode jeder Datei zugegriffen werden. Um den zwischengespeicherten Wert jedes Mal auf dem neuesten Stand zu halten, wenn sich die Größe einer Datei ändert, muss der zwischengespeicherte Wert aktualisiert werden. Da eine Datei in 0 oder mehr Verzeichnissen aufgeführt sein kann, muss der Inode jeder Datei wissen, in welchen Verzeichnissen sie aufgeführt ist. Dies würde die Inode-Struktur erheblich verkomplizieren und die E / A-Leistung verringern. Da Sie auch Ergebnisse mit unterschiedlichen Blockgrößen erhalten können, müssten die im Cache erforderlichen Daten den zwischengespeicherten Wert für jede mögliche Blockgröße erhöhen oder verringern, um die Leistung weiter zu verringern.

BillThor
quelle
7

Wenn Sie dafür sorgen können, dass die verschiedenen Hierarchien von Dateien zu verschiedenen Gruppen gehören, können Sie Datenträgerkontingente einrichten . Geben Sie keine Obergrenze an (oder passen Sie die Größe der Festplatte an), es sei denn, Sie möchten eine. Sie können immer noch sofort feststellen, wie viel von der (praktisch unendlichen) Quote der Gruppe verwendet wird.

Dies setzt voraus, dass Ihr Dateisystem Kontingente pro Gruppe unterstützt. Linux's Ext [234] und Solaris / * BSD / Linux's zfs tun dies. Es wäre schön für Ihren Anwendungsfall, wenn Gruppenkontingente ACLs berücksichtigen würden, aber ich glaube nicht, dass dies der Fall ist.

Gilles 'SO - hör auf böse zu sein'
quelle
7

Die allgemeine Verwendung von dukann durch die Verwendung von immens beschleunigt werden ncdu.

ncdu - NCurses Disk Usage

führt das aus du, speichert die Ergebnisse zwischen und zeigt sie in einer netten Kommandozeilen-GUI, vergleichbar mit du -hc -d 1 | sort -h. Die anfängliche Indizierung dauert genauso lange du, aber die Suche nach dem eigentlichen "Schuldigen", der wertvollen Speicherplatz ausfüllt, wird beschleunigt, da in allen Unterverzeichnissen die anfangs zwischengespeicherten du-Informationen verfügbar sind.

Bei Bedarf können Unterverzeichnisse durch Drücken von [r] aktualisiert und Dateien / Ordner durch Drücken von [d] gelöscht werden. Beide aktualisieren die Statistiken für alle übergeordneten Verzeichnisse. Das Löschen erfordert eine Bestätigung.

Falls erforderlich, kann eine weitere Beschleunigung erzielt werden, indem ncdu -1xo- / | gzip >export.gzein Cronjob vorab gespeichert und später darauf zugegriffen wird zcat export.gz | ncdu -f-, wobei jedoch offensichtlich mehr veraltete Informationen bereitgestellt werden .

DennisH
quelle
7

Ich bevorzuge die agedu

Agedu ist eine Software, die versucht, alte und unregelmäßig verwendete Dateien unter der Annahme zu finden, dass diese Dateien höchstwahrscheinlich nicht erwünscht sind. (zB Downloads, die nur einmal angesehen wurden.)

Grundsätzlich wird die gleiche Art von Festplatten-Scan ausgeführt wie bei du, es werden jedoch auch die letzten Zugriffszeiten für alle gescannten Objekte aufgezeichnet. Anschließend wird ein Index erstellt, mit dem Berichte mit einer Zusammenfassung der Ergebnisse für jedes Unterverzeichnis effizient erstellt werden können. Diese Berichte werden dann bei Bedarf erstellt.

SHW
quelle
4
Beantwortet die Frage nicht, aber immer noch +1. Netter Tipp.
0xC0000022L
Ich habe die Frage bearbeitet, um zu verdeutlichen, dass dies tatsächlich die Frage beantwortet (agedu indiziert die Festplattennutzung sowie die Zugriffszeit).
Anthony G - Gerechtigkeit für Monica
5

Wie von SHW erwähnt, wurde ageduja ein Index erstellt. Ich dachte, ich würde einen anderen Weg finden, um einen Index zu erstellen, nachdem ich darüber gelesen habe locatedb. Sie können eine eigene Version von a locatedbaus einer duAusgabe erstellen :

du | awk '{print $2,$1}' | /usr/lib/locate/frcode > du.locatedb

awkOrdnet die du-Ausgabe so an, dass die Dateinamen zuerst angezeigt werden, damit dies frcoderichtig funktioniert. Verwenden Sie dann locatemit dieser Datenbank, um die Festplattennutzung schnell zu melden:

locate --database=du.locatedb pingus

Sie können dies erweitern, um es Ihren Bedürfnissen anzupassen. Ich denke, es ist eine gute Verwendung von LocateB.

Yuval
quelle
3
duc

(siehe https://duc.zevv.nl ) könnte das sein, wonach Sie suchen.

Duc speichert die Festplattennutzung in einer optimierten Datenbank, was zu einer schnellen Benutzeroberfläche führt. Keine Wartezeiten, sobald der Index vollständig ist.

Das Aktualisieren des Index ist für mich sehr schnell (weniger als 10 Sekunden für ca. 950.000 Dateien in 121.000 Verzeichnissen, 2,8 TB). Hat eine GUI und eine Ncurses-Benutzeroberfläche.

Verwendung zB:

duc index /usr
duc ui /usr

Von der Website:

Duc ist für die Skalierung auf große Dateisysteme ausgelegt: Es indiziert und zeigt problemlos Hunderte Millionen Dateien auf Petabyte Speicherplatz an.

Peter
quelle
2

Ich habe einen Cronjob eingerichtet, der alle 10 Minuten aktualisiert wird. Hält alle Dateisystempuffer schön frisch. Könnte auch das billige RAM für etwas Gutes verwenden. Verwenden Sie slabtop, siehe 'Vorher' und 'Nachher'.

Marcin
quelle
Ich verstehe nicht, wie sich Ihre Antwort auf die Frage bezieht. updatedbsagt nichts über die Datenträgernutzung. Wenn Sie dies nur zum Durchlaufen der Festplatte tun, wird die Gesamtleistung beeinträchtigt.
Gilles 'SO- hör auf böse zu sein'
3
Das Hochzählen der Dateigrößen duist langsam, da Sie auf die Metadaten einer möglicherweise großen Anzahl von Dateien zugreifen müssen, die auf der Festplatte verteilt sind. Wenn Sie "updatedb" aggressiv ausführen, müssen die Metadaten für alle Dateien im RAM gespeichert werden. Wenn Sie das nächste Mal eine andere metadatenintensive Operation ausführen, anstatt Tausende von Suchvorgängen auf den Datenträgern auszuführen, verwenden Sie den Cache. Normalerweise besteht eine geringe Wahrscheinlichkeit, dass dieser bestimmte Teil der Metadaten des Baums zwischengespeichert wird. Mit meinem 'Metadaten-Cache-Priming' ist es sehr wahrscheinlich, dass die gewünschten Daten frisch zwischengespeichert werden. Keine physischen Suchvorgänge == SCHNELL.
Marcin
2

Wenn Sie nur die Größe des Verzeichnisses kennen müssen, können Sie es erheblich beschleunigen, indem Sie einfach vermeiden, die Informationen auf den Bildschirm zu schreiben. Da die Gesamtsumme die letzte Zeile des duBefehls ist, können Sie sie einfach weiterleiten tail.

du -hc | tail -n 1

Eine 2-GB-Verzeichnisstruktur übernimmt eine Sekunde für die vollständige Auflistung, aber weniger als ein Fünftel davon mit diesem Formular.

Frank
quelle
2
Ich denke, das du -hsist für diesen Zweck bequemer.
Lepre
also--max-depth 1
stevesliva