Je veux calculer par programme [en C] le% d'utilisation du processeur pour un ID de processus donné sous Linux.
Comment pouvons-nous obtenir le% d'utilisation du processeur en temps réel pour un processus donné?
Pour être plus clair:
- Je devrais être en mesure de déterminer l'utilisation du processeur pour le processid ou le processus fourni.
- Le processus n'a pas besoin d'être le processus enfant.
- Je veux la solution en langage «C».
Réponses:
Vous devez analyser les données à partir de
/proc/<PID>/stat
. Voici les premiers champs (à partirDocumentation/filesystems/proc.txt
de la source de votre noyau):Vous êtes probablement après
utime
et / oustime
. Vous devrez également lire lacpu
ligne de/proc/stat
, qui ressemble à:Cela vous indique le temps processeur cumulé qui a été utilisé dans diverses catégories, en unités de jiffies. Vous devez prendre la somme des valeurs sur cette ligne pour obtenir une
time_total
mesure.Lisez à la fois
utime
etstime
pour le processus qui vous intéresse, et lisez àtime_total
partir de/proc/stat
. Ensuite, dormez pendant une seconde environ, et relisez-les tous. Vous pouvez maintenant calculer l'utilisation du processeur du processus sur la période d'échantillonnage, avec:Ça a du sens?
la source
/proc/stat
vous dire combien de jiffies le CPU a exécuté au total, et de/proc/<PID>/stat
vous dire combien de jiffies ont été exécutés par un processus unique.man proc
est votre ami (recherche de/proc/[pid]/stat
)/proc
pseudo-système de fichiers: l'enseignement des fonctions d'accès au système de fichiers C standard commefopen()
etscanf()
est hors de propos.getrusage () peut vous aider à déterminer l'utilisation du processus actuel ou de son enfant
Mise à jour: je ne me souviens pas d'une API. Mais tous les détails seront dans / proc / PID / stat, donc si nous pouvons l'analyser, nous pouvons obtenir le pourcentage.
EDIT: Étant donné que le pourcentage de CPU n'est pas simple à calculer, vous pouvez utiliser ici un type d'échantillonnage. 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 par cent. Vous obtiendrez l'utilisation de ce processus pendant une seconde.
(peut devenir plus complexe s'il y a de nombreux processeurs)
la source
Étape facile à suivre pour les débutants comme moi:
/proc/stat
pour obtenirtotal_cpu_usage1
./proc/pid/stat
où sepid
trouve le PID du processus dont vous souhaitez connaître l'utilisation du processeur, comme ceci:usertime
etsystemtime
et obtenirproc_times1
total_cpu_usage2
etproc_times2
La formule est:
Vous pouvez obtenir la quantité de CPU à partir de
/proc/cpuinfo
.la source
#include <unistd.h>
et appeler cette méthodeint nb = sysconf(_SC_NPROCESSORS_ONLN);
J'ai écrit deux petites fonctions 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
la source
Vous pouvez lire la page de manuel de proc pour plus de détails, mais en résumé, vous pouvez lire / proc / [nombre] / stat pour obtenir des informations sur un processus. Ceci est également utilisé par la commande «ps».
Tous les champs et leurs spécificateurs de format scanf sont documentés dans le manpag e proc .
Voici quelques-unes des informations de la page de manuel copiée (elle est assez longue):
la source
ps aux
c'est mieux :)Jetez un oeil à la commande "pidstat", sonne exactement ce dont vous avez besoin.
la source
C'est ma solution ...
la source
Lorsque vous souhaitez surveiller le processus spécifié, cela se fait généralement par script. Voici un exemple perl. Cela a mis les pourcentages de la même manière que top, le scalling à un CPU. Ensuite, lorsqu'un processus est actif fonctionnant avec 2 threads, l'utilisation du processeur peut être supérieure à 100%. Regardez en particulier comment les cœurs de processeur sont comptés: D puis laissez-moi vous montrer mon exemple:
J'espère que cela vous aidera dans tout suivi. Bien sûr, vous devriez utiliser scanf ou d'autres fonctions C pour convertir toutes les expressions rationnelles perl que j'ai utilisées en source C. Bien sûr, 1 seconde pour dormir n'est pas obligatoire. vous pouvez utiliser à tout moment. l'effet est que vous obtiendrez une charge moyenne sur une période de temps spécifiée. Quand vous l'utiliserez pour la surveillance, bien sûr les dernières valeurs que vous devriez mettre à l'extérieur. C'est nécessaire, car la surveillance appelle généralement des scripts périodiquement et le script doit terminer son travail dès que possible.
la source
Installez
psacct
ou créez unacct
package. Utilisez ensuite lasa
commande pour afficher le temps CPU utilisé pour diverses commandes. sa page de manuelUn joli howto du site nixCraft.
la source
Je pense qu'il vaut la peine de regarder le code source de la commande GNU "time". time Il affiche le temps CPU de l'utilisateur / système ainsi que le temps réel écoulé. Il appelle l'appel système wait3 / wait4 (si disponible) et sinon, il appelle l'appel système times. wait * l'appel système renvoie une variable struct "rusage" et fois l'appel système renvoie "tms". Vous pouvez également jeter un œil à l'appel système getrusage qui renvoie également des informations de synchronisation très intéressantes. temps
la source
Au lieu d'analyser cela à partir de proc, on peut utiliser des fonctions comme getrusage () ou clock_gettime () et calculer l'utilisation du processeur en tant que ratio ou heure et heure du processus / thread utilisé sur le processeur.
la source
Utiliser strace a révélé que l'utilisation du processeur doit être calculée par période:
la source