
Gastbeitrag von Dejan Milosavljevic, Live From Life
Im Nachfolgenden geht es um das Finetuning des Linux Dateisystems. Genauer gesagt: Um die Überwachung von Veränderungen im Dateisystem.
Reichlich Überwachung
Viele Programme unter Linux sind darauf angewiesen Dateien und Ordner ständig auf Änderungen zu überwachen. Z.B. überwacht ein KDE-Desktop-System dessen Konfigurationsdateien auf Veränderungen, falls dort manuelle Eingriffe stattfinden sollten. Auch ein Musikplayer kann – insofern gewünscht und aktiviert – die Musiksammlung ständig auf Veränderungen überwachen. Diverse Suchfunktionen im System (z.B. Baloo) bedienen sich ebenfalls der kontinuierlichen Überwachung von Dateiänderungen. So, wie viele andere Programme auch, die auf einem Linux-System im Hintergrund ihren Dienst verrichten.
Inotify
Für diese Überwachungsfunktion muss nicht jedes Programm eine eigene Routine mitbringen, da haben die Linux-Kernelprogrammierer vorgesorgt und eine Funktion im Kernel implementiert, die sich systemweit von allen Programmen nutzen lässt: Die Inotify-Funktion (aus “I-Node” und “notify”).
Die Anzahl der gleichzeitig zu überwachenden Objekte im Dateisystem ist über einen Kernelparameter festgelegt. Und dieser vorgegebene Wert erweist sich leider auf manchen Systemen als zu klein und beschränkt einige Programme in deren Funktionalität. Standardmäßig ist dieser Wert über folgende Pseudodatei abrufbar:
/proc/sys/fs/inotify/max_user_watches
Mit folgendem Befehl lässt sich der eingestellte Wert auf der Kommandozeile abrufen:
cat /proc/sys/fs/inotify/max_user_watches
Auf meinem System (Manjaro Linux) war der voreingestellte Wert 16384 – anscheinend viel zu niedrig. Und wie groß sollte der Wert sein? Das hängt davon ab.
Watch limit erreicht
Ein Beispiel:
Ich wurde darauf aufmerksam, dass auf meinem System etwas nicht stimmt, als ich feststellte, dass ich über die Dateisuche keine neueren Dateien mehr fand. Normalerweise verwende ich das im KDE-Desktopsystem integrierte Baloo zur Dateiindizierung und zur Suche. Eine Abfrage des Status der Dateiindizierung mit dem Befehl balooctl status
ergab auf der Kommandozeile folgende Werte:
Die Baloo-Dateiindizierung läuft nicht
Gesamtzahl der indizierten Dateien: 323.533
Dateien, die noch indiziert werden: 2
Dateien, deren Indizierung fehlgeschlagen ist: 100
Der aktuelle Index hat eine Größe von 2,80 GiB
Als ich dann versuchte die Dateiindizierung auf der Kommandozeile manuell zu starten (balooctl enable
), bekam ich folgende Fehlermeldung um die Ohren gehauen:
KDE Baloo File Indexer has reached the inotify folder watch limit. File changes will be ignored
Einstellung in sysctl
Aha! Der Dateiindizierung genügte der voreingestellte Wert der max. zu überwachenden Filesystem-Objekte nicht und hat deswegen den Dienst eingestellt. Es galt also den Wert zu erhöhen.
Die Erhöhung der max. Anzahl zu überwachenden Objekte im Dateisystem kann auf der Kommandozeile über einen Befehl erfolgen:
sudo sysctl -w fs.inotify.max_user_watches=524288
Bei diesem Beispiel hätten wir den Wert auf ca. eine halbe Million zu überwachender Dateien festgelegt. Hier kann auch ein höherer Wert gewählt werden. Aber eine halbe Million Dateien als Obergrenze haben sich als ein praktikabler Wert für den alltäglichen Gebrauch bewährt.
Für die Ewigkeit
Doch Vorsicht: Mit diesem Befehl haben wir die Konfiguration nur temporär geändert. Nach Abmeldung vom System bzw. nach einem Systemstart sind die ursprünglichen Einstellungen wieder hergestellt. Das kann ganz praktisch sein, um sich an einen vernünftigen Wert heranzutasten und so z.B. auszuprobieren, ob die Änderungen einen sinnvollen Effekt gebracht haben.
Um den Kernel-Parameter dauerhaft zu setzen, müssen wir diesen in eine Konfigurationsdatei eintragen: In der Datei /etc/sysctl.conf
(Anm.: Wenn es diese Datei noch nicht gibt, muss sie neu angelegt werden)
Hierfür öffnen wir die Datei mit einem Editor und fügen folgende Zeile ein:
fs.inotify.max_user_watches=524288
Nach dem Speichern möchten die Änderungen noch aktiviert werden. Hierfür rufen wir folgenden Befehl auf:
sudo sysctl -p
Somit sollte die maximale Anzahl der überwachten Objekte im Dateisystem auf ca. eine halbe Million erhöht worden sein. Die Misstrauischen unter uns starten das System neu und überprüfen, ob die Änderungen einen Reboot überstanden haben.
Überwachung kostet RAM
Einige Worte zum Ressourcenverbrauch, die mit den Inotify-Kernelparameter einhergehen. So ganz spurlos geht die Überwachung des Dateisystems nicht am Hauptspeicher vorbei.
Als Richtwert gilt: Jedes im Dateisystem überwachte Objekt (Dateien, Ordner) beansprucht auf einem 32-Bit-System den Hauptspeicher mit 540 Bytes und auf einem 64-Bit-System mit dem doppelten Wert, also mit ca. 1 KByte.
Mit dem hier verwendeten Beispiel von ca. einer halben Million überwachten Dateien kämen wir also als Oberwert auf eine maximale Belastung des Hauptspeichers von ca. 256 MB RAM (32 Bit) bzw. auf ca. 512 MB RAM (64 Bit). Da der Kernelspeicher nicht in die Swap-Datei ausgelagert wird, geht der Speicherbedarf übrigens immer auf Kosten des physikalischen Speichers. Auf halbwegs modernen Systemen sollte dies aber ein immer noch verträglicher Wert sein.
Seit Linux 2.6.13
Die Inotify-Funktion wurde von John McCutchan und Robert Love entwickelt und im Jahr 2005 von Linus Torvalds für die Aufnahme in den Linux Kernel 2.6.13 freigegeben. Wer sich in die Thematik vertiefen möchte, dem empfehle ich einen Artikel von Robert Love, in dem er auf die Interna detailliert eingeht.
Schreibe einen Kommentar