Comment savoir si je n'ai plus de montres inotify?

47

J'utilise une application qui consomme des montres inotify. J'ai déjà mis

fs.inotify.max_user_watches=32768

dans , /etc/sysctl.confmais la nuit dernière l'arrêt de l' application d' indexation à moins que je l' ai couru manuellement, ce qui me conduit à penser que je suis hors de montres.

Puisque je ne sais pas quel est le compromis lorsque 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.

Jorge Castro
la source
Cette question est redevenue tout à fait pertinente car il est apparu en 18.04 que déverrouiller l’écran n’était pas possible si on était à court de montres inode.
Kasperd

Réponses:

64

Comment savez-vous si vous êtes à court de montres? queue dira!

  • Commencez tailavec l' -foption (suivez) 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 cette erreur quelque peu cryptique :
      tail: impossible de regarder '/ var / log / dmsg': aucun espace disponible sur le périphérique

Pour les curieux: Pourquoi la queue est-elle un "telltail"?

  • En fait, toute application bien écrite devrait avoir la courtoisie de vous en informer , car les appels / API inotify leur indiquent clairement en quoi consiste le contrat.
  • Essayez strace tail -f ...plutôt, et quand ça réussit, ça finit avec:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ...) = 1
    
  • mais si cela échoue, c'est- à- dire que vous êtes à court de montres , il dira:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ..)
     = -1 ENOSPC (aucun espace n'est disponible sur le périphérique)
    

Pouvez-vous augmenter les montres? De combien? Des compromis?

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 avec 4 Go + de mémoire.

  • 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.
  • 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

    • 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.
  • Quelle est la valeur maximale? Je suppose qu'aucun, en théorie, tant que vous avez assez de RAM. Dans la pratique, 524288 a été officiellement recommandé par les applications , et le nombre d'utilisateurs a été fixé à 2 millions , avec l'utilisation de la mémoire qui l'accompagne, bien sûr.

ish
la source
5
Si vous souhaitez également connaître le nombre actuel de montres inotify (donc plus que oui / non), optez poursudo lsof | grep -i inotify | wc -l
Frank Nocke
2
lien "application bien écrite" brisé.
Gaurav Sharma
11

Je ne sais pas si je devrais simplement augmenter ce nombre

Le moyen facile de vérifier si vous avez atteint votre max_user_watchesvaleur est, avec votre utilisateur, d'utiliser inotifywatchle package inotify-toolset de vérifier si vous pouvez toujours collecter des informations à partir d'un fichier.

Par exemple inotifywatch -v /home/bruno/.profilepour moi, retourne:

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

Donc, inotifypas de problèmes pour créer une nouvelle montre, pas de problèmes 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.

Consomme-t-il plus de RAM?

Oui. Mais selon cet ancien article, la quantité consommée est minime comparée à d'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 beaucoup la consommation de RAM.


Articles connexes sur inotify

Bruno Pereira
la source
Désolé mec, j'ai eu un brouillon ouvert hier pendant quelques heures et je n'ai pas vu votre réponse avant de poster la mienne. Je suppose que ça va, car ils ont deux approches différentes :-) Pourriez-vous simplement préciser que dans les noyaux récents, inotify utilise 0,5 Ko (sur 32 bits) ou 1 Ko (64 bits) de mémoire noyau par veille, car les anciennes informations de 2005 ne semble plus être vrai?
Ish