101 votes

Comment calculer l'utilisation du CPU d'un processus par PID sous Linux à partir de C ?

Je veux calculer de manière programmatique [en C] le pourcentage d'utilisation du CPU pour un ID de processus donné sous Linux.

Comment obtenir le % d'utilisation du CPU en temps réel pour un processus donné ?

Pour que ce soit encore plus clair :

  • Je devrais être capable de déterminer l'utilisation du CPU pour le processid ou le processus fourni.
  • Le processus ne doit pas nécessairement être le processus enfant.
  • Je veux la solution en langage 'C'.

0 votes

Qu'en est-il de la capture (grep-ing) de la sortie de top.

0 votes

Ce n'est vraiment pas la meilleure façon d'être efficace;y

0 votes

Il faudra probablement un appel système "coûteux" pour lancer "top".

164voto

caf Points 114951

Vous devez analyser les données de /proc/<PID>/stat . Ce sont les premiers champs (de Documentation/filesystems/proc.txt dans les sources de votre noyau) :

Table 1-3: Contents of the stat files (as of 2.6.22-rc3)
..............................................................................
 Field          Content
  pid           process id
  tcomm         filename of the executable
  state         state (R is running, S is sleeping, D is sleeping in an
                uninterruptible wait, Z is zombie, T is traced or stopped)
  ppid          process id of the parent process
  pgrp          pgrp of the process
  sid           session id
  tty_nr        tty the process uses
  tty_pgrp      pgrp of the tty
  flags         task flags
  min_flt       number of minor faults
  cmin_flt      number of minor faults with child's
  maj_flt       number of major faults
  cmaj_flt      number of major faults with child's
  utime         user mode jiffies
  stime         kernel mode jiffies
  cutime        user mode jiffies with child's
  cstime        kernel mode jiffies with child's

Vous êtes probablement après utime et/ou stime . Vous devrez également lire le cpu ligne de /proc/stat qui ressemble à ça :

cpu  192369 7119 480152 122044337 14142 9937 26747 0 0

Cela vous indique le temps cumulé du processeur qui a été utilisé dans diverses catégories, en unités de jiffies. Vous devez prendre la somme des valeurs de cette ligne pour obtenir une valeur de 1 million d'euros. time_total mesure.

Lire les deux utime y stime pour le processus qui vous intéresse, et lire time_total de /proc/stat . Puis dormez pendant une seconde ou deux, et relisez-les tous. Vous pouvez maintenant calculer l'utilisation du CPU du processus pendant le temps d'échantillonnage, avec :

user_util = 100 * (utime_after - utime_before) / (time_total_after - time_total_before);
sys_util = 100 * (stime_after - stime_before) / (time_total_after - time_total_before);

C'est logique ?

0 votes

@caf - Je suis vraiment un novice dans ce domaine... désolé de ne pas pouvoir comprendre ce que vous dites ....

14 votes

Un "jiffy" est une unité de temps CPU. Ce à quoi il correspond exactement en temps d'horloge murale dépend de l'architecture et de la façon dont votre noyau est configuré, mais l'important est que /proc/stat vous indique combien de jiffies le CPU a exécuté au total, et /proc/<PID>/stat vous indique combien de jiffies ont été exécutés par un seul processus.

0 votes

@caf - J'essaie d'apprendre les trucs de jiffy en attendant, pouvez-vous écrire un petit code où vous calculez l'utilisation du CPU d'un processus ?

11voto

vpram86 Points 3063

getrusage() peut vous aider à déterminer l'utilisation du processus actuel ou de ses enfants.

Mise à jour : Je ne me souviens pas d'une API. Mais tous les détails seront dans /proc/ PID /stat, donc si nous pouvions le parser, nous pourrions obtenir le pourcentage.

EDITAR: Comme le pourcentage de CPU n'est pas facile à calculer, vous pouvez utiliser un échantillonnage ici. Lisez ctime et utime pour un PID à un moment donné et relisez les mêmes valeurs après 1 seconde. Trouvez la différence et divisez-la par cent. Vous obtiendrez l'utilisation de ce processus pour la dernière seconde.

(peut devenir plus complexe s'il y a beaucoup de processeurs)

2 votes

Comment l'appel système getrusage() m'aide-t-il à calculer l'utilisation du CPU d'un processus ?

0 votes

@codingfreak. J'ai mal compris la question. Maintenant que tu l'as mise à jour, c'est clair.

1 votes

@Aviator CPU % = (processusertime + processkerneltime)/(CPUusertime+CPUkerneltime) Comment puis-je obtenir les valeurs pour "processusertime" et ainsi de suite. ? ?? Je vois différentes valeurs dans le fichier "/proc/PID/stat". Alors lequel correspond à quelle valeur ?

8voto

zizzu Points 31

Un pas à pas facile pour les débutants comme moi :

  1. Lisez la première ligne de /proc/stat pour obtenir total_cpu_usage1 .

    sscanf(line,"%*s %llu %llu %llu %llu",&user,&nice,&system,&idle);
    total_cpu_usage1 = user + nice + system + idle;
  2. Lire /proc/pid/statpid est le PID du processus dont vous voulez connaître l'utilisation du CPU, comme ceci :

    sscanf(line,
    "%*d %*s %*c %*d" //pid,command,state,ppid
    
    "%*d %*d %*d %*d %*u %*lu %*lu %*lu %*lu"
    
    "%lu %lu" //usertime,systemtime
    
    "%*ld %*ld %*ld %*ld %*ld %*ld %*llu"
    
    "%*lu", //virtual memory size in bytes
    ....)
  3. Somme actuelle usertime y systemtime et obtenir proc_times1

  4. Maintenant, attendez 1 seconde ou plus

  5. Refaites-le, et obtenez total_cpu_usage2 y proc_times2

La formule est la suivante :

(number of processors) * (proc_times2 - proc_times1) * 100 / (float) (total_cpu_usage2 - total_cpu_usage1)

Vous pouvez obtenir le nombre de CPU à partir de /proc/cpuinfo .

4 votes

Votre solution est bonne mais pour obtenir le nombre de CPUs, faites plus simple. Incluez ce type #include <unistd.h> et appeler cette méthode int nb = sysconf(_SC_NPROCESSORS_ONLN);

4 votes

Je ne comprends pas pourquoi multiplier par le (nombre de processeurs), en supposant que delta(proc_times) est pour le cœur sur lequel il a été exécuté. Sans multiplier par le facteur ou les processeurs, cela devrait être correct.

6voto

fho Points 128

J'ai écrit deux petites fonctions en C basées sur la réponse de cafs pour calculer l'utilisation du processeur utilisateur+noyau d'un processus : https://github.com/fho/code_snippets/blob/master/c/getusage.c

0 votes

Il y a t-il une version compilée de celui-ci car il me donne une erreur lors de la compilation et aussi comment puis-je l'utiliser ?

0 votes

Il n'a pas de fonction main(), ce n'est donc pas un programme "autonome" que vous pouvez compiler et exécuter. Vous devriez écrire une fonction main() qui fait certaines choses avec les fonctions de getusage.c.

0 votes

Ce n'est pas vraiment utiliser des fonctions C. On utilise juste un langage arbitraire pour analyser la sortie des commandes.

4voto

Andre Miller Points 6713

Vous pouvez lire le Page de manuel pour proc pour plus de détails, mais en résumé, vous pouvez lire /proc/[numéro]/stat pour obtenir des informations sur un processus. Cette commande est également utilisée par la commande 'ps'.

Tous les champs et leurs spécificateurs de format scanf sont documentés dans le fichier proc manpag e.

Voici quelques informations tirées du page d'accueil copié (il est assez long) :

          pid %d The process ID.

          comm %s
                 The  filename of the executable, in parentheses.  This is
                 visible whether or not the executable is swapped out.

          state %c
                 One character from the string "RSDZTW" where  R  is  runâ
                 ning,  S is sleeping in an interruptible wait, D is waitâ
                 ing in uninterruptible disk sleep,  Z  is  zombie,  T  is
                 traced or stopped (on a signal), and W is paging.

          ppid %d
                 The PID of the parent.

          pgrp %d
                 The process group ID of the process.

          session %d
                 The session ID of the process.

          tty_nr %d
                 The tty the process uses.

          tpgid %d
                 The  process group ID of the process which currently owns
                 the tty that the process is connected to.

0 votes

"Utilisation du CPU" et "état actuel" sont comme la localisation et la vitesse. Si vous connaissez l'un, vous ne pouvez pas connaître l'autre. L'utilisation du CPU dépend de la durée, vous devez donc vérifier vous-même combien de fois votre processus est dans l'état "R".

0 votes

Hmm, bonne question, j'ai toujours supposé que ce serait là ! Vous devriez probablement être en mesure de le calculer à partir de ces variables.

0 votes

Si vous vérifiez la sortie de la commande top, vous pouvez voir l'utilisation du CPU .... mais je ne suis pas intéressé par la recherche dans la sortie de top pour calculer l'utilisation du CPU ......

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X