web-dev-qa-db-fra.com

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

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.

46
Jorge Castro

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

  • Démarrez tail avec l’option -f (suivez) de tout 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 manquez de veille , il échouera avec ceci erreur quelque peu cryptique :
      tail: impossible de regarder '/ var/log/dmsg': aucun espace disponible sur le périphérique

Pour les curieux: Pourquoi tail un "telltail"?

  • En fait, toute application bien écrite devrait avoir la courtoisie de vous en informer, puisque l'API inotify /calls leur dit clairement quelle est la transaction.
  • Essayez plutôt strace tail -f ... et quand il réussira, il se terminera par:
     inotify_add_watch (4, "/ var/log/dmesg", IN_MODIFY ...) = 1
  • mais si cela échoue, c'est-à-dire vous êtes à court de montres , il dira:
     inotify_add_watch (4, "/ var/log/dmesg", IN_MODIFY ..) 
    = -1 ENOSPC (aucun espace 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 doté de 4 Go + de mémoire.

  • Chaque utilisé montre inotify occupe 540 octets (système 32 bits), ou 1 ko (double - sur 64 bits) [sources: 1 , 2 ]
  • Cela provient de la mémoire du noyau , qui n'est pas mappable.
  • 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 assurer le suivi 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. 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.

63
ish

Je ne sais pas si je devrais simplement augmenter ce nombre

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.

Consomme-t-il plus de RAM?

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.


Related posts sur inotify

10
Bruno Pereira