Überwachung von Änderungen – Der Inotify Kernel-Parameter

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.

Kommentare

22 Antworten zu „Überwachung von Änderungen – Der Inotify Kernel-Parameter“

  1. Avatar von kamome
    kamome

    Danke!

  2. Avatar von detlef S
    detlef S

    Da arbeitet man seit Jahren mit Linux, und lernt immer noch was dazu, bzw, erfährt von Dingen, von denen man erst gar nichts weiß. Linux-news ist echt der Hammer, Danke dafür. 🙂

    1. Avatar von Irgendwer
      Irgendwer

      Dummerweise ist das ein Wissen, das man nicht lernen sollte müssen. Also unnützes Wissen.
      Siehe dazu unten mein anderes Kommentar.

      Das System sollte einem hier besser führen. Denn das Wissen dahinter hat keinen besonderen nutzen. Es bringt einem nicht weiter, außer das man jetzt weiß, wie man den Wert erhöht. Das geht aber auch intelligenter.

      PS: Ich kritisiere hier übrigens nicht, dass Linux-News darüber einen Artikel schreibt, sondern die Tatsache, das man dafür überhaupt einen Artikel schreiben muss.

      1. Avatar von detlef S
        detlef S

        Ja gut, es gibt Dinge, die villeicht auch eher dem Admin weiterbringt, als den „Normalen“ Anwender, aber interessant ist es ja schon. Womit ich das Beispiel Microsoft-Quellcode in Raspberry-OS aufgreifen will, ohne diese tieferen Einblicke, wüsste man davon auch nichts, das war für auch für mich als User mehr als aufschlussreich und Informativ.

      2. Avatar von Ferdinand

        Einen Lerneffekt hat es schon, denn es führt tiefer in das Wissen um die Zusammenhänge ein. Dass das nicht alle User interessiert, ist klar und natürlich legitim. Aber wer mehr wissen will, kann sich davon ausgehend weiter belesen.

  3. Avatar von UbIx
    UbIx

    Also bei mir hat es wie folgt funktioniert („#“ ist das Anfangszeichen eines „root“ users)

    # cat /proc/sys/fs/inotify/max_user_watches
    65536
    # baloo-ctl status
    Wenn 'baloo-ctl' kein Tippfehler ist, können Sie command-not-found benutzen, um das Paket zu finden, das den Befehl enthält, z. B.:
       cnf baloo-ctl
    # cnf baloo-ctl
     baloo-ctl: Befehl nicht gefunden
    # baloo<tab><tab>
    balooctl                          baloo_file                        baloo_file_extractor              baloo_filemetadata_temp_extractor baloosearch                       balooshow
    # balooctl status
    Der Baloo-Index kann nicht geöffnet werden
    # # (OK hatte Baloo wegen hoher Systemlast am Anfang und alten Rechner abgeschaltet)
    # cat /etc/sysctl.conf
    ####
    #
    # To disable or override a distribution provided file just place a
    # file with the same name in /etc/sysctl.d/
    #
    # See sysctl.conf(5), sysctl.d(5) and sysctl(8) for more information
    #
    ####
    # echo "fs.inotify.max_user_watches=524288" >> /etc/sysctl.d/99-user.conf
    # cat /etc/sysctl.d/99-user.conf
    fs.inotify.max_user_watches=524288
    

    Nach dem Reboot („$“ = normaler user):

    $ sudo cat /proc/sys/fs/inotify/max_user_watches
    524288
    
    1. Avatar von Ferdinand

      Es muss balooctl heißen, nicht baloo-ctl.

  4. Avatar von 🤔 M.H

    🤔Wenn es gut ist für die Performance so wie für die gamer und Leute die viel mit Studio oder Grafik… https://t.co/od2SEkimr3

  5. Avatar von Martin Steigerwald
    Martin Steigerwald

    Meines Wissens ist eine Watch pro *Verzeichnis* (und jedes Unterverzeichnis) erforderlich. Nicht pro Datei.

    1. Avatar von Dejan Milosavljevic

      …pro Filesystem-Objekt…

    2. Avatar von Dejan Milosavljevic

      Ich denke Du verwechselst das mit dnotify, das kann nur Änderungen in Verzeichnissen beobachten. Hier gehts aber um inotify… 🙂

  6. Avatar von Irgendwer
    Irgendwer

    Fehlende Usability

    Würde man das ordentlich implementieren.
    Dann würde man den Nutzer nicht in eine überlaufende oder zu kleine inotify Einstellung reinlaufen lassen, sondern Balloo von KDE wäre so intelligent und würde mit einem einmalig aufpoppenden Fenster den Nutzer darauf hinweisen, dass der Wert höher eingestellt werden sollte.
    Und wenn er das möchte, was dann auch gleich per GUI gefragt werden sollte, dann sollte er das über die GUI nach Eingabe seines root Passworts auch machen können.
    Dazu gehört natürlich eine ausführliche Erklärung, was der Wert macht und ein Vorschlag, auf welchen Wert man ihn stellen sollte und warum der überhaupt erhöht werden muss.

    Das ist ein gutes Beispiel für so Kleinigkeiten, wo der Linuxnutzer im Stich gelassen wird.
    Und wo dann erwartet wird, dass er mit cat im /proc/ Kernelparameterverzeichnis selber weiß wo er nachschauen soll und dann soll er das auch noch händisch über die Konsole mit einem Edit der /etc/sysctl.conf einstellen. Das alles wird von Oma und Opa erwartet!

    Usability geht anders!

    1. Avatar von tuxnix
      tuxnix

      Ständig aufpoppende Fenster, die den User über Hintergrundprozesse belästigen, steigern auch keine Usability. Der Wert wurde mit Bedacht nicht auf Maximum gestellt.
      Vielleicht könnte es dafür eine Box in den Systemeinstellungen geben. Aber gerade KDE-Plasma ist da sehr gut aufgestellt. Vom im Stich lassen kann also wirklich keine Rede sein.

      1. Avatar von Irgendwer
        Irgendwer

        Keiner sprach von ständig aufpoppende Fenster.

        Die poppen nur auf, wenn es einmal notwendig ist. Und später, wenn der nächste Bereich überschritten wird, vielleicht nochmal.

      2. Avatar von Irgendwer
        Irgendwer

        Und es sprach auch keiner davon den Wert auf Maximum zu stellen. Einfach mal richtig das Kommentar lesen.

      3. Avatar von Irgendwer
        Irgendwer

        Und noch vergessen:

        Wo führt KDE Plasma hier denn den Nutzer?
        Balloo beendet lediglich die weitere Indexierung ohne dass der Nutzer darauf hingewiesen wird, dass nicht alles indexiert wurde.
        Das ist schlechtes Usability.
        Prinzipiell könnte man auch eine Einstellung machen die dazu führt, dass Balloo den Wert selbstständig anpasst, wie es das gerade braucht. Dann kann es zwar vorkommen, dass ungefragt plötzlich mehr Speicherplatz belegt wird, aber in Zeiten von > 1 TB Platten sollte das eher ein vernachlässigbares Problem sein. Schlimmer ist, das die Indexierung einfach ohne Vorwarnung aus heiterem Himmel nicht vervollständigt wird, wenn man das nicht weiß.
        Und schlimm ist, dass man Artikel lesen muss, um so etwas zu wissen.
        It ferne Leute werden solche Artikel also gar nicht lesen und sich auf die Indexierung blind verlassen, dass die alles indexiert und dann steigt die Software einfach aus, wenn der Wert überschritten wird.

        Das ist wie, wenn:
        Man stelle sich ein Auto ohne Tankfüllstandsanzeige vor, das geht dann einfach irgendwann aus und das, weil man keinen Artikel gelesen hat, in dem beschrieben steht, wie man nen Stab in einen Tank steckt um zu messen wie der Füllstand ist.
        Die Tankfüllstandszeige entspricht hier dem Softwarepopupfenster, von dem ich oben sprach, die dann in dem Auto fehlt.

        1. Avatar von kamome
          kamome

          Das _wäre_ bei ausreichend Plattenplatz OK – aber wird hier nicht mehr _RAM_ verbraucht? Da wüsste ich schon ganz gerne, wenn ein Prozess sich mal so 512 MB mehr genehmigt (aber gut, die „modernen“ Webbrowser sagen ja auch nichts).

          1. Avatar von Dejan Milosavljevic

            Es wird auf 64-Bit Systemen ca. 1 KB pro überwachtem Filesystem-Objekt verbraucht. Weniger Überwachung, weniger RAM-Verbrauch…

    2. Avatar von Jochen Geyer
      Jochen Geyer

      Dann will ich einmal, deine Forderungen mit der Realität abgleichen.

      sondern Balloo von KDE wäre so intelligent und würde mit einem einmalig aufpoppenden Fenster den Nutzer darauf hinweisen, dass der Wert höher eingestellt werden sollte.

      Niedlich, als ob der »normale« Benutzer Hinweise liest.
      Die Praxis sagt mir, diese werden ignoriert und bestenfalls weggeklickt.

      Und wenn er das möchte, was dann auch gleich per GUI gefragt werden sollte, dann sollte er das über die GUI nach Eingabe seines root Passworts auch machen können.

      Ich bezweifle, dass der »normale« Benutzer dieser Information überhaupt gewachsen ist, hier greift doch eher der Reflex, schnell den „Schließen“-Button zu finden und diesen zu betätigen.

      Dazu gehört natürlich eine ausführliche Erklärung, was der Wert macht und ein Vorschlag, auf welchen Wert man ihn stellen sollte und warum der überhaupt erhöht werden muss.

      Genauso wenig, wie der »normale« Benutzer eine Information, oder Hinweis liest, wird er sich eine ausführliche Erklärung durchlesen.

      Das alles wird von Oma und Opa erwartet!

      Es wäre doch vermessen, dies von Oma Erna und Opa Hubert einzufordern, dies (sicher) umsetzen zu können, aber ich würde dieser Zielgruppe auch keinen Rechner aufschwatzen und schon gar kein Linux installieren, weil ich wüsste das diese Zielgruppe mit dieser Technologie überfordert wäre, zumindest dann, wenn beide (oder wenigstens eine(r) von Beiden) keinen akademischen, und/oder technischen Hintergrund mitbringen.

      Und wie ihr sicher wisst, sind Distributionen aus dem Canonicalzweig keine Option!

      Spätestens die Corona Pandemie zeigte, wie viele ältere Menschen von IT überfordert waren.
      Weil sie sich beispielsweise ihren Impftermin im Netz klicken sollte, ohne überhaupt geeignete Geräte, oder einen Internetanschluss zu besitzen, wenn Internet überhaupt verfügbar ist.

      Denn das würde bedeuten, dass ich auch noch privat ständig Anrufe erhalten würde, die meine knappe Freizeit noch weiter beschränken.

      Ich muss sicherlich nicht erwähnen, dass ich Menschen ohne offenkundige Eignung nichts aufschwatzen werde, was sie überfordert, oder ungeeignet ist.

      https://www.youtube.com/watch?v=Q5aX-eqSFe4

    3. Avatar von Josef Carnap
      Josef Carnap

      Sehe ich auch so. Eventuell wäre das aber auch ein Punkt, der in deie Dokumentation von inotify hineingehört. Aber das Thema Dokumentation ist ein weites Feld …

  7. Avatar von Josef Carnap
    Josef Carnap

    Danke für den interessanten Artikel. Lassen sich mit inotify ausschließlich lokale Ordner und Dateien überwachen oder auch solche einer Samba-Freigabe? Ich such nämlich für genau diesen Zweck ein Überwachungstool.

    1. Avatar von Ferdinand

      Ich denke, die Frage wird hier beantwortet.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert