alternative non intensive en CPU à lsof?


12

Nous exécutons un cluster Apache Cassandra où chaque hôte a quelques centaines de milliers de fichiers ouverts à tout moment.

Nous aimerions être en mesure d'obtenir un nombre de fichiers ouverts à intervalles réguliers et d'introduire ce nombre dans le graphite , mais lorsque nous courons lsofsous collectd, cela finit par prendre quelques minutes pour terminer et mâcher une quantité excessive de CPU en attendant .

Je me demande s'il existe un moyen alternatif et plus convivial d'obtenir les mêmes données que lsof fournit, ou même un moyen d'exécuter lsof qui ne mangera pas dans le CPU de manière aussi sensible? (Bien que je suppose que cette dernière méthode prendrait probablement beaucoup plus de temps qu'elle ne le fait actuellement ... pas idéal).

Peut-être que le noyau maintient une variable quelque part qui contient le nombre de fichiers ouverts? Vœu pieux?

Mise à jour:

En réponse à l'une des réponses, nous utilisons déjà les indicateurs -bet -n. Voici la commande complète telle que je l'ai sous collectd:

sudo lsof -b -n -w | stdbuf -i0 -o0 -e0 wc -l

Réponses:


12

Vous n'avez probablement pas besoin de résoudre les adresses réseau pour le socket, utilisez donc au moins le -ncommutateur. Ensuite, vous pouvez également vouloir ignorer les opérations de blocage avec -b.

Ces 2 premiers commutateurs devraient vraiment le rendre plus rapide.

Et puis -lpour éviter la résolution des uids. Et -Lpour éviter de compter les liens. Etc. Voir l' homme lsof .

Alternativement, avec Linux, vous pouvez créer un script pour simplement compter les liens sous /proc/<PID>/fdcomme ceci:

find /proc -mindepth 3 -maxdepth 3 -type l | awk -F/ '$4 == "fd" { s++ } END { print s }'


Je reçois toujours - trouver: /proc/{{number}}/fd/5': No such file or directory find: / proc / {{numéro}} / fdinfo / 5 ': Aucun fichier ou répertoire de ce type - Q @ Benoît comment puis-je éviter cela?
BG Bruno

2
@BrunoBG: essayez:echo /proc/*/fd/* | wc -w
Olivier Dulac

Thx @OlivierDulac qui était évident :-)
BG Bruno

bonnes suggestions, mais j'ai déjà utilisé les options -n et -b .... J'ai besoin de plus de suggestions
Michael Martinez

1
@OlivierDulac peut ne pas fonctionner si vous avez un très grand nombre de fd.
Benoît

5

Vous le faites mal.

De man proc

   /proc/sys/fs/file-nr

Ce fichier (en lecture seule) contient trois nombres: le nombre de descripteurs de fichiers alloués (c'est-à-dire le nombre de fichiers actuellement ouverts); le nombre de descripteurs de fichiers gratuits; et le nombre maximal de descripteurs de fichiers (c'est-à-dire la même valeur que / proc / sys / fs / file-max). Si le nombre de descripteurs de fichiers alloués est proche du maximum, vous devez envisager d'augmenter le maximum. Avant Linux 2.6, le fichier alloué au noyau se gérait dynamiquement, mais il ne les libérait plus. Au lieu de cela, les descripteurs de fichiers gratuits ont été conservés dans une liste pour réaffectation; la valeur "free file handles" indique la taille de cette liste. Un grand nombre de descripteurs de fichiers gratuits indique qu'il y a eu un pic passé dans l'utilisation des descripteurs de fichiers ouverts. Depuis Linux 2.6, le noyau libère les descripteurs de fichiers libérés et le "

La première valeur si votre chat vous donne exactement ce que vous recherchez après son apparition.

Pour mémoire, je n'ai pas pu obtenir la lsofsortie pour la faire correspondre même avec une certaine quantité de fudging mais je suppose que c'est ce que le noyau dit de plus faisant autorité que la liste que vous obtenez de lsoftoute façon.


1
Voici ma lsof: [root@ec2- cassandra101 ~]$ time lsof -b -n -w -l -L | stdbuf -i0 -o0 -e0 wc -l 1018065. Voici ce que dit le fichier-nr: [root@ec2- cassandra101 ~]$ cat /proc/sys/fs/file-nr 2784 0 3093428. La grande différence (1 000 000+ contre 2784) est due au fait que lsoftoutes les choses auxquelles aucun descripteur de fichier n'est associé sont associées: fichiers de bibliothèque, fichiers exécutables, etc. Donc, si vous n'êtes intéressé que par les descripteurs de fichiers, alors file-nrest le chemin à parcourir, sinon vous avez besoin de lsof ou équivalent.
Michael Martinez

Essayez inode-nrplutôt au même endroit.
Matthew Ife
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.