Récupérer l’utilisation CPU d’un processus sous Linux
Sommaire
I. Utilisation CPU d'un processus donné
A des fins de supervision ou de debuggage, il est très pratique sur un système Linux de savoir récupérer le taux d’utilisation CPU d’un processus particulier. Il est déjà courant de superviser l’utilisation globale du CPU sur une machine mais savoir combien un processus donné (et ses processus enfants) consomment de temps CPU peut également être utile. Il existe plusieurs « écoles » pour récupérer cette valeur, on peut en effet vouloir récupérer l’utilisation du CPU par un processus à l’instant T et à la seconde où on le souhaite ou alors récupérer une valeur que l’on peut appeler « lissée » c'est-à-dire qui va représenter une moyenne d’utilisation du CPU sur sa durée de vie totale. Nous allons ici voir les deux méthodes qui sont toutes deux correctes mais qui peuvent répondre à des cas et des contextes différents.
Note : Dans ce tutoriel nous aborderons la récupération de cette information de façon statique en vue de l’intégration de la valeur dans un script, une réponse SNMP ou un outil de métrologie par exemple.
II. Utilisation CPU à l’instant T en ligne de commande avec top
La commande de supervision « top » qui est présente par défaut sur la plupart des systèmes va ici nous être d’une grande utilité. En temps normal, la commande « top » est utilisée de façon dynamique, on voit à son lancement un tableau avec des valeurs qui changent dynamiquement en fonction des activités de chacun des processus :
On va ici chercher à utiliser top de manière statique, plus précisément on va demander à top de nous afficher les valeurs qu’il permet de capturer sur une durée de une seconde, ce qui permettra d’avoir un affichage non dynamique. On utilisera également l’option « -b » qui permet une mise en forme correcte de la sortie (surtout dans le cas de lignes et colonnes multiples). Cela peut se faire via l’option suivante de la commande « top » :
top –n1 –b
Sur cette sortie nous allons trier ce que l’on souhaite récupérer en fonction du nom du processus recherché, si l’on souhaite par exemple avoir la consommation CPU de "mysql" :
top –n1 –b |grep mysql
On va ensuite chercher à récupérer uniquement la valeur des colonnes indiquant la consommation CPU de chaque processus et sous processus, on utilisera pour cela la commande « cut » à laquelle nous indiquerons la fourchette de caractère à récupérer sur chaque ligne :
top –n1 –b |grep mysql |cut –c42-46
Cette fourchette de caractère dans la ligne (ici du caractère 42 à 46) peut être à adapter selon votre cas (la longueur du nom du processus précisé principalement 😉 ). Avec cela, on pourra ensuite dans le cas où nous avons plusieurs lignes (des sous processus), additionner les différentes valeurs. On va également remplacer les virgules par des points sinon "bc" ne souhaitera pas traiter les valeurs :
top –n1 –b |grep mysql | cut –c42-46 |paste –sd+ |sed 's/,/\./g' |bc
Note : Si la commande bc pose problème, c’est qu’il faut que vous l’installiez (apt-get install bc ou yum install bc). Il s’agit d’une commande permettant d’additionner plusieurs valeurs.
La commande paste est particulièrement intéressante ici, elle permet de mettre à la suite les plusieurs lignes que l’on récupère (juste les chiffres de la colonne « CPU » dans notre cas), l’option « -s » permet ce traitement, l’option « -d » permet ensuite d’indiquer un séparateur qui sera ici « + », ce qui nous donnera au final une opération :
Celle-ci sera dans la suite de la commande fournie à « bc » qui pourra alors effectuer l’addition en question.
III. Utilisation CPU moyen en ligne de commande avec ps
La deuxième méthode permettant de récupérer l’utilisation CPU d’un processus donné et de ses sous processus est l’utilisation de la commande « ps ». Dans sa page « man », l’outil « ps » émet l’indication suivante :
"cpu utilization of the process in "##.#" format. Currently, it is the CPU time used divided by the time the process has been running (cputime/realtime ratio), expressed as a percentage"
L’utilisation CPU indiquée est donc le temps durant lequel le processus a utilisé le CPU depuis sa création, il s’agit donc d’une métrique différente que celle que nous venons de voir avec top, tant pour sa valeur que sa signification. Nous allons ici utiliser l’option « -C » de ps pour spécifier le processus voulu ainsi que l’option « -o %cpu » pour spécifier que nous souhaitons uniquement la valeur du CPU :
ps –C mysql –o %cpu
Sur cette sortie, nous allons couper la première ligne qui contient le nom de la colonne, ce qui peut être gênant dans le cadre d’un script par exemple :
ps –C mysql –O %cpu | sed "1 d"
On va ensuite utiliser les mêmes techniques de calcul que pour la commande « top » afin d’obtenir la somme totale des sous processus (s'il y en a) du processus maître souhaité :
ps –C mysql –O %cpu | sed "1 d" | paste -sd+ | bc
IV. Traitement sur les valeurs de sortie, virgules, points, arrondis
Certains outils de supervision ou certains contextes d’utilisation supportent mal la présence de points ou de virgules dans l’output donné. Nous allons donc voir quelques techniques pour remplacer les points par de virgules et inversement et également pour arrondir la valeur récupérée à l’entier inférieur afin de simplifier la sortie. La sortie par défaut sera présente avec un point s’il s’agit d’une décimal :
top -n1 -b | grep mysql | cut -c43-45 | paste -sd+ | bc | sed –e ‘s/\./,/g’
Couper ce qu’il y a après le point si besoin avec "cut" :
top -n1 -b | grep mysql | cut -c43-45 | paste -sd+ | bc | cut -d "." -f1
Bonjour,
concernant cette ligne « à adapter »
=> top –n1 –b |grep mysql |cut –c42-46
remplace-la par : top –n1 –b |grep mysql |awk ‘{print $10}’
ca aura le mérite de fontionner pour tous le monde ! et quelque soit le nom du processus
de la même facon, pourquoi intaller un utilitaire « bc » supplémentaire alors qu’on peut très bien s’en sortir sans.
surtout, si comme moi, vous n’aimez pas intaller « n’importe quoi » sur les machines :
float TotCpu=0
$ -# for i in `top -n1 -b |grep natural |awk ‘{print $10}’`
> do
> let TotCpu+=$i
> done
=> Sur une de mes machines :
echo $TotCpu=16.6
Comme d’habitude, pas de standard, du coup les commandes ne fonctionnent pas, Debian 12 GNU/Linux.
PID=778523[00:37:36]ludovic@LibraZiK:~> top –n1 –b|grep firefox
top: option « –n1 » inconnue
PID=778523[01:00:55]ludovic@LibraZiK:~> ps –C mysql –o %cpu
erreur: option crasse
Usage:
ps [options]
Essayez ‘ps –aide ‘
ou ‘ps –aide
‘pour plus d’aide.
Pour plus de détails, consultez ps(1).PID=778523[01:01:38]ludovic@LibraZiK:~> top –n1 –b |grep mysql |awk ‘{print $10}’
top: option « –n1 » inconnue
awk: ligne de commande:1: ‘{print
awk: ligne de commande:1: ^ caractère incorrect « � » dans l’expression
PID=778523[01:02:26]ludovic@LibraZiK:~>