GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bestimmen Sie den Ort der Inode-Nutzung

Lösung 1:

Erwarten Sie nicht, dass dies schnell abläuft...

cd in ein Verzeichnis, in dem Sie vermuten, dass es ein Unterverzeichnis mit vielen Inodes gibt. Wenn dieses Skript viel Zeit in Anspruch nimmt, haben Sie wahrscheinlich herausgefunden, wo Sie im Dateisystem suchen müssen. /var ist ein guter Anfang...

Andernfalls, wenn Sie in das oberste Verzeichnis in diesem Dateisystem wechseln und dies ausführen und warten, bis es beendet ist, finden Sie das Verzeichnis mit allen Inodes.

find . -type d | 
while 
  read line  
do 
  echo "$( find "$line" -maxdepth 1 | wc -l) $line"  
done | 
sort -rn | less

Über die Sortierkosten mache ich mir keine Gedanken. Ich habe einen Test durchgeführt und das Sortieren der unsortierten Ausgabe von 350.000 Verzeichnissen dauerte 8 Sekunden. Der erste Fund dauerte . Der eigentliche Aufwand besteht darin, all diese Verzeichnisse in der While-Schleife zu öffnen. (die Schleife selbst dauert 22 Sekunden). (Die Testdaten wurden auf einem Unterverzeichnis mit 350.000 Verzeichnissen ausgeführt, von denen eines eine Million Dateien hatte, der Rest zwischen 1 und 15 Verzeichnissen).

Verschiedene Leute haben darauf hingewiesen, dass ls darin nicht besonders gut ist, weil es die Ausgabe sortiert. Echo hatte ich probiert, aber das ist auch nicht so toll. Jemand anderes hatte darauf hingewiesen, dass stat diese Informationen (Anzahl der Verzeichniseinträge) liefert, aber nicht portierbar ist. Es stellt sich heraus, dass find -maxdepth beim Öffnen von Verzeichnissen sehr schnell ist und .files zählt, also ... hier ist es ... Punkte für alle!

Lösung 2:

Wenn das Problem ein Verzeichnis mit zu vielen Dateien ist, gibt es hier eine einfache Lösung:

# Let's find which partition is out of inodes:
$ df -hi
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3               2.4M    2.4M       0  100% /
...

# Okay, now we know the mount point with no free inodes,
# let's find a directory with too many files:
$ find / -xdev -size +100k -type d

Die Idee hinter dem find Linie ist, dass die Größe eines Verzeichnisses proportional zur Menge der Dateien direkt in diesem Verzeichnis ist. Hier suchen wir also nach Verzeichnissen mit Tonnen von Dateien darin.

Wenn Sie keine Zahl erraten möchten und lieber alle verdächtigen Verzeichnisse nach "Größe" sortiert auflisten möchten, ist das auch ganz einfach:

# Remove the "sort" command if you want incremental output
find / -xdev -size +10k -type d -printf '%s %p\n' | sort -n

Lösung 3:

Grrr, das Kommentieren erfordert 50 Wiederholungen. Diese Antwort ist also eigentlich ein Kommentar zu Chris' Antwort.

Da sich der Fragesteller wahrscheinlich nicht um alle Verzeichnisse kümmert, sondern nur um die schlechtesten, ist die Verwendung von sort wahrscheinlich ein sehr teurer Overkill.

find . -type d | 
while 
  read line  
do 
  echo "$(ls "$line" | wc -l) $line"  
done | 
perl -a -ne'next unless $F[0]>=$max; print; $max=$F[0]'  | less

Dies ist nicht so vollständig wie Ihre Version, aber es druckt Zeilen, wenn sie größer als das vorherige Maximum sind, wodurch das ausgedruckte Rauschen stark reduziert und die Kosten für das Sortieren gespart werden.

Der Nachteil davon ist, wenn Sie 2 sehr große Verzeichnisse haben und das erste zufällig 1 Inode mehr hat als das zweite, werden Sie das zweite nie sehen.

Eine vollständigere Lösung wäre, ein intelligenteres Perl-Skript zu schreiben, das die Top 10 der gesehenen Werte verfolgt und diese am Ende ausdruckt. Aber das ist zu lang für eine schnelle Antwort auf einen Serverfehler.

Außerdem können Sie mit einigen halbwegs intelligenteren Perl-Skripten die While-Schleife überspringen - auf den meisten Plattformen sortiert ls die Ergebnisse, und das kann für große Verzeichnisse auch sehr teuer werden. Die ls-Sortierung ist hier nicht erforderlich, da uns nur die Anzahl interessiert.

Lösung 4:

Sie können dieses kleine Snippet verwenden:

find | cut -d/ -f2 | uniq -c | sort -n

Es wird ausgedruckt, wie viele Dateien und Verzeichnisse sich in jedem der Verzeichnisse im aktuellen Ordner befinden, wobei die größten Übeltäter ganz unten stehen. Es hilft Ihnen, Verzeichnisse mit vielen Dateien zu finden. (mehr Infos)

Lösung 5:

Dies ist keine direkte Antwort auf Ihre Frage, aber die Suche nach kürzlich geänderten Dateien mit geringer Größe mithilfe von find kann Ihre Suche einschränken:

find / -mmin -10 -size -20k

Linux
  1. Eine Anleitung zum Linux-Befehl „Suchen“.

  2. Wie liste ich alle Verzeichnisse an einem Ort rekursiv auf, Breite zuerst?

  3. Wie kann man die Inode-Nutzung freigeben?

  4. Wie finde ich den Speicherort der ausführbaren Datei in C?

  5. bash findet Verzeichnisse

Find-Befehl in Linux (Dateien und Verzeichnisse suchen)

So finden Sie die am häufigsten ausgeführten Prozesse nach Speichernutzung

So finden und löschen Sie leere Verzeichnisse in Linux

Finden Sie Dateien und Verzeichnisse unter Linux ganz einfach

Wie verringert man die Inode-Nutzung in CPanel?

Wie finde ich den my.cnf-Speicherort von MySQL?