Wie kann ich feststellen, ob ich keine inotifizierten Uhren mehr habe?


47

Ich verwende eine Anwendung, die inotify Uhren verbraucht. Habe ich schon eingestellt

fs.inotify.max_user_watches=32768

In der /etc/sysctl.confletzten Nacht hat die Anwendung die Indizierung gestoppt, es sei denn, ich habe sie manuell ausgeführt, was mich zu dem Verdacht verleitet, dass mir die Uhren ausgehen.

Da ich nicht weiß, was der Kompromiss ist, wenn ich diese Zahl erhöhe (verbraucht sie mehr RAM?), Weiß ich nicht, ob ich diese Zahl nur erhöhen sollte, also würde ich gerne wissen, ob es einen Weg gibt, wie ich es kann kann sagen, ob es all diese Uhren verwendet und welche Kompromisse es für die Steigerung geben könnte.


Diese Frage ist wieder sehr aktuell geworden, da sich herausstellt, dass es in 18.04 nicht möglich ist, den Bildschirm zu entsperren, wenn man keine Inode-Uhren mehr hat.
Kasperd

Antworten:


64

Woher weißt du, ob du keine Uhren mehr hast? Schwanz wird es zeigen!

  • Beginnen Sie tailmit der -fOption (follow) für eine beliebige alte Datei, z tail -f /var/log/dmesg.
    • Wenn alles in Ordnung ist, werden die letzten 10 Zeilen angezeigt und eine Pause eingelegt. abbrechen mit Ctrl-C
    • Wenn Sie nicht mehr auf dem Laufenden sind , schlägt dieser etwas kryptische Fehler fehl :
      tail: kann nicht sehen '/ var / log / dmsg': Kein Platz mehr auf dem Gerät

Für die Neugierigen: Warum ist Schwanz ein "Telltail"?

  • Tatsächlich sollte jede gut geschriebene App die Höflichkeit haben, es Ihnen mitzuteilen , da die inotify API / Calls ihnen klar sagt, was der Deal ist.
  • Versuchen Sie es strace tail -f ...stattdessen und wenn es erfolgreich ist, endet es mit:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ...) = 1
    
  • aber wenn es fehlschlägt, dh Sie sind nicht mehr auf der Uhr , wird es sagen:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ..)
     = -1 ENOSPC (Kein Platz mehr auf dem Gerät)
    

Können Sie die Uhren erhöhen? Um wie viel? Irgendwelche Kompromisse?

Kurze Antwort: Sicher, kein Schweiß. Gehen Sie direkt zu einer halben Million (524288), wenn Sie möchten ... der zusätzliche Speicher sollte auf einem modernen System mit 4 GB + Speicher vernachlässigbar sein.

  • Jede verwendete inotify-Überwachung belegt 540 Byte (32-Bit-System) oder 1 KB (Double-on-64-Bit) [Quellen: 1 , 2 ]
  • Das kommt aus dem Kernel-Speicher , der nicht austauschbar ist.
  • Angenommen, Sie setzen das Maximum auf 524288 und alle wurden verwendet (unwahrscheinlich), würden Sie ca. 256 MB / 512 MB 32-Bit / 64-Bit-Kernelspeicher

    • Beachten Sie, dass Ihre Anwendung auch zusätzlichen Speicher benötigt, um die inotifizierten Handles, Datei- / Verzeichnispfade usw. zu verfolgen - wie viel davon vom Design abhängt.
  • Was ist der Maximalwert? Ich vermute keine, theoretisch, solange Sie genug RAM haben. In der Praxis wurde 524288 von Apps offiziell empfohlen , und die Leute haben es auf 2 Millionen festgelegt , natürlich mit der damit einhergehenden Speichernutzung.


5
Wenn Sie auch die aktuelle Anzahl der inotify-Uhren wissen möchten (also mehr als Ja / Nein), gehen Sie zusudo lsof | grep -i inotify | wc -l
Frank Nocke

2
"Gut geschriebene App" -Link kaputt.
Gaurav Sharma

11

Ich weiß nicht, ob ich diese Zahl erhöhen soll

Die einfache Möglichkeit, zu überprüfen, ob Sie Ihren max_user_watchesWert erreicht haben, besteht darin, mit Ihrem Benutzer anhand inotifywatchdes Pakets zu inotify-toolsprüfen, ob Sie noch Informationen aus einer Datei sammeln können.

Zum Beispiel inotifywatch -v /home/bruno/.profilefür mich zurück:

Establishing watches...
Total of 1 watches.
Finished establishing watches, now collecting statistics.

Es gibt also inotifykeine Probleme beim Erstellen einer neuen Uhr, keine Probleme hier.

Wenn Sie Ihr maximales Limit für inotify-Uhren erreicht haben, wird so etwas zurückgegeben

Failed to watch /home/bruno/.profile; upper limit on inotify watches reached!

Wenn Sie so etwas sehen, haben Sie das Limit erreicht und müssen das erlaubte Uhrenlimit erhöhen.

Verbraucht es mehr RAM?

Ja tut es. Laut diesem alten Artikel ist der Verbrauch jedoch im Vergleich zu anderen Aspekten eines laufenden Desktops minimal.

--SPEICHERNUTZUNG--

Die inotify Datenstrukturen sind leichtgewichtig:

Die inotify-Überwachung ist 40 Byte. Das inotify-Gerät ist 68 Byte. Das inotify-Ereignis ist 272 Byte

Angenommen, ein Gerät verfügt über 8192 Uhren, verbrauchen die Strukturen nur 320 KB Speicher. Bei einer maximalen Anzahl von 8 Geräten, die gleichzeitig vorhanden sein dürfen, sind dies immer noch nur 2,5 MB

Auf jedem Gerät können sich gleichzeitig 256 Ereignisse in der Warteschlange befinden, was 68 KB pro Gerät entspricht. Und nur 0,5 MB, wenn alle Geräte geöffnet sind und eine vollständige Ereigniswarteschlange haben.

So werden im seltenen Fall von allem, was offen und voll ist, ca. 3 MB Speicher verbraucht.

Jede inotify-Überwachung steckt den Inode eines Verzeichnisses / einer Datei im Speicher fest. Die Größe eines Inodes ist je nach Dateisystem unterschiedlich, es werden jedoch 512 Byes angenommen.

Wenn also die maximale Anzahl globaler Überwachungen aktiv ist, werden 32 MB Inodes im Inode-Cache festgelegt. Wieder kein Problem auf einem modernen System.

Ich gehe natürlich davon aus, dass sich seit dem Schreiben des Artikels nicht viel geändert hat, aber wenn ich mir die Zahlen ansehe, würde ich mir keine Sorgen machen, und eine Erhöhung des Grenzwerts wird den RAM-Verbrauch nicht wesentlich erhöhen.


Verwandte Beiträge über inotify


Entschuldigung Mann, ich hatte gestern einen Entwurf für ein paar Stunden geöffnet und habe Ihre Antwort nicht gesehen, bevor ich meine gepostet habe. Ich denke, es ist in Ordnung, da sie zwei verschiedene Ansätze haben :-) Könnten Sie nur klarstellen, dass in den letzten Kerneln inotify 0,5 KB (auf 32-Bit) oder 1 KB (64-Bit) Kernel-Speicher pro Watch verwendet, seit die alten Informationen von 2005 scheint nicht mehr wahr zu sein?
ish
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.