Généralités système Linux

Performance : CPU et load average avec vmstat et uptime

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

Introduction





Un système Unix est multi-tâches, cela signifie que plusieurs programmes peuvent s'exécuter en même temps sur la même machine.



En fait, les processus ne s'exécutent pas vraiment en même temps. Le noyau s'arrange pour partager le temps CPU entre les différents processus mais à un instant donné, seul l'un d'eux s'exécute pendant un tout petit laps de temps. Passé cet intervalle, le noyau va interrompre le processus en cours pour en exécuter un autre, et ainsi de suite. Cela signifie que sur une machine très chargée (avec beaucoup de processus), un processus va mettre plus de temps à s'exécuter car il devra attendre plus longtemps que le noyau lui donne la main.



[fieldset legend=Définition]Un processus est tout simplement un programme en train de s'exécuter. Un démon est un type un peu particulier de processus qui tourne en arrière plan, hors du contrôle direct d'un utilisateur et qui ne peut donc être arrêté par la commande ^C (ctrl+C). En général un démon est lancé au démarrage de la machine et il sert des requètes réseau (mais pas seulement), comme par exemple le démon apache qui répond aux requètes HTTP pour fournir des pages web. [/fieldset]





La commande vmstat





La commande vmstat, déjà vue pour analyser la consommation mémoire, permet de suivre en temps réel l'utilisation de la CPU :



Code BASH :
vmstat -w 1
procs ---------------memory-------------- ---swap-- -----io---- ---system---- ------cpu-----
 r  b     swpd     free     buff    cache   si   so    bi    bo   in   cs    us sy id wa st
11  0      100  1971044   552280  2662676    0    0     4     9   61    7     28 44 28  0  0
10  0      100  1975236   552288  2662672    0    0     8   208 42228 42912   83 12  5  0  0
11  0      100  1970044   552288  2662952    0    0     0     0 40678 42306   83 13  4  0  0
11  0      100  1971920   552296  2663204    0    0     0    20 43491 45130   84 13  4  0  0
11  0      100  1970408   552296  2663396    0    0     0     0 41032 45832   80 14  6  0  0
 




La colonne r indique le nombre de processus en attente d'exécution (r comme runqueue). Cette appellation un peu trompeuse désigne les processus prêts à s'exécuter mais aussi ceux qui sont en cours d'exécution (qui utilisent le processeur). Si le nombre de processus en attente d'exécution est constamment supérieur au nombre de processeurs de la machine, cela signifie que le système est chargé.

Dans mon exemple, la machine possède 8 CPU, et elle est en train de compiler, elle est donc chargée!

Est-ce que c'est critique ? Pas forcément ! Cela signifie juste que les processus doivent attendre leur tour pour s'exécuter. Savoir si cette charge est critique ou non va dépendre essentiellement de paramètres externes, tels que la qualité de service ou les délais de réponse souhaités.



Un deuxième indicateur de charge est fourni par la colonne us. Elle indique, en pourcentage, le temps passé par le système à exécuter des programmes applicatifs. (us comme USER Time, ou temps CPU utilisateur)

Dans mon exemple, on est aux alentours de 80%.



La colonne sy indique, en pourcentage, le temps passé par le système à exécuter des routines du noyau. Normalement, ces routines sont très rapides. Une valeur élevée peut donc être le signe d'un problème et demande des investigations supplémentaires. En général, cette valeur est plus faible que celle indiquée par la colonne us.



L'utilisation du processeur correspond donc à la somme des colonnes us et sy. Si cette valeur est constamment proche de 100, cela signifie que le processeur est très utilisé.



La colonne id indique la proportion de temps durant lequel le CPU est inutilisé (idle time). Si il y a un seul indicateur de charge à retenir, c'est peut-être celui-ci !



Les trois indicateurs précédents (us, sy et id) sont établis à partir d'une moyenne de l'ensemble des processeurs. Par exemple, sur une machine quadri-processeurs, si l'un de processeur est utilisé à 100%, le pourcentage d'utilisation indiqué par vmstat sera de 25%. Pour connaître exactement la consommation par processeur, il faut utiliser la commande mpstat.



Les colonnes in et cs portent sur l'activité du noyau. Ces valeur sont difficilement exploitables, on les ignore !





La commande uptime





La commande uptime indique la charge moyenne sur respectivement 1, 5 et 15 minutes. Par charge moyenne, on entend le nombre moyen de processus en attente d'exécution ou en sommeil :



Code BASH :
uptime
 
 21:16:47 up 795 days,  8:07,  2 users,  load average: 1.30, 1.99, 1.77




Dans l'exemple ci-dessus, cette charge est de respectivement 1.30, 1.99, 1.77.

Ces indicateurs sont en fait très utiles quand ils sont intégrés à un outil de supervision qui va les grapher en temps réel et enregistrer leur historique. Les variations de charge constitueront alors des indicateurs précieux de l'activité de la machine.



Globalement, on peut résumer la situation ainsi :

Entre 0 et X (où X représente le nombre de cœurs), on est en « sous-charge» (Il y a moins d'informations à traiter que ce que permet le CPU)

Charge = X (où X représente le nombre de cœurs), on est sollicité au mieux

Au delà de X (où X représente le nombre de cœurs), on est chargé (Il y a plus d'informations à traiter que ce que permet le CPU)



Analogie avec une voie de circulation, pour mieux comprendre :

Un processeur disposant d'un cœur est comme une seule voie de circulation.



Une charge de 0.5 par exemple :

load0



Une charge de 1 :

load1



Une charge de 1.5 :

load2



Alors, me direz-vous, la charge « idéale » pour un seul cœur est de 1, pour 8 cœurs : 8 ?



Et bien pas exactement. Il est préférable de ne pas dépasser 70% de cette valeur (0.7 pour 1, 5.6 pour 8), afin tout simplement de se garder une certaine marge de manœuvre en cas de surcharge ponctuelle.



:magic: