Performance : CPU et load average avec vmstat et uptime
Table des matières
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, déjà vue pour analyser la consommation mémoire, permet de suivre en temps réel l'utilisation de la CPU :
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 colonnes in et cs portent sur l'activité du noyau. Ces valeur sont difficilement exploitables, on les ignore !
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 :
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 :
Une charge de 1 :
Une charge de 1.5 :
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.
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 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 :
Une charge de 1 :
Une charge de 1.5 :
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.