J'utilise une application qui consomme des montres inotify. J'ai déjà réglé
fs.inotify.max_user_watches=32768
dans /etc/sysctl.conf
mais hier soir, l'application a cessé d'indexer sauf si je l'ai exécutée manuellement, ce qui me laisse supposer que je suis à court de montres.
Puisque je ne sais pas quel est le compromis quand j'augmente ce nombre (consomme-t-il plus de RAM?), Je ne sais pas si je devrais simplement augmenter ce nombre, alors j'aimerais savoir s'il y a une façon peut dire s’il utilise toutes ces montres et quels sont les compromis possibles pour l’augmenter.
tail
avec l’option -f
(suivez) de tout ancien fichier, par exemple. tail -f /var/log/dmesg
: tail: impossible de regarder '/ var/log/dmsg': aucun espace disponible sur le périphérique
Pour les curieux: Pourquoi tail un "telltail"?
strace tail -f ...
et quand il réussira, il se terminera par: inotify_add_watch (4, "/ var/log/dmesg", IN_MODIFY ...) = 1
inotify_add_watch (4, "/ var/log/dmesg", IN_MODIFY ..) = -1 ENOSPC (aucun espace disponible sur le périphérique)
Réponse courte: Bien sûr, pas de sueur. Passez directement à un demi-million (524288) si vous voulez ... la mémoire supplémentaire utilisée devrait être négligeable sur un système moderne doté de 4 Go + de mémoire.
Donc, en supposant que vous définissiez le maximum à 524288 et que tous aient été utilisés (improbable), vous utiliseriez env. 256 Mo/512 Mo de mémoire du noyau 32 bits/64 bits
Quelle est la valeur maximale? Je suppose qu'aucun, en théorie, tant que vous avez assez de RAM. En pratique, 524288 a été officiellement recommandé par les applications , et les gens l'ont été en le fixant à 2 millions , avec les utilisation de la mémoire, bien sûr.
Le moyen le plus simple de vérifier si vous avez atteint votre valeur max_user_watches
consiste, avec votre utilisateur, à utiliser inotifywatch
, à partir du package inotify-tools
, et de vérifier si vous pouvez toujours collecter des informations à partir d'un fichier.
Par exemple, inotifywatch -v /home/bruno/.profile
pour moi renvoie:
Establishing watches...
Total of 1 watches.
Finished establishing watches, now collecting statistics.
Donc, inotify
n'a pas de problème pour créer une nouvelle montre, pas de problème ici.
Si vous avez atteint votre limite maximale dans les montres inotify, vous obtiendrez quelque chose comme:
Failed to watch /home/bruno/.profile; upper limit on inotify watches reached!
Si vous voyez quelque chose comme cela, alors vous avez atteint la limite et vous devrez augmenter la limite autorisée de surveillance.
Oui. Mais selon ce ancien article , la quantité consommée est minime comparée aux autres aspects d’un poste de travail en cours d’exécution.
--UTILISATION DE LA MÉMOIRE--
Les structures de données inotify sont légères:
surveillance inotify est de 40 octets périphérique inotify est de 68 octets événement inotify est de 272 octets
En supposant qu'un appareil dispose de 8192 montres, les structures ne consomment que 320 Ko de mémoire. Avec un nombre maximal de 8 périphériques autorisés à exister à la fois, il ne reste que 2,5 Mo
Chaque périphérique peut également avoir 256 événements en file d'attente à la fois, ce qui correspond à 68 Ko par périphérique. Et seulement 0,5 Mo si tous les périphériques sont ouverts et ont une file d'attente d'événements complète.
Donc, environ 3 Mo de mémoire sont utilisés dans les rares cas où tout est ouvert et plein.
Chaque montre inotify épingle l’inode d’un répertoire/fichier en mémoire. La taille d’un inode est différente par système de fichiers, mais supposons qu’il s’agisse de 512 byes.
Donc, en supposant que le nombre maximal de surveillances globales soient actives, cela ramènerait 32 Mo d'inodes dans le cache d'inodes. Encore une fois pas un problème sur un système moderne.
Bien sûr, je suppose que les choses n'ont pas beaucoup changé depuis la rédaction de l'article, mais si je regarde les chiffres, je ne m'inquiéterais pas, et augmenter la limite n'augmentera pas de beaucoup la consommation RAM.
inotify