web-dev-qa-db-fra.com

Limite de surveillance du noyau inotify atteinte

Je suis actuellement confronté à un problème sur une boîte Linux où, en tant que root, j'ai des commandes renvoyant une erreur car la limite de surveillance inotify a été atteinte.

# 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'.` 

J'ai googlé un peu et chaque solution que j'ai trouvée consiste à augmenter la limite avec:

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

Mais je n'ai pu trouver aucune information sur les conséquences de l'augmentation de cette valeur. Je suppose que la valeur par défaut du noyau a été définie pour une raison mais elle semble inadéquate pour des utilisations particulières. (par exemple, lorsque vous utilisez Dropbox avec un grand nombre de dossiers ou un logiciel qui surveille un grand nombre de fichiers)

Donc, voici mes questions:

  • Est-il sûr d'augmenter cette valeur et quelles seraient les conséquences d'une valeur trop élevée?
  • Existe-t-il un moyen de savoir quelles sont les montres actuellement définies et quel processus les a définies pour pouvoir déterminer si la limite atteinte n'est pas due à un logiciel défectueux?
221
Ultraspider

Est-il sûr d'augmenter cette valeur et quelles seraient les conséquences d'une valeur trop élevée?

Oui, il est sûr d'augmenter cette valeur et voici les coûts possibles [ source ]:

  • Chaque utilisé inotify watch occupe 540 octets (système 32 bits), ou 1 ko (double - sur 64 bits) [sources: 1 , 2 ]
  • Cela vient de mémoire du noyau, qui n'est pas interchangeable.
  • En supposant que vous définissiez le maximum à 524288 et que tous aient été utilisés (improbable), vous utiliseriez environ 256 Mo/512 Mo de mémoire du noyau 32 bits/64 bits.
    • Notez que votre application utilisera également de la mémoire supplémentaire pour garder une trace des poignées inotify, des chemins de fichier/répertoire, etc. - combien dépend de sa conception.

Pour vérifier le nombre maximum de montres inotify:

cat /proc/sys/fs/inotify/max_user_watches

Pour définir le nombre maximum de montres inotify

Temporairement:

  • Courir Sudo sysctl fs.inotify.max_user_watches= avec votre valeur préférée à la fin.

En permanence ( informations plus détaillées ):

  • mettre fs.inotify.max_user_watches=524288 dans vos paramètres sysctl. Selon votre système, ils peuvent se trouver dans l'un des emplacements suivants:
    • Debian/RedHat: /etc/sysctl.conf
    • Arch: placez un nouveau fichier dans /etc/sysctl.d/, par exemple. /etc/sysctl.d/40-max-user-watches.conf
  • vous souhaiterez peut-être recharger les paramètres sysctl pour éviter un redémarrage: sysctl -p (Debian/RedHat) ou sysctl --system (Arch)

Vérifiez si le nombre maximum de montres inotify a été atteint:

Utilisez tail avec le -f (suivre) l'option sur n'importe quel ancien fichier, par exemple tail -f /var/log/dmesg: - Si tout va bien, il affichera les 10 dernières lignes et fera une pause; abandonner avec Ctrl-C - Si vous êtes à court de montres , cela échouera avec cela erreur quelque peu cryptique :

queue: ne peut pas regarder '/ var/log/dmsg': pas d'espace disponible sur l'appareil

Pour voir ce qui utilise les montres inotify

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

La première colonne indique le nombre de fds inotify (pas le nombre de montres cependant) et la seconde montre le PID de ce processus [sources: 1 , 2 ].

294
tshepang