La somme de tous les PID «utime» est-elle l'utilité totale du système?

9

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 utimede 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:

Stefano Palazzo
la source
/proc/cputimene 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.
Gilles 'SO- arrête d'être méchant'
1
Votre «temps utilisateur» devrait également ajouter les valeurs de temps de tous les processus morts. Comment en tenez-vous compte?
Gilles 'SO- arrête d'être méchant'
Mhh. Ce que j'appelle "heure du processeur système" n'est que la première valeur de / proc / uptime, "secondes système". J'aurais pensé que c'était trop élevé, car il compte également les threads du noyau, mais comme vous pouvez le voir, la somme de toutes les valeurs "utime" est toujours supérieure à l'heure système de / proc / utime. Pour autant que je sache, votre lien explique pourquoi. Mais pour être clair: je ne suis pas vraiment intéressé par ce nombre. Je m'intéresse au "temps processeur par utilisateur".
Stefano Palazzo le
Quant au deuxième commentaire: Pour le moment, je comptais mesurer cela périodiquement (disons chaque seconde), ce qui ignorerait les processus de courte durée.
Stefano Palazzo
Ainsi, le calcul du temps de votre processeur système est ($ 1- $ 2 / $ number_of_cups) où $ 1 et $ 2 sont les valeurs de /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.
Gilles 'SO- arrête d'être méchant'

Réponses:

3

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 lastcommpour 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 beaucoup 0.00). Exécutez sapour afficher diverses sommes et statistiques. En particulier, sa -maffiche les totaux par utilisateur. Les statistiques accumulées par saexé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/uptimesemble 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 .

Gilles 'SO- arrête d'être méchant'
la source
Qu'en est-il des processus très longs? Est -ce que d' saattendre le processus de quitter avant de signaler qu'il est temps cpu?
Stefano Palazzo
@StefanoPalazzo Oui, les données comptables sont écrites à la fin d'un processus. Cela signifie également que vous n'obtenez aucune donnée pour les processus qui s'exécutaient après un crash système, à ma connaissance.
Gilles 'SO- arrête d'être méchant'
C'est un problème - cela signifie que je ne peux pas l'utiliser, car nous aurons beaucoup de processus de longue durée.
Stefano Palazzo