Wie kann man die Festplattennutzung mit weniger Overhead in Bash sehen?

8
du -csh /

Die Berechnung der oben genannten Daten nimmt sehr viel Zeit in Anspruch. Gibt es eine Möglichkeit, das weniger genaue Ergebnis mit weniger Aufwand zu sehen?

AKTUALISIEREN

Was ich wissen möchte, ist die Gesamtgröße unter einem bestimmten Verzeichnis.

Apache
quelle

Antworten:

9

Was eine optimierte Version betrifft du, ist mir keine bekannt. Die Dinge, die mir in den Sinn kommen, sind:

  1. Speichern Sie diese Dateien auf einer RAM-Disk oder ähnlichem.
  2. Wenn nur eine Anwendung in diesen Ordner und seinen Unterordner schreibt, muss die Anwendung den Überblick behalten.
  3. Wenn alle diese Dateien ungefähr gleich groß und gleichmäßig verteilt sind, können Sie einfach die Anzahl der Unterverzeichnisse zählen und diese mit der Datei pro Verzeichnis und dann mit der Größe pro Datei multiplizieren. Sie können dies schnell tun, indem Sie nur die Anzahl der festen Links für das Verzeichnis verwenden, wenn Sie nur eine tiefe Verzeichnisstruktur haben ( stat -c '%h') - 2.
  4. Machen Sie alle diese Dateien zu einem bestimmten Benutzer und verwenden Sie den Kontingentmechanismus.
  5. Verwenden Sie eine dedizierte Partition und verwenden Sie einfach df. Ein virtuelles Dateisystem (eine Datei in einem Dateisystem, das über Loopback bereitgestellt wird) könnte dies ebenfalls tun.

Von all diesen sind die Kontingent- und dedizierten Partitionsoptionen wahrscheinlich die einfachsten und effizientesten.

Kyle Brandt
quelle
6

Das Problem ist, dass 'du' jedes Objekt im Unterbaum auflisten muss. Dies ist eine metadatenintensive Operation, die für die meisten Linux-Dateisysteme eine Weile dauert. Einige Dateisysteme, NTFS und Novells NSS, haben die Möglichkeit, Verzeichnisgrößen wie diese in den Metadaten zu verfolgen , was diesen Vorgang erheblich beschleunigt. Wenn Ihr Dateisystem Verzeichniskontingente unterstützt, muss es diese Daten zur Durchsetzung intern verfolgen. Jede Größenänderung wird im Verzeichnisbaum auf den Kontingentpunkt (NTFS) oder jedes Verzeichnis (NSS) repliziert ) Wenn es passiert, ist es sehr schnell, eine Verzeichnisbaumgröße zu erhalten.

Leider gibt es keine Möglichkeit, du schneller laufen zu lassen, nur Workarounds.

  • Führen Sie 'du' im Batch-Modus aus und leben Sie mit nicht-Live-Ergebnissen
  • Erstellen Sie ein neues Dateisystem und verwenden Sie stattdessen 'df'
  • Erstellen Sie eine große Datei, die Ihr Verzeichnis enthält, mounten Sie es per Loopback, formatieren Sie es und verwenden Sie stattdessen 'df' für diesen neuen Mount-Punkt. Wenn Sie mehr Speicherplatz benötigen, heben Sie die Bereitstellung des Loopback-Mount auf, erweitern Sie die Datei und stellen Sie sie erneut bereit.
sysadmin1138
quelle
+1 Dies ist eine sehr nützliche Antwort.
Richard Holloway
4
du -h --max-depth=1

Gibt Ihnen die Größen im menschlichen KB / MB / GB-Format aus Ihrem aktuellen Arbeitsverzeichnis.

David Rickman
quelle
Ich denke, sie wollen wissen, warum es so lange dauert, bis du etwas generierst und antwortest. Ich denke, Windows verhält sich genauso. Wenn Sie mit der rechten Maustaste auf ein Verzeichnis klicken, müssen Sie warten, während die Größe jedes Unterverzeichnisses berechnet wird. So funktioniert das Dateisystem.
Der Unix-Hausmeister
Ja, es sei denn, sie betreiben einen Indexdienst oder so.
David Rickman
3

Mit den Standardwerkzeugen müssen Sie die Größe jeder Datei im Verzeichnis jedes Mal ermitteln, wenn Sie die Gesamtgröße ermitteln möchten. Ein möglicherweise effizienterer Weg wäre ein "Verzeichnisgrößenmonitor", der die aktuelle Größe des Verzeichnisses verfolgt. Es gibt keine solche Sache (von der ich weiß), aber Sie könnten eine mit implementieren inotify. Möglicherweise nicht mit bash (und inotify-tools), aber Sie könnten wahrscheinlich zum Beispiel Python und Pyinotify verwenden.

Dan Andreatta
quelle
2

Sie könnten gt5nützlich sein. Er speichert die neuesten duInformationen und macht einen diff gegen das das nächste Mal laufen gelassen. Es zeigt seine Ausgabe mit einem Textmodus-Browser wie z links.

Bis auf weiteres angehalten.
quelle
2

Berücksichtigen Sie auch die Option -x auf du - "one file system", wenn Sie dies tun

du -xh / --max-depth=1 

Sie sehen nur die Zusammenfassung der Festplattennutzung auf Ihrer Root-Partition und es wird nicht versucht, / proc, / sys, / dev usw. zu addieren ...

Jason
quelle
2

Wenn Sie nur die Festplattennutzung für das Root-Dateisystem wünschen, dann

df -h /


quelle
1

Nein. Könnten Sie in einem Cron-Job, der über Nacht ausgeführt werden soll, in regelmäßigen Abständen ein Du-Piping an eine Textdatei durchführen, sodass Sie nicht sofort über aktuelle Daten verfügen?

Beachten Sie, dass das Messen des von einem Ordner verwendeten Speicherplatzes, der unter Windows eine große Anzahl von Dateien enthält, ebenfalls einige Zeit in Anspruch nimmt.

xenny
quelle
0

df -h wird den Trick machen

Antoine Benkemoun
quelle
Was ich wissen möchte, ist die Gesamtgröße unter einem bestimmten Verzeichnis.
Apache
0

df -kh /

Dies zeigt Ihnen die Menge des verwendeten und verfügbaren Speicherplatzes.

Der Unix-Hausmeister
quelle
0

Vielleicht

df -h

Zusätzlicher Text, da eine kurze, präzise Antwort nicht ausreicht, damit Serverfault mich für einen Menschen hält.


quelle
Aber ich muss die Gesamtgröße unter einem bestimmten Verzeichnis kennen
Apache
dann muss use du
The Unix Janitor
Aber in Windows kann ich den insgesamt genutzten Speicherplatz ohne Overhead sehen. Warum nicht unter Linux?
Apache
sind Sie im Ernst? ntfs ist nicht ext3
The Unix Janitor
1
@apache, oh, es gibt Overhead. Versuchen Sie, die Größe eines 20-GB-Ordners mit vielen 10-20-MB-Dateien zu ermitteln. Es gibt def Overhead.
Zypher
0

Um den Speicherplatz unter genau diesem Verzeichnis zu finden, listen Sie ihn stattdessen auf /. Um den Speicherplatz unter den Verzeichnissen foound zu finden bar, listen Sie beide auf:

du -csh foo bar
mpez0
quelle
0

Sie sollten dnotify verwenden, um die Festplattennutzung zu berechnen, wenn das Dateisystem nicht häufig geändert wird.

Mircea Vutcovici
quelle