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.