Quel est le moyen le plus juste de surveiller le temps processeur total - par utilisateur?

23

Sur un système multi-utilisateurs, je souhaite mesurer l’utilisation du processeur de chaque utilisateur en quelques secondes de temps processeur. Pour les besoins de cette mesure, je suppose que si un PID appartient à un utilisateur, cet utilisateur provoque le temps processeur - c'est-à-dire que j'ignore les démons et le noyau.

Je le fais actuellement toutes les cinq secondes:

  1. Obtenez chaque utilisateur et les PID exécutés via ps aux
  2. Pour chaque PID, obtenez x , la somme de utime , cutime, stime et cstime de /proc/[pid]/stat
  3. calculer t = x / interval (l'intervalle n'est pas toujours exactement 5 secondes lorsqu'il y a une charge élevée)

Si je lance ceci, j'obtiens des valeurs sensibles. Par exemple: un utilisateur sur ce système tournait en python ( while True: pass ) et le système affichait un temps de traitement CPU par seconde d'environ 750 millisecondes. Lorsque le système a été suspendu un peu, il a signalé 1600 ms pour un inverval d'une seconde. Ce qui semble aller de soi, mais je comprends que ces valeurs peuvent être trompeuses, surtout si je ne les comprends pas vraiment.

Donc ma question est la suivante:

Quelle est la manière juste et correcte de mesurer la charge du processeur par utilisateur?

La méthode doit être assez précise. Il pourrait y avoir plusieurs centaines d'utilisateurs sur ce système, donc l'extraction de pourcentages de ps aux ne serait pas assez précise, en particulier pour les threads éphémères que beaucoup de logiciels aiment générer.

Bien que cela puisse être compliqué, je sais absolument que c'est possible. C'était mon point de départ:

  

Le noyau garde la trace de l’heure de création d’un processus ainsi que du temps processeur qu’il consomme pendant sa durée de vie. À chaque tick d'horloge, le noyau met à jour le temps écoulé en jiffs que le processus en cours a passé dans le système et en mode utilisateur. - ( le projet de documentation Linux )

La valeur que je recherche ensuite est la quantité de secondes (ou jiffies) qu’un utilisateur a dépensé pour le processeur, et non un pourcentage de la charge du système ou de l’utilisation du processeur.

Il est important de mesurer le temps processeur pendant que les processus sont toujours en cours d'exécution. Certains processus ne dureront qu'une demi-seconde, d'autres dureront plusieurs mois - et nous avons besoin d'attraper les deux sortes, de sorte que nous puissions prendre en compte le temps CPU des utilisateurs avec une granularité fine.

    
posée Stefano Palazzo 24.02.2012 - 23:51
la source

4 réponses

11

On dirait que vous avez besoin de la comptabilité des processus.

lien

Sous Ubuntu, les outils de comptabilisation des processus se trouvent dans le package acct

Pour obtenir un rapport par utilisateur, exécutez

sa -m
    
réponse donnée Alan Bell 25.02.2012 - 01:40
la source
2

Une des réponses les plus évidentes est de simplement prolonger ce que vous faites actuellement.

Je suis tombé sur ce processus de surveillance pour utiliser le script bash et mysql pour suivre le temps processeur des utilisateurs, mais il s’agissait d’un temps beaucoup plus long que celui dont vous parliez.

J'espère que cela peut vous donner plus d'idées sur la direction que vous cherchez à prendre.

lien

    
réponse donnée Linztm 05.03.2012 - 16:23
la source
1

Cela donnera une ligne pour chaque utilisateur affichant le nom d'utilisateur et son temps total de processeur:

ps -w -e --no-header -o uid,user \
        | sort -u \
        | while read uid user; do
                echo -e "$user\t"$(
                        ps --no-headers -u $uid --cumulative -o time \
                                | sed -e s/:/*3600+/ -e s/:/*60+/ \
                                | paste -sd+ \
                                | bc
                );
        done
    
réponse donnée Marques Johansson 10.04.2015 - 23:09
la source
0

Cela va également gérer les processus qui ont été exécutés pendant des jours .. pas sûr de savoir comment développer pendant des semaines / mois / années ..

ps -w -e --no-header -o uid,user \
    | sort -u \
    | while read uid user; do
            echo -e "$user\t"$(
                    ps --no-headers -u $uid --cumulative -o time \
                          | sed -e s/-/*86400+/ -e s/:/*3600+/ -e s/:/*60+/ 
                          | paste -sd+ \
                          | bc
            );
    done
    
réponse donnée Patrik Arlos 16.05.2017 - 14:52
la source

Lire d'autres questions sur les étiquettes