Kernel Inotify Watch Limit erreicht

206

Ich habe derzeit ein Problem auf einer Linux-Box, auf der ich als Root-Benutzer Befehle habe, die einen Fehler zurückgeben, weil das Inotify-Überwachungslimit erreicht wurde.

# tail -f /var/log/messages
[...]
tail: cannot watch '/var/log/messages': No space left on device
# inotifywatch -v /var/log/messages
Establishing watches...
Failed to watch /var/log/messages; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via '/proc/sys/fs/inotify/max_user_watches'.` 

Ich habe ein bisschen gegoogelt und jede Lösung, die ich gefunden habe, besteht darin, das Limit zu erhöhen mit:

sudo sysctl fs.inotify.max_user_watches=<some random high number>

Ich konnte jedoch keine Informationen über die Konsequenzen einer Erhöhung dieses Wertes finden. Ich denke, der Standard-Kernel-Wert wurde aus einem bestimmten Grund festgelegt, scheint aber für bestimmte Verwendungszwecke nicht geeignet zu sein. (zB bei Verwendung von Dropbox mit einer großen Anzahl von Ordnern oder Software, die viele Dateien überwacht)

Also hier sind meine Fragen:

  • Ist es sicher, diesen Wert zu erhöhen und was wären die Folgen eines zu hohen Werts?
  • Gibt es eine Möglichkeit, herauszufinden, welche Uhren aktuell eingestellt sind und durch welchen Prozess festgestellt werden kann, ob das erreichte Limit nicht auf eine fehlerhafte Software zurückzuführen ist?
Ultraspider
quelle
Sie haben dies wahrscheinlich inzwischen überprüft, da dies 8 Monate alt ist, aber ist Ihr Laufwerk voll? "tail: kann / var / log / messages nicht sehen: Kein Platz mehr auf dem Gerät"
froggythefrog

Antworten:

273

Ist es sicher, diesen Wert zu erhöhen und was wären die Folgen eines zu hohen Werts?

Ja, es ist sicher, diesen Wert zu erhöhen und unten sind die möglichen Kosten [ Quelle ]:

  • Jede verwendete Inotify-Uhr 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 ungefähr 256 MB / 512 MB 32-Bit / 64-Bit-Kernelspeicher verwenden.
    • Beachten Sie, dass Ihre Anwendung auch zusätzlichen Speicher benötigt, um die inotify-Handles, Datei- / Verzeichnispfade usw. zu verfolgen - inwieweit dies vom Design abhängt.

So überprüfen Sie die maximale Anzahl von inotify-Uhren:

cat /proc/sys/fs/inotify/max_user_watches

Maximale Anzahl von inotify Uhren einstellen

Vorübergehend:

  • Führen sudo sysctl fs.inotify.max_user_watches=Sie am Ende mit Ihrem bevorzugten Wert aus.

Permanent ( nähere Infos ):

  • setzt fs.inotify.max_user_watches=524288in der sysctl - Einstellungen. Abhängig von Ihrem System befinden sie sich möglicherweise an einem der folgenden Orte:
    • Debian / RedHat: /etc/sysctl.conf
    • Arch: Legen Sie eine neue Datei an /etc/sysctl.d/, z/etc/sysctl.d/40-max-user-watches.conf
  • Möglicherweise möchten Sie die sysctl-Einstellungen neu laden, um einen Neustart zu vermeiden: sysctl -p(Debian / RedHat) oder sysctl --system(Arch)

Überprüfen Sie, ob die maximale Anzahl von inotify-Uhren erreicht wurde:

Verwenden Sie tailmit der -f(folgen) Option auf jeder alte Datei, zB tail -f /var/log/dmesg: - Wenn alles gut ist, wird es die letzten 10 Zeilen zeigen und Pause; Abbruch mit Strg-C - Wenn Sie nicht mehr auf dem Laufenden sind , schlägt dies mit diesem etwas kryptischen Fehler fehl :

tail: kann nicht sehen '/ var / log / dmsg': Kein Platz mehr auf dem Gerät

Um zu sehen, was inotify Uhren verbraucht

find /proc/*/fd -lname anon_inode:inotify |
   cut -d/ -f3 |
   xargs -I '{}' -- ps --no-headers -o '%p %U %c' -p '{}' |
   uniq -c |
   sort -nr

In der ersten Spalte wird die Anzahl der Inotify-FDS (nicht die Anzahl der Watches) und in der zweiten Spalte die PID dieses Prozesses angegeben [Quellen: 1 , 2 ].

Tshepang
quelle
3
I guess very few codes need the values higher than the defaultFür Dropbox ist möglicherweise ein höheres Limit erforderlich, je nachdem, wie viele Dateien Sie haben. Ich habe meine ohne Probleme angesprochen. Tatsächlich werden Sie in der Dropbox-Benachrichtigung (die erfolgt, wenn das Limit erreicht ist) ausdrücklich aufgefordert, diese zu erhöhen.
Falmarri
1
@ ultrasawblade- inotify ersetzt dnotify. dnotify war langsam und fehlerhaft. inotify kann für Verzeichnisse verwendet werden, und ein Verzeichnis wird "geändert", wenn eine der Dateien in diesem Verzeichnis (eine Ebene tief) geändert wird. Verzeichnisse sind sowieso nur Dateien.
Beatgammit
6
"Permanent: Ersetzen Sie den Wert in / proc / sys / fs / inotify / max_user_watches" <- das ist falsch. Um dies dauerhaft zu machen , müssen Sie ändern/etc/sysctl.conf
Merc
3
sysctl! = systemd, in Ihrer Erklärung. Funktioniert /etc/sysctl.dauch auf neueren RedHat-basierten Systemen.
Airey
1
@stackexchanger Wenn Sie sehr sicher sind, dass diese ähnlich sind (z. B. Sie haben getestet), senden Sie sie bitte ab und bearbeiten Sie sie bei der Frage. Ich selbst habe es nicht überprüft, und ich weiß, dass Distributionen dazu neigen, Pakete zu patchen, sodass das Verhalten für dieselben Pakete unterschiedlich sein kann. Dies gilt auch für Unterschiede in den Paketversionen.
Tshepang