weidner/archives/2022/02/

Wann ist die Platte voll? (2)

Bereits 2014 hatte ich ein ähnliches Problem mit Logdateien von cfengine, dieses Mal waren es die NetFlow-Logs, welche nfdump schreibt.
Nicht unbedingt ein Grund für einen neuen Text zum alten Thema, aber dieses Mal war ich anders vorgegangen.

Wieder hat ein Prozess gemeldet, dass die Platte voll ist, während df noch jede Menge Platz anzeigte. Erst df -i zeigte an, dass alle Inodes der Partition aufgebraucht sind.

# df
Dateisystem    1K-Blöcke Benutzt Verfügbar Verw% Eingehängt auf
...
/dev/sda1        6451536 1973500   4130596   33% /

# df -i
Dateisystem     Inodes IBenutzt   IFrei IUse% Eingehängt auf
...
/dev/sda1       414528   414528       0  100% /

Damals waren alle Logdateien in einem Verzeichnis, und dieses fand ich mit dem Befehl:

find / -xdev -type d -size +100k

Die Überlegung dahinter ist, dass ein Verzeichnis, welches sehr viele Dateien enthält, selbst sehr groß sein muss. Dieses Mal fand ich damit jedoch nichts, auch nicht als ich auf +50k herunter ging. Erst mit +15k fand ich Hunderte Verzeichnisse.

Dafür fand ich einen anderen Weg, um die gesuchten Verzeichnisse einzugrenzen.

Eine andere Methode

Normalerweise suche ich nach großen Dateien, die Kandidat für das Schaffen von Plattenplatz werden können, mit dem Befehl du -s. Ich beginne im Root-Verzeichnis und arbeite mich eine Verzeichnisebene nach der anderen zu den größten Platzverschwendern vor.

Das klappt für große Dateien sehr gut, aber dieses Mal suchte ich kleine Dateien, dafür aber sehr viele, von denen jede einen Inode belegt.

Es gibt - ich weiß nicht, wie lange schon - die Option --inodes, mit der der Befehl du den Verbrauch von Inodes anstelle von Datenblöcken ausgibt.

Natürlich ist mir klar, dass der selbe Inode in verschieden Verzeichnissen verlinkt sein kann und dann doppelt gezählt wird. Oder dass, falls die Anzahl der Links berücksichtigt wird, der zweite Link nicht in den untersuchten Verzeichnissen auftaucht, und dann zu oft abgezogen wird. Die Methode ist also vermutlich ungenau, aber für einen groben Überblick - und genau das brauchte ich in dem Moment - ist sie ausreichend.

# du -s -x --inodes /* |sort -n
...
18890   /proc
20036   /sys
26972   /usr
113186  /var
212637  /data

root@mon01:~# du -s -x --inodes /data/nfsen/* |sort -n
...
16  /data/nfsen/libexec
47  /data/nfsen/profiles-stat
212569  /data/nfsen/profiles-data

# du -s -x --inodes /data/nfsen/profiles-data/* |sort -n
104926  /data/nfsen/profiles-data/live
107643  /data/nfsen/profiles-data/BMD

So kam ich auf die Verzeichnisse unterhalb von /data/nfsen/profiles-data, eines pro Jahr, darin ein Verzeichnis pro Monat, darin eines pro Tag mit 288 Dateien, einer pro Fünf-Minuten-Intervall.

Unterhalb von /var gab es auch sehr viele Inodes, das wollte ich mir ebenfalls anschauen:

# du -s -x --inodes /var/* |sort -n
...
153 /var/log
2216    /var/lib
110668  /var/cache

root@mon01:~# du -s -x --inodes /var/cache/* |sort -n
...
66  /var/cache/man
110554  /var/cache/nfdump

# du -s -x --inodes /var/cache/nfdump/* |sort -n
-bash: /usr/bin/du: Die Argumentliste ist zu lang

Im Verzeichnis /var/cache/nfdump befinden sich die temporären Dateien von NfSen. Da sich diese Dateien über mehr als zwei Jahre angesammelt hatten und ich selten mehr als ein paar Wochen aus der Vergangenheit benötigte, installierte ich tmpreaper und schrieb das folgende Skript, das Cron einmal pro Woche startet:

#!/bin/sh

PROFILECACHE=/var/cache/nfdump
PROFILEDATA=/data/nfsen/profiles-data
TIMESPEC=366d

TMPREAPER=/usr/sbin/tmpreaper

test -x $TMPREAPER || exit 0

# clean up the cache as root
#
$TMPREAPER -m $TIMESPEC $PROFILECACHE

# clean up the data as www-data
#
su www-data -s /bin/sh -c "$TMPREAPER -m $TIMESPEC $PROFILEDATA"

Das Skript löscht Dateien, die seit mehr als einem Jahr nicht modifiziert wurden. Normalerweise zieht tmpreaper die Zugriffszeiten für die Entscheidung heran, in diesem Fall ist jedoch die Zeit der letzten Änderung von Belang.

# df -i
Dateisystem     Inodes IBenutzt   IFrei IUse% Eingehängt auf
...
/dev/sda1       414528   250504  164024   61% /

Fazit

Mit der Methode von 2014 fand ich die Verzeichnisse erst, als ich auf 15k herunterging. Dann jedoch gleich mehr als 700 Verzeichnisse unterhalb /data/nfsen, so dass mir das eine Verzeichnis unter /var/cache zunächst entging.

Mit du habe ich zwar mehr Schritte, die ich von Hand erledigen muss, kann dafür im Gegenzug selbst entscheiden, ob ich ein Verzeichnis noch untersuche oder ignoriere.

Posted 2022-02-15
Tags: