Comment puis-je savoir si je manque de montres inotify?

34

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

fs.inotify.max_user_watches=32768

dans /etc/sysctl.conf mais hier soir, l'application a cessé d'indexer à moins que je ne l'ait fait manuellement, ce qui m'amène à penser que je suis à court de montres.

Comme 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 de savoir si elle utilise toutes ces montres et quels sont les compromis possibles pour l'augmenter.

    
posée Jorge Castro 21.06.2012 - 19:28
la source

2 réponses

48

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

  • Démarrez tail avec l'option -f (follow) sur tous les anciens fichiers, par ex. tail -f /var/log/dmesg :
    • Si tout va bien, il affichera les 10 dernières lignes et fera une pause; annuler avec Ctrl-C
    • Si vous êtes à court de montres , cela échouera avec cette erreur quelque peu cryptique :
      tail: cannot watch '/var/log/dmsg': No space left on device

Pour les curieux: pourquoi tail est-il un "telltail"?

  • En fait, toute application bien écrite devrait avoir la courtoisie de en vous disant que l’API / les appels inotify leur indique clairement quel est le contrat.
  • Essayez plutôt strace tail -f ... et quand il réussit, il se termine par:
    inotify_add_watch(4, "/var/log/dmesg", IN_MODIFY...) = 1
    
  • mais si ça échoue, c’est-à-dire que vous êtes hors de montres , ça va dire:
    inotify_add_watch(4, "/var/log/dmesg", IN_MODIFY..)
    = -1 ENOSPC (No space left on device)
    

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

Réponse courte: Bien sûr, pas de transpiration. Aller directement à un demi-million (524288) si vous voulez ... la mémoire supplémentaire utilisée devrait être négligeable sur un système moderne de 4 Go + de mémoire.

  • Chaque montre utilisée inotify prend 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 ne peut pas être filtrée.
  • Donc, en supposant que vous définissez le maximum à 524288, et que tous ont été utilisés (peu probable), vous utiliseriez approximativement. 256 Mo / 512 Mo de mémoire noyau 32 bits / 64 bits

    • Notez que votre application utilisera également de la mémoire supplémentaire pour suivre les poignées inotify, les chemins de fichiers / répertoires, etc. - combien dépend de sa conception.
  • Quelle est la valeur maximale? Je suppose que rien, en théorie, tant que vous avez assez de RAM. En pratique, 524288 a été officiellement recommandé par les applications , et les utilisateurs ont été paramétré sur 2 millions , avec l’utilisation de la mémoire correspondante, bien sûr.

réponse donnée ish 24.06.2012 - 17:17
la source
8

Je ne sais pas si je devrais simplement augmenter ce nombre

Le moyen facile de vérifier si vous avez atteint la valeur max_user_watches est d’utiliser, avec votre utilisateur, 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èmes pour créer une nouvelle montre, pas de problèmes ici.

Si vous avez atteint votre limite maximale dans les montres inotify, elle renverra quelque chose comme

Failed to watch /home/bruno/.profile; upper limit on inotify watches reached!

Si vous voyez quelque chose comme ça, vous avez atteint la limite et vous devrez augmenter la limite de temps autorisée.

Consomme-t-il plus de RAM?

Oui, c'est le cas. Mais selon cet ancien article , la quantité consommée est minime par rapport aux autres aspects d’un ordinateur de bureau actif.

  

- UTILISATION DE LA MEMOIRE -

     

Les structures de données inotify sont légères:

     

inotify watch est de 40 octets   inotify device est de 68 octets   inotify event est 272 octets

     

Donc, en supposant qu'un appareil a 8192 montres, les structures ne vont que   consommer 320 Ko de mémoire. Avec un nombre maximum de 8 appareils autorisés   pour exister à la fois, il ne reste que 2,5 Mo

     

Chaque périphérique peut également contenir 256 événements à la fois, ce qui revient à   68KB par appareil. Et seulement .5 MB si tous les appareils sont ouverts et ont   une file d'attente complète des événements.

     

Environ 3 Mo de mémoire sont donc utilisés dans les rares cas de   tout est ouvert et complet.

     

Chaque montre inotify épingle l’inode d’un répertoire / fichier en mémoire,   la taille d'un inode est différente selon le système de fichiers mais laisse supposer   que c'est 512 byes.

     

Donc, en supposant que le nombre maximal de montres globales est actif, cela   épinglez 32 Mo d'inodes dans le cache d'inode. Encore pas un problème   sur un système moderne.

Je suppose bien sûr que les choses n’ont pas beaucoup changé depuis la rédaction de l’article, mais je n’aurais pas à me soucier des chiffres et l’augmentation de la limite n’augmentera pas beaucoup la consommation de mémoire vive.

Articles connexes sur inotify

réponse donnée Bruno Pereira 24.06.2012 - 12:13
la source

Lire d'autres questions sur les étiquettes