Après une récente mise à niveau vers Fedora 15, je constate que plusieurs outils échouent avec des erreurs telles que:
tail: inotify resources exhausted
tail: inotify cannot be used, reverting to polling
Ce n'est pas simplement tail
que signaler des problèmes avec inotify non plus. Existe-t-il un moyen d'interroger le noyau pour savoir quel processus utilise les ressources inotify? Les sysctl
paramètres actuels liés à inotify ressemblent à ceci:
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 8192
fs.inotify.max_queued_events = 16384
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -print
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -exec sh -c 'cat $(dirname {})/../cmdline; echo ""' \; 2>/dev/null
Vous êtes probablement à court de montres inotify plutôt que d'instances. Pour savoir qui crée beaucoup de montres:
echo 1 >> /sys/kernel/debug/tracing/events/syscalls/sys_exit_inotify_add_watch/enable
pour permettre le traçage des annonces de surveillance;cat /sys/kernel/debug/tracing/tracing_enabled
pour vous assurer qu'il est mis à 1 et si elle est pas faitecho 1 >> /sys/kernel/debug/tracing/tracing_enabled
;/sys/kernel/debug/tracing/trace
pour voir combien de montres sont créées et par quels processus.Lorsque vous avez terminé, assurez-vous de faire écho à 0 dans le fichier d'activation (et dans le fichier tracing_enabled si vous deviez l'activer également) pour désactiver le traçage afin que vous ne subissiez pas la perte de performance consistant à poursuivre le traçage.
la source
echo 1 | sudo tee /sys/kernel/debug/tracing/tracing_on
sur les distributions modernes (Ubuntu 18.04.2 LTS).Comme @Jonathan Kamens l'a dit, vous êtes probablement à court de montres. J'ai un script premade ,
inotify-consumers
que les listes pour vous:Vous voyez rapidement ici pourquoi la limite par défaut de 8 000 observateurs est trop faible sur une machine de développement, car seule l'instance WebStorm dépasse rapidement cette limite lorsqu'un
node_modules
répertoire contenant des milliers de dossiers est atteint. Ajouter un observateur Webpack pour garantir les problèmes ...Il suffit de copier le contenu du script (ou le fichier sur GitHub) et de le placer quelque part dans votre
$PATH
, comme/usr/local/bin
. Pour référence, le contenu principal du script est simplement ceciSi vous vous demandez comment augmenter les limites, voici comment le rendre permanent:
la source
J'ai rencontré ce problème et aucune de ces réponses ne vous donne la réponse suivante: "Combien de surveillances utilise actuellement chaque processus?" Les one-liners vous indiquent tous le nombre d' instances ouvertes, ce qui ne représente qu'une partie de l'histoire, et les informations de trace sont utiles uniquement pour voir les nouvelles alertes s'ouvrir.
TL; DR: vous obtiendrez un fichier avec une liste d'
inotify
instances ouvertes et le nombre de leurs surveillances , ainsi que les pids et les binaires qui les ont générées, triés par ordre décroissant en fonction du nombre de surveillances:C'est une grosse boule de bazar, alors voici comment je suis arrivé là. Pour commencer, j’ai exécuté un
tail
fichier de test et jeté un coup d’œil au fd ouvert:Donc, 4 est le fd que nous voulons étudier. Voyons ce qu'il y a dedans
fdinfo
pour ça:Cela ressemble à une entrée pour la montre en bas!
Essayons quelque chose avec plus de montres, cette fois avec l'
inotifywait
utilitaire, en regardant ce qui se trouve dedans/tmp
:Aha! Plus d'entrées! Nous devrions donc avoir six choses à ce moment-
/tmp
là:Excellent. Mon nouveau
inotifywait
a une entrée dans safd
liste (c'est ce que comptent les autres on-line ici), mais six entrées dans sonfdinfo
fichier. Nous pouvons donc déterminer combien de montres un fd donné utilise pour un processus donné en consultant sonfdinfo
fichier. Maintenant, associez-le à certains des éléments ci-dessus pour obtenir une liste des processus qui ont ouvert les surveillances de notification et les utiliser pour compter les entrées de chacunfdinfo
. Ceci est similaire à ce qui est décrit ci-dessus, je vais donc vider le one-liner ici:Il y a des choses épaisses ici, mais les bases sont celles que j'utilise
awk
pour construire unfdinfo
chemin à partir de lalsof
sortie, en récupérant les numéros pid et fd, en supprimant le drapeau u / r / w de cette dernière. Ensuite, pour chaquefdinfo
chemin construit , je compte le nombre deinotify
lignes et affiche le nombre et le pid.Ce serait bien si j'avais quels processus ces pids représentent au même endroit, n'est-ce pas? J'ai pensé ainsi. Ainsi, dans un peu particulier en désordre, je me suis installé à appeler
dirname
deux fois sur lefdinfo
chemin pour obtenir paquet pour/proc/<pid>
, en ajoutant/exe
à, puis en cours d' exécutionreadlink
sur ce pour obtenir le nom exe du processus. Insérez-le également ici, triez-le par nombre de montres et redirigez-le dans un fichier afin de le conserver en sécurité et nous obtiendrons:En exécutant cela sans sudo pour afficher uniquement les processus que j'ai lancés ci-dessus, je reçois:
Parfait! Une liste des processus, des fd et du nombre de montres utilisées par chacun, ce qui est exactement ce dont j'avais besoin.
la source
lsof
à cette fin, je vous recommande d'utiliser les-nP
indicateurs pour éviter les recherches inutiles de noms de ports et DNS inversés. Dans ce cas particulier,-bw
il est également recommandé d’ ajouter pour éviter de bloquer les appels système. Cela dit, aveclsof
mon temps de travail gobé de 3 secondes sur mon humble station de travail (dont 2 secondes dans le noyau), cette approche est intéressante à explorer mais ne convient hélas pas à la surveillance.lsof | awk '/a_inode/ { gsub(/[urw]$/,"",$4); print "/proc/"$2"/fdinfo/"$4; }' | sed 's/fdinfo.*//' | sort | uniq > uniq-o
ensuitecat uniq-o | while read fdi; do count=$(cat ${fdi}fdinfo/* | grep -c inotify 2>/dev/null); exe=$(readlink ${fdi}exe); echo -e $count"\t"${fdi}"\t"$exe; done > watches
Pour tracer les processus qui consomment inotify montres (pas d' instances) , vous pouvez utiliser la fonction ftrace de dynamique du noyau si elle est activée dans le noyau.
L'option de noyau dont vous avez besoin est
CONFIG_DYNAMIC_FTRACE
.Montez d'abord le système de fichiers debugfs s'il n'est pas déjà monté.
Allez dans le sous-
tracing
répertoire de ce répertoire debugfsActiver le traçage des appels de fonction
Filtrer uniquement les
SyS_inotify_add_watch
appels systèmeEfface le tampon de l'anneau de trace s'il n'était pas vide
Activer le traçage s'il n'est pas déjà activé
Redémarrez le processus suspect (dans mon cas, c’était un crashplan, une application de sauvegarde)
Regardez l'inotify_watch en train de s'épuiser
Terminé
la source
la source
J'ai modifié le script présenté ci-dessus pour afficher la liste des processus consommant des ressources inotify :
Je pense qu'il y a un moyen de remplacer mon double sed .
Oui. Utilisez soit
ou
et vous ne recevrez que le pid.
Aussi, si vous ajoutez
dans la recherche, vous vous débarrasserez de toutes les lignes d'erreur embêtantes lancées par find. Donc, cela fonctionnerait:
la source