Bestimmen der Speicherplatznutzung und der Anzahl der Dateien für extrem große Datenmengen (irgendwelche Tricks?)

7

Langzeitleser, erstmaliger Fragesteller:

Ich bin ein Linux-Administrator auf Junior-Ebene, der zunehmend sehr große Datenmengen / Speicher im lokalen und NFS-Speicher unterstützt. Die Daten liegen im Allgemeinen in Form von massiven Ordner- und Dateibäumen mit beliebigen Namen vor. Um ein Beispiel für die Herausforderung zu geben, arbeite ich mit Partitionen mit mehr als 20 TB, die Hunderttausende verschachtelter Verzeichnisse und Zehntausende Millionen Dateien enthalten.

Da es sich bei diesen Partitionen / Exporten um gemeinsam genutzte Ressourcen handelt, muss ich im Allgemeinen Detektiv spielen, wenn ihnen der Speicherplatz oder die Inodes ausgehen, um festzustellen, welche Ordner die größten Straftäter sind.

Ich stelle fest, dass 'du -s' viel zu langsam und manuell ist, um die Arbeit zu erledigen, und hoffte zu sehen, welche Tricks andere Leute verwenden, um die größten oder zahlreichsten Dateizahlverzeichnisse unter sehr großen Partitionen zu bestimmen.

Das einzige Betriebssystem, mit dem ich diese Suchvorgänge durchführen möchte, ist RHEL 5/6. Daher ist jede Mischung aus Standard-CLI-Linux-Tools in Ordnung.

Vielen Dank!

user132791
quelle

Antworten:

2

Ich würde vorschlagen, die Daten in mehrere Partitionen aufzuteilen, wenn dies überhaupt möglich ist. Unabhängig davon, welche Tools Sie verwenden, wird das Durchsuchen so vieler Dateien einige Zeit in Anspruch nehmen. Wenn es sich um separate Partitionen handelt, können Sie das Problem zunächst auf eine einzelne Partition eingrenzen. Aber das ist möglicherweise keine Option für das, was Sie tun.

du ist wahrscheinlich das beste Werkzeug für das, was du suchst. So benutze ich es:

Wenn Ihre Verzeichnisstruktur so aussieht:

/mount/1/abc/123/456/789, 
/mount/1/def/stuff/morestuff/evenmorestuff
/mount/2/qwer/wer/erty

Ich würde Rennen:

du -s /mount/*/* | sort -n

Dadurch erhalten Sie die Gesamtnutzung jedes Verzeichnisses der zweiten Ebene, sortiert nach Größe. Wenn die Ausführung lange dauert, leiten Sie sie an eine Datei weiter und führen Sie sie über Nacht aus.

Ihre Ausgabe sieht folgendermaßen aus:

10000 /mount/1/abc
20000 /mount/1/def
23452 /mount/2/qwer

Dann hoffen Sie nur, dass es genug kaputt geht, um zu sehen, wo die Problemstellen liegen.

Wenn dies ein reguläres Problem ist, können Sie diesen Befehl jede Nacht ausführen lassen, wenn Ihr System nicht so ausgelastet ist, und die Ausgabe in einer Datei speichern. Dann müssen Sie sofort einige aktuelle Daten anzeigen, wenn Sie das Problem bemerken.

Eine andere Option, die Sie möglicherweise prüfen möchten, sind Kontingente. Wenn es sich um gemeinsam genutzten Speicher handelt und alle unterschiedliche Benutzerkonten verwenden, kann das Festlegen sehr hoher Kontingente verhindern, dass außer Kontrolle geratene Prozesse Speicherplatz beanspruchen.

Gewähren
quelle
Ob Sie es glauben oder nicht, die 15-20-TB-Partitionen sind kleinere Teile des gesamten Datensatzes und bereits so weit wie möglich aufgeteilt. Ich zeige du derzeit auf einzelne Verzeichnisse, die ein oder zwei Level unter dem oberen Rand liegen, und die Verarbeitung dauert immer noch Stunden und Stunden. Ich hoffe nur, dass etwas schneller als du verfügbar ist.
user132791
Ah. Das ist dann schon der Datensatz! Ich glaube nicht, dass Sie etwas schneller als du finden werden. Es kann Dateisysteme geben, die schneller als andere für die Berechnung des Speicherplatzes arbeiten - aber das ist möglicherweise ein ziemlich großes Unterfangen, um Änderungen vorzunehmen.
Grant
5

Ich gebe diese Empfehlung oft ab, um das Übliche df -iund die du -skhLösungen zu erweitern ...

Schauen Sie sich das Dienstprogramm ncdu an . Es ist ein auf ncurses basierendes grafisches Tool zur Festplattenauslastung. Sie erhalten eine ähnliche Ausgabe wie unten mit der Anzahl der Dateien und einer Zusammenfassung der Verzeichnisgrößen. Es ist für CentOS / RHEL verfügbar.

Siehe auch: /server/412651/console-utility-to-know-how-disk-space-is-distributed/412655#412655

ncdu 1.7 ~ Use the arrow keys to navigate, press ? for help                                                         
--- /data ----------------------------------------------------------------------------------------------------------
  163.3GiB [##########] /docimages                                                                                  
   84.4GiB [#####     ] /data
   82.0GiB [#####     ] /sldata
   56.2GiB [###       ] /prt
   40.1GiB [##        ] /slisam
   30.8GiB [#         ] /isam
   18.3GiB [#         ] /mail
   10.2GiB [          ] /export
    3.9GiB [          ] /edi   
    1.7GiB [          ] /io     
ewwhite
quelle
Danke, ich schaue mir das an. Wenn es ein Wrapper für du ist, wird es wahrscheinlich nicht schneller sein.
user132791
Es ist kein Wrapper für du . Und ja, es ist schneller ...
ewwhite
2

Ich benutze diesen Befehl, um zu überprüfen, was die größten Dateien in einem Verzeichnis / auf dem System sind. Ich bin mir jedoch nicht sicher, ob dies in einer von Ihnen verwendeten Umgebung skalierbar ist:

find / -type f -size +100000k -exec ls -lh {} \; 2>/dev/null| awk '{ print $8 " : " $5}'

Wenn Sie möchten, können Sie die awk-Anweisung weglassen (ich verwende sie nur, um die Ausgabe zu bereinigen). Der Befehl find durchsucht Verzeichnisse nach Dateien, die größer als der angegebene Betrag k sind. Dann wird ls -lh für diese Datei ausgeführt, was ungefähr Folgendes ergibt:

-rw-r--r-- 1 username group 310K Feb 25  2011 filename

Die AWK-Anweisung bereinigt die Ausgabe in Form von:

filename : 310K

Das Nützlichste an diesem Befehl ist die Tatsache, dass Sie die Mindestgröße der Dateien angeben können. Wie bereits erwähnt, habe ich keine Ahnung, wie CPU / zeitintensiv dies für Ihre Umgebung ist.

Goez
quelle
Danke für die Antwort, ich weiß es zu schätzen. Ich mag den Vorteil, den find gegenüber du Zusammenfassungen in diesem Fund hat, der Ergebnisse zeigt, wenn er sie findet. (Ich weiß, dass ich das mit du w / o -s machen könnte, aber das druckt zu viel)
user132791