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 du
Ergebnisse 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 du
oder 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?
quelle
du
schlecht 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?find
. Aber dann ist da noch waslocate
.StatFs
eine superschnelle Schätzung der Verzeichnisgröße an. Es war fast 1000x schneller für große, komplexe Verzeichnisse im Vergleich zudu
.Antworten:
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.
quelle
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.
quelle
Die allgemeine Verwendung von
du
kann durch die Verwendung von immens beschleunigt werdenncdu
.ncdu - NCurses Disk Usage
führt das aus
du
, speichert die Ergebnisse zwischen und zeigt sie in einer netten Kommandozeilen-GUI, vergleichbar mitdu -hc -d 1 | sort -h
. Die anfängliche Indizierung dauert genauso langedu
, 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.gz
ein Cronjob vorab gespeichert und später darauf zugegriffen wirdzcat export.gz | ncdu -f-
, wobei jedoch offensichtlich mehr veraltete Informationen bereitgestellt werden .quelle
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.)
quelle
Wie von SHW erwähnt, wurde
agedu
ja ein Index erstellt. Ich dachte, ich würde einen anderen Weg finden, um einen Index zu erstellen, nachdem ich darüber gelesen habelocatedb
. Sie können eine eigene Version von alocatedb
aus einerdu
Ausgabe erstellen :awk
Ordnet die du-Ausgabe so an, dass die Dateinamen zuerst angezeigt werden, damit diesfrcode
richtig funktioniert. Verwenden Sie dannlocate
mit dieser Datenbank, um die Festplattennutzung schnell zu melden:Sie können dies erweitern, um es Ihren Bedürfnissen anzupassen. Ich denke, es ist eine gute Verwendung von LocateB.
quelle
(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:
Von der Website:
quelle
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'.
quelle
updatedb
sagt nichts über die Datenträgernutzung. Wenn Sie dies nur zum Durchlaufen der Festplatte tun, wird die Gesamtleistung beeinträchtigt.du
ist 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.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
du
Befehls ist, können Sie sie einfach weiterleitentail
.Eine 2-GB-Verzeichnisstruktur übernimmt eine Sekunde für die vollständige Auflistung, aber weniger als ein Fünftel davon mit diesem Formular.
quelle
du -hs
ist für diesen Zweck bequemer.--max-depth 1