web-dev-qa-db-fra.com

Quel est le moyen le plus équitable de surveiller le temps total de calcul - par utilisateur?

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

Actuellement, je le fais toutes les cinq secondes:

  1. Obtenez chaque utilisateur et les PID qu'ils exécutent via ps aux
  2. Pour chaque PID, obtenez x, la somme de time, 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 recherchées. Par exemple: Un utilisateur de ce système tournait en python (while True: pass) et le système affichait environ 750 millisecondes de temps processeur par seconde. Lorsque le système s'est arrêté pendant un instant, il a signalé 1 600 ms pour un inverval d'une seconde. Ce qui semble à peu près correct, mais je comprends que ces valeurs peuvent être trompeuses, surtout si je ne les comprends pas .

Voici donc ma question:

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

La méthode doit être assez précise. Il peut y avoir plusieurs centaines d'utilisateurs sur ce système, donc l'extraction des pourcentages de ps aux ne sera pas assez précise, en particulier pour les threads éphémères que de nombreux 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 trace du temps de création d'un processus ainsi que du temps CPU qu'il utilise au cours de sa vie. A chaque créneau horaire, le noyau met à jour la quantité de temps que le processus en cours a passé en mode système et en mode utilisateur. de --- (le projet de documentation Linux )

La valeur que je suis après correspond au nombre de secondes (ou de 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 CPU pendant que les processus sont toujours en cours d'exécution. Certains processus ne durent qu'une demi-seconde, certains durent plusieurs mois. Nous devons capturer les deux types afin de pouvoir comptabiliser le temps de calcul des utilisateurs avec une granularité fine.

25
Stefano Palazzo

On dirait que vous avez besoin d'une comptabilité de processus.

http://www.faqs.org/docs/Linux-mini/Process-Accounting.html

Sur Ubuntu, les outils de comptabilité des processus sont dans le acct packageInstall acct

Pour obtenir un rapport par utilisateur, exécutez

sa -m
11
Alan Bell

Cela donnera une ligne pour chaque utilisateur indiquant le nom d'utilisateur et leur temps total de calcul:

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
2
Marques Johansson

Une des réponses les plus évidentes consiste simplement à étendre ce que vous faites actuellement.

Je suis tombé sur ce processus de moniteur pour utiliser les scripts bash et mysql pour suivre le temps processeur des utilisateurs, mais il s’étalait sur une période beaucoup plus longue que celle dont vous parlez.

J'espère que cela vous donnera plus d'idées sur la direction que vous souhaitez prendre.

http://www.dba-Oracle.com/t_Oracle_unix_linux_vmstat_capture.htm

2
Linztm

Cela permettra également de gérer les processus qui ont fonctionné pendant des jours .. vous ne savez pas 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
0
Patrik Arlos