web-dev-qa-db-fra.com

Comment déterminer quels processus ont la plupart des inodes ouverts

Voici mon problème, Visibile dans un graphique Munin:

munin inode chart

Mes inodes d'occasion/ouverts sont "soudainement" en augmentation constante.

Existe-t-il un moyen de déterminer quel processus maintient les inodes les plus actuellement ouverts? J'ai utilisé l'approche de https://unix.stackexchange.com/questions/117093/finind-where-inodes-Are-being-uused et a trouvé et nettoyé certains dossiers avec des mails et des journaux que je pourrais obtenir débarrasser de ... Néanmoins, si les inodes sont ouverts, il doit y avoir un processus en les gardant en cours d'utilisation, non? Ce n'est peut-être pas nécessairement le dossier avec la plupart des fichiers où l'augmentation provient - ou je me trompe là-bas?

Donc, j'aimerais voir qui les empêche d'ouvrir et de suivre l'utilisation pour voir où l'augmentation vient de

Mise à jour

Basé sur le script d'Andrew, j'ai créé une version qui montre également le nom du processus. Comme je dispose des processus Nginx/Apache en cours d'exécution pouvant respecter, j'aimerais voir les résultats sur le nom du processus.

for dir in /proc/*/fd;
do
    echo -n "$dir ";
    pid=`expr "$dir" : '\/proc\/\(.*\)\/.*'`; # extract the pid
    pname=`ps -p $pid -o comm=`; # grab process name
    echo -n "$pname ";
    ls $dir 2>/dev/null | wc -l;
done | sort -n -k 3

Sortie d'échantillon:

/proc/4612/fd sshd 49
/proc/46470/fd node 60
/proc/5655/fd nginx 66
/proc/6656/fd nginx 76
/proc/7654/fd nginx 81
/proc/8578/fd dovecot 107
/proc/9657/fd nginx 117
/proc/3495/fd Java 146
/proc/4785/fd mysqld 382

Donc, le prochain essai enregistre la distribution au fil du temps pour voir quels changements et son corrélation avec le nombre de/proc/sys/fs/inode-nr que Morgan a mentionné

un an plus tard ...

Un peu de temps est passé, voici un nouveau graphique munin open inodes

Et devinez quoi, fin septembre est le point où un lecteur défectueux a été remplacé. Il semble donc que tout le désordre a été généré par une erreur de disque. Néanmoins, les scripts sont toujours utiles!

4
Xosofox

Je pense que le problème ici est, en partie, ce que Munin signifie par "Open Inodes". Mon installation par défaut de Munin a deux plugins pour obtenir le nombre d'inodes alloués:

"/ etc/munin/plugins/open_inodes" qui obtient la métrique d'inode à partir de "/ proc/sys/fs/inode-nr"

et

"/ etc/munin/plugins/df_inode" qui obtient la métrique à partir de la sortie de "DF -I".

Ces numéros sont un reflet de fichiers existants non le nombre de fichiers/inodes utilisés par tous les processus du système.

Par exemple, ce script crée dix fichiers et après la fin, nous pouvons voir l'augmentation de l'allocation d'Inode dans "DF -I" ​​et Inode-NR.

    #!/usr/bin/python

    f0 = open("foo0", "w")
    f1 = open("foo1", "w")
    f2 = open("foo2", "w")
    f3 = open("foo3", "w")
    f4 = open("foo4", "w")
    f5 = open("foo5", "w")
    f6 = open("foo6", "w")
    f7 = open("foo7", "w")
    f8 = open("foo8", "w")
    f9 = open("foo9", "w")

Toutefois, si je modifie cela pour empêcher le programme de se terminer (et que les fichiers existent déjà) ... Les fichiers sont laissés "ouverts" et "en utilisation" par le processus.

    #!/usr/bin/python

    import time

    f0 = open("foo0", "w")
    f1 = open("foo1", "w")
    f2 = open("foo2", "w")
    f3 = open("foo3", "w")
    f4 = open("foo4", "w")
    f5 = open("foo5", "w")
    f6 = open("foo6", "w")
    f7 = open("foo7", "w")
    f8 = open("foo8", "w")
    f9 = open("foo9", "w")

    time.sleep(600)

que nous pouvons voir reflétés dans la sortie de "LSOF -P PID"

COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
...
open_some 6602 morgan    3w   REG  254,1        0 262198 /home/morgan/src/foo0
open_some 6602 morgan    4w   REG  254,1        0 262273 /home/morgan/src/foo1
open_some 6602 morgan    5w   REG  254,1        0 262284 /home/morgan/src/foo2
open_some 6602 morgan    6w   REG  254,1        0 262287 /home/morgan/src/foo3
open_some 6602 morgan    7w   REG  254,1        0 262289 /home/morgan/src/foo4
open_some 6602 morgan    8w   REG  254,1        0 262301 /home/morgan/src/foo5
open_some 6602 morgan    9w   REG  254,1        0 262302 /home/morgan/src/foo6
open_some 6602 morgan   10w   REG  254,1        0 262309 /home/morgan/src/foo7
open_some 6602 morgan   11w   REG  254,1        0 262457 /home/morgan/src/foo8
open_some 6602 morgan   12w   REG  254,1        0 268672 /home/morgan/src/foo9

Mais je peux exécuter ce script "Ouvrir et rester ouvert" autant de fois que je veux, et cela ne changera pas les chiffres dans df/inode-nr.

Donc, en bref, Munin signale le nombre d'inodes alloués et non le nombre de toutes les inodes utilisées par tous les processus. Si, après avoir supprimé un tas de fichiers, le graphila Munin ne reflète pas les inodes libres, il peut être simplement que le graphique n'a pas ré-généré ou, dans l'exemple indiqué, l'échelle de temps du graphique étant trop longue pour refléter un changement soudain.

1
Morgan