La limite de surveillance inotify du noyau est atteinte

206

Je suis actuellement confronté à un problème sur une boîte Linux où, en tant que root, j'ai des commandes qui renvoient une erreur parce que 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 est d'augmenter la limite avec:

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

Mais je n’ai trouvé 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 quelconque, mais elle semble être inadéquate pour des utilisations particulières. (par exemple, lorsque vous utilisez Dropbox avec un grand nombre de dossiers ou un logiciel qui surveille beaucoup de fichiers)

Donc, voici mes questions:

  • Est-il prudent d’élever cette valeur et quelles seraient les conséquences d’une valeur trop élevée?
  • Existe-t-il un moyen de savoir quelles sont les surveillances actuellement définies et quel processus les configurent pour pouvoir déterminer si la limite atteinte n'est pas causée par un logiciel défectueux?
Ultraspider
la source
Vous avez probablement déjà vérifié cela depuis l'âge de 8 mois, mais votre lecteur est-il plein? "tail: ne peut pas regarder '/ var / log / messages': il n'y a plus d'espace disponible sur l'appareil"
froggythefrog

Réponses:

273

Est-il prudent d’élever cette valeur et quelles seraient les conséquences d’une valeur trop élevée?

Oui, il est prudent d’élever cette valeur et vous trouverez ci-dessous les coûts possibles [ source ]:

  • Chaque montre inotify utilisée occupe 540 octets (système 32 bits) ou 1 ko (double sur 64 bits) [sources: 1 , 2 ]
  • Cela vient de la mémoire du noyau , qui est non échangeable.
  • 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 descripteurs inotify, des chemins de fichiers / répertoires, etc. - leur nombre 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:

  • Exécuter 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=524288dans vos paramètres sysctl. Selon votre système, ils peuvent se trouver dans l’un des emplacements suivants:
    • Debian / RedHat: /etc/sysctl.conf
    • Arch: mettre 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 tailavec l' -foption (suivez) sur n'importe quel ancien fichier, par exemple tail -f /var/log/dmesg: - Si tout va bien, les 10 dernières lignes seront affichées et une pause sera effectuée; Abandonner avec Ctrl-C - Si vous êtes à court de montres , cela échouera avec cette erreur quelque peu cryptique :

tail: impossible de regarder '/ var / log / dmsg': aucun espace disponible sur le périphérique

Pour voir ce qui se passe dans 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 fd inotify (pas le nombre de surveillances) et la seconde indique le PID de ce processus [sources: 1 , 2 ].

Tshepang
la source
3
I guess very few codes need the values higher than the defaultDropbox peut nécessiter une limite supérieure, en fonction du nombre de fichiers que vous avez. Iv'e a soulevé le mien sans aucun problème. en fait, la notification de dépôt (qui se produit lorsque la limite est atteinte) vous indique explicitement de l'élever.
Falmarri
1
@ ultrasawblade-inotify remplacé dnotify. Dnotify était lent et buggy. inotify peut être utilisé sur des répertoires et un répertoire sera "modifié" lors de la modification de l'un des fichiers de ce répertoire (de niveau inférieur). Les répertoires ne sont que des fichiers.
beatgammit
6
"En permanence: remplacez la valeur dans le répertoire / proc / sys / fs / inotify / max_user_watches" <- ceci est incorrect. Pour rendre ce permanent, vous devez changer/etc/sysctl.conf
Merc
3
sysctl! = systemd, dans votre explication. Et /etc/sysctl.dfonctionne également sur les nouveaux systèmes basés sur RedHat.
aairey
1
@stackexchanger si vous êtes certain que ces deux éléments sont similaires (par exemple, vous avez testé), veuillez soumettre et modifier la question. Moi-même, je n'ai pas vérifié et je sais que les distributions ont tendance à patcher les paquets, donc le comportement peut être différent pour les mêmes paquets. Sans parler des différences entre les versions de paquet.
Tshepang