Comment vérifier l'utilisation d'ulimit

29

Existe-t-il un moyen de vérifier l'utilisation des ulimits pour un utilisateur donné? Je sais que vous pouvez modifier les ulimits pour un seul processus lorsque vous le démarrez ou pour un seul shell lors de l'exécution, mais je veux pouvoir "surveiller" à quel point un utilisateur est proche d'atteindre ses limites. Je bashprévois d' écrire un script qui rendra compte à statsd du pourcentage d'utilisation actuel. Plus précisément, je veux suivre:

  1. ouvrir des fichiers ( ulimit -n)
  2. processus utilisateur max ( ulimit -u)
  3. signaux en attente ( ulimit -i)

Ce que je veux, c'est le pourcentage d'utilisation (0-100).

Hazmat
la source
si la comptabilité des processus est activée dans votre noyau, vous pouvez collecter des statistiques d'utilisation détaillées sur vos utilisateurs.
casey
Comment activez-vous la comptabilité des processus?
hazmat
Et combien de frais généraux cela ajoute-t-il?
hazmat

Réponses:

22

Peut-être que cela aide pour la première question:

Si vous connaissez les ID de processus (PID) de l'utilisateur spécifique, vous pouvez obtenir les limites de chaque processus avec:

cat /proc/<PID>/limits

Vous pouvez obtenir le nombre de fichiers ouverts pour chaque PID avec:

ls -1 /proc/<PID>/fd | wc -l

Et puis il suffit de comparer la valeur de Max open filesavec le nombre de descripteurs de fichiers ouverts de la deuxième commande pour obtenir un pourcentage.

m13r
la source
8

Générez le pourcentage de fichiers ouverts, de proc et de signaux en attente de l'utilisateur actuel par plusieurs méthodes et outils standard peu pratiques:

paste <(grep 'open files\|processes\|pending signals' /proc/self/limits | 
        cut -c27-38) \
      <(i=`whoami` ; lsof -u $i | tail -n +2 | awk {'print $9'} | wc -l; 
                     ps --no-headers -U $i -u $i u | wc -l ; 
                     ps -u $i -o pid= | xargs printf "/proc/%s/status\n" |
                                        xargs grep -s 'SigPnd' |
                                        sed 's/.*\t//' | paste -sd+ | bc ; ) |
while read a b ; do echo $((${b}00/a))%; done

Sortie sur mon système:

59%
9%
0%

En supposant que ces chiffres sont bons, ce que cette réponse montre, c'est que cela peut être fait en shell, mais ne devrait probablement pas, à moins qu'il existe de bien meilleures méthodes shell. Au contraire, ce Q serait mieux fait avec gcc, ou python, etc.

agc
la source
-4

Les ulimits sont des propriétés de processus et sont hérités des processus enfants.

Vous ne pouvez pas obtenir les limites d'un autre processus.

schily
la source
2
Absurdité. man lsof, man ps...
Gilles de être le mal d'arrêt SO- '
1
Vous semblez mal comprendre comment fonctionne UNIX et comment lsof obtient ses résultats. lsof lit la mémoire du noyau pour obtenir des valeurs, il n'y a pas d'interface documentée utilisée par lsof, donc lsof échouera au cas où même des modifications mineures auraient été apportées aux structures de données internes du noyau.
schily
2
C'est un casse-tête pour le lsofresponsable, bien sûr. Mais pas pertinent pour l'utilisateur final. Également incorrect dans le contexte de cette question, car il s'agit spécifiquement de Linux, qui a des interfaces documentées ( man proc).
Gilles 'SO- arrête d'être méchant'
Vous parlez d'interfaces non documentées qui peuvent être modifiées sans préavis dans ce cas.
schily
1
Je ne peux pas dévaloriser cette cause de mon faible représentant, je vais donc commenter-1
Zun