Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/04/2010, à 14:48

Skippy le Grand Gourou

Connaître la consommation CPU d'un processus particulier

Plop les gens,

Actuellement, à part top, il n'y a pas d'outil GNU/Linux pour trouver directement la consommation CPU d'un processus « en temps réel », en tout cas distribué par défaut. Mais top c'est pas top parce que ça ne montre que la consommation des processus les plus gourmands, et c'est une interface (n?)curses, qui la rend chiante à parser.

Pour ceux qui en ont besoin (et vu google, il y a l'air d'y en avoir…), voici donc un petit script sans prétention qui permet de s'en charger :

#!/bin/bash

if [ -z $1 ]
then
	echo "Usage : $0 pid"
fi

PID=$1;

consumption=(0 0 0);

while true
do
	if [ ! -e /proc/$PID/stat ]
	then
		echo "No such process."
		break
	fi
	consumption=(`awk '$1=="cpu" { cputot = $2+$3+$4+$5; } $1=='$PID' { cpupid = $14+$15+$16+$17; } END {printf "%d %d %.2f\n", cpupid, cputot, (cpupid-'${consumption[0]}')/(cputot-'${consumption[1]}')*100; }' /proc/stat /proc/$PID/stat`);
	sleep 1
	echo ${consumption[2]}
done

Le même en une ligne de commande :

PID=XXX; consumption=(0 0 0); while true; do if [ ! -e /proc/$PID/stat ]; then echo "No such process."; break; fi; consumption=(`awk '$1=="cpu" { cputot = $2+$3+$4+$5; } $1=='$PID' { cpupid = $14+$15+$16+$17; } END {printf "%d %d %.2f\n", cpupid, cputot, (cpupid-'${consumption[0]}')/(cputot-'${consumption[1]}')*100; }' /proc/stat /proc/$PID/stat`); sleep 1; echo ${consumption[2]}; done

(ne pas oublier de remplacer XXX par le PID du processus).

Quelques avertissements :
- le script ne prend pas en compte les cas où il y a plusieurs processeurs (prend le total, en fait, je crois) ;
- le script ne prend pas en compte iowait, irq, softirq, volée et guest (respectivement les champs 6 à 10 de la ligne « cpu » de /proc/stat, cf man proc), et je sais pas si c'est un bien ou un mal et j'ai la flemme de chercher (tout commentaire à ce sujet serait le bienvenu) ;
- le script confond utime, stime, cutime et cstime (cf man proc) : modifiez la définition de cpupid si vous voulez pinailler (ce sont respectivement les champs 14, 15, 16 et 17).

Quelques liens :
- un script similaire, entièrement en bash (mon idée de départ était de pouvoir le faire en une ligne de commande pour faire un alias plutôt qu'un script, donc ce script ne me satisfaisait pas, mais finalement je vois pas comment faire un alias de la ligne en question, donc retour au script…) ;
- des questions et des réponses plus ou moins intéressantes sur le sujet.

Edit : Pour rappel, pour trouver le PID d'un processus le plus simple est la commande pgrep, notamment avec les options -lf (par exemple « pgrep -lf fire » pour trouver firefox, cf man pgrep).

Dernière modification par Skippy le Grand Gourou (Le 17/04/2010, à 15:05)

Hors ligne

#2 Le 17/04/2010, à 15:35

credenhill

Re : Connaître la consommation CPU d'un processus particulier

hello

Skippy le Grand Gourou a écrit :

et c'est une interface (n?)curses, qui la rend chiante à parser

utiliser top en mode batch -b
-d 2 toute les 2 secs, -n 1000 boucler 1000 fois, -p PID seulement PID

top -bn 1
top -bd 2 -n 1000 -p PID

Hors ligne

#3 Le 17/04/2010, à 16:04

Skippy le Grand Gourou

Re : Connaître la consommation CPU d'un processus particulier

Ah ben oui, bizarre que cette réponse ne soit jamais donnée à ceux qui cherchent comment faire… roll

Merci. smile

Hors ligne