Afin de mesurer le temps CPU total d'un utilisateur, j'utilise le champ "utime" parmi /proc/[pid]/stat
:
utime %lu Amount of time that this process has been scheduled in user
mode, measured in clock ticks (divide by
sysconf(_SC_CLK_TCK). This includes guest time, guest_time
(time spent running a virtual CPU, see below), so that
applications that are not aware of the guest time field do
not lose that time from their calculations.
(de l' homme proc (5) )
Donc, mon "temps utilisateur" est la somme utime
de tous les PID que cet utilisateur exécute.
J'espère que cela me donnera une valeur précise pour le nombre de secondes CPU que cet utilisateur a passé. Suis-je sur la bonne voie?
Certaines des choses que je ne comprends pas ou ne prennent pas encore en compte:
- Chaque PID a également un PID parent (ou zéro). Mais je compte chaque PID, pas seulement ceux avec un ppid de 0. Est-ce correct?
- Il existe, en plus d'utime, stime, cutime et cstime. Dois-je m'en préoccuper? Je suppose que utime est le nombre total de secondes cpu pour un PID, sans compter le parent.
Si je calcule le temps processeur total du système en utilisant /proc/uptime
, cette valeur est assez proche de ma somme pour tous les utilisateurs, mais la différence est significative. Par exemple (en minutes):
system cpu_time: 96.13
sum of users_cputime: 111.45
Correction:
J'obtiens des valeurs "d'apparence raisonnable" pour toutes sortes de choses. Pour le moment, j'utilise la somme de utime, stime, cutime et cstime. Et il rapporte des valeurs qui, bien que je ne les comprenne pas, correspondent très bien aux mesures de time
.
Si je suis complètement sur la mauvaise voie, il y a une autre question:
- Quelle est la façon la plus équitable de surveiller le temps CPU total - par utilisateur? (+500 Bounty) sur Ask Ubuntu
/proc/cputime
ne dispose d'aucune information sur le temps passé par les processeurs à exécuter les processus, je suis donc perplexe quant au calcul de votre «système cpu_time». Si vous faites quelque chose avec le deuxième nombre, c'est le temps passé par la tâche inactive ; Je ne sais pas exactement ce que cela signifie dans la pratique./proc/uptime
? Ensuite, je suppose que les E / S attribuées à la tâche inactive expliqueraient la différence. Je ne sais rien du sujet, donc je soupçonne que je manque quelque chose de majeur: je ne m'attendrais pas à ce qu'il se passe autant de choses dans la tâche inactive, surtout si l'on considère que votre somme d'utilisateurs cputime manque probablement de beaucoup de court- processus vécus.Réponses:
La façon traditionnelle de consigner et de suivre le temps processeur de l'utilisateur est la comptabilité des processus . Sous Linux, installez les utilitaires de comptabilité GNU , généralement fournis par un package appelé
acct
. Je ne sais pas à quel point il sera précis pour garder une trace du temps passé dans des processus de très courte durée, mais il énumérera au moins tous les processus jamais exécutés.Exécutez
lastcomm
pour obtenir une liste de toutes les commandes exécutées par n'importe quel utilisateur et le temps passé dans chacun (arrondi à ~ 10 ms pour les processus de courte durée, attendez-vous à en voir beaucoup0.00
). Exécutezsa
pour afficher diverses sommes et statistiques. En particulier,sa -m
affiche les totaux par utilisateur. Les statistiques accumulées parsa
exécution à partir de la dernière rotation des journaux comptables (généralement situés dans/var/log/account/
).Notez que vous n'allez pas intercepter tous les processus en échantillonnant à intervalles, pas de loin. Vous manquerez presque tous les processus de courte durée et les dernières secondes de longs processus. La comptabilité des processus répertorie tous les processus passés.
Dans
/proc/$pid/stat
, le temps utilisateur est le temps consacré au calcul, par opposition au temps système consacré aux E / S. Lequel compter dépend de ce que vous voulez faire avec les informations.Compter tous les PID est correct. Je ne sais pas ce que le PID parent a à voir avec cela.
Côté système, votre description
/proc/uptime
semble erronée. Wikipedia a raison quand j'écris. Le premier champ est le temps réel écoulé depuis le démarrage du système, moins le temps passé en suspension ou en hibernation. Le deuxième champ est le temps cumulé passé dans la tâche inactive sur tous les CPU. Je ne sais pas vraiment ce que cela signifie; ce n'est certainement pas le temps d'inactivité total sur ma machine. Dans le noyau, la valeur est additionnée àuptime_proc_show
partir de variables mises àaccount_idle_time
jour dans .la source
sa
attendre le processus de quitter avant de signaler qu'il est temps cpu?