Récupérer l’utilisation CPU d’un processus sous Linux

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 :

CPUCHECK01
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

Résultat:CPUCHECK02

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

CPUCHECK05

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 :

CPUCHECK04
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

CPUCHECK06

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"

CPUCHECK07

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

CPUCHECK08

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
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Mickael Dorigny

Fondateur d'IT-Connect.fr et d'Information-security.fr. Auditeur sécurité chez Amossys.

    mickael has 478 posts and counting.See all posts by mickael

    Une pensée sur “Récupérer l’utilisation CPU d’un processus sous Linux

    • 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

      Répondre

    Laisser un commentaire

    Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

     

    Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.