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:
- Obtenez chaque utilisateur et les PID exécutés 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 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.