Sur un système multi-utilisateur, je veux mesurer l'utilisation du processeur de chaque utilisateur en quelques secondes de temps processeur. Aux fins 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 fais cela, toutes les cinq secondes:
- Obtenez chaque utilisateur et les PID qu'ils utilisent via
ps aux
- Pour chaque PID, obtenez
x
la somme de utime, cutime, stime et cstime de/proc/[pid]/stat
- calculer
t = x / interval
(l'intervalle n'est pas toujours exactement 5 secondes en cas de charge élevée)
Si je lance cela, j'obtiens des valeurs sensé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 bloqué un peu, il a signalé 1 600 ms pour une inversion d'une seconde. Ce qui semble juste, mais je comprends que ces valeurs peuvent être trompeuses, d'autant plus que je ne les comprends pas vraiment .
Voici donc ma question:
Quelle est une façon juste et correcte de mesurer la charge CPU par utilisateur?
La méthode doit être assez précise. Il peut y avoir plusieurs centaines d'utilisateurs sur ce système, donc extraire des pourcentages ne ps aux
sera pas assez précis, en particulier pour les threads de courte durée que de nombreux logiciels aiment faire apparaître.
Bien que cela puisse être compliqué, je sais absolument que c'est possible. C'était mon point de départ:
Le noyau garde une trace du temps de création des processus ainsi que du temps CPU qu'il consomme pendant sa durée de vie. A chaque horloge, le noyau met à jour le temps en jiffies que le processus actuel a passé en système et en mode utilisateur. - (du projet de documentation Linux )
La valeur que je recherche est le nombre de secondes (ou de jiffies) qu'un utilisateur a passé sur le CPU, 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 dureront qu'une demi-seconde, d'autres dureront plusieurs mois - et nous devons intercepter les deux types, afin de pouvoir tenir compte du temps CPU des utilisateurs avec une granularité fine.
top
peut faire le mode batch? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'
devrait montrer la charge pour {user} à ce moment.