Performance et optimisation

vmstat : Surveillance système en temps réel

Table des matières

performance



Introduction



La commande vmstat permet de générer des rapports sur les statistiques de mémoire virtuelle et sur les informations sur les événements système telles que la charge CPU, la pagination, le nombre de changements de contexte, les interruptions de périphérique et les appels système. La commande vmstat permet également d'afficher les statistiques sur la permutation, la purge du cache et les interruptions.

Utilisation



Usage simple



Cette commande s'utilise simplement :
Code BASH :
vmstat


Ce qui produit ce type de retour :

Code TEXT :
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 9181216 215868 2993660    0    0  1650   463 6600    6  5  1 94  0  0


Le premier rapport produit donne les moyennes depuis le dernier redémarrage (notamment le cpu). Les rapports sur les processus et la mémoire sont quant à eux instantanés.

Les rapports supplémentaires donnent des informations sur une période d'échantillonnage de la durée du délai.


Afin d'afficher les informations à intervalle régulier, on pourra le spécifier. Sans autre information, le défilement est illimité. On pourra spécifier une deuxième valeur pour un nombre maximal de relevés.

Voici un exemple de 5 relevés avec une collecte toute les 1 seconde :
Code BASH :
vmstat 1 5


Voici le résultat produit :
Code :
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 8687764 343396 3150200    0    0  1300   429 6997    6  4  3 92  0  0
 2  0      0 8702416 343396 3150200    0    0     0     0 8049 9436  3  9 88  0  0
 4  0      0 8676232 343404 3153600    0    0     0    64 10548 12319  4 10 86  0  0
 3  0      0 8692444 343404 3153144    0    0     0     0 6719 7932  1  9 90  0  0
 2  0      0 8707364 343404 3140856    0    0     0     0 7490 9124  2  9 90  0  0


Apportons quelques explications sur les différentes parties :
procs
Statistiques sur les processus en cours d'exécution, en attente et bloqués :
  • r : La « runqueue » : file de thread prêt à être (ou déjà) en mode « run » - en attente de ressource cpu.
  • b : La « blocked queue » (ou wait queue) : nombre de thread en attente de ressource autre que la cpu. Ex : disque, mémoire, réseau, etc.


memory
Utilisation de la mémoire physique et virtuelle, y compris les statistiques de swapping :
  • swapd : Espace de swap utilisé
  • free : Mémoire disponible
  • buff : Mémoire utilisée en buffer
  • cache : Mémoire utilisée en cache


swap
Utilisation des espaces de swap :
  • si : « Swap In » : Mémoire déplacée du swap vers la RAM pour être utilisée par les processus actifs (dans l'intervalle)
  • so : « Swap Out » : Mémoire déplacée de la RAM vers le swap pour faire de la place pour d'autres données en RAM.


io
Statistiques sur les opérations d'entrée/sortie sur les périphériques :
  • bi : « Block In » : Lecture sur les périphériques blocs (disques durs) en KiB/s
  • bo : « Block Out » : Écriture sur les périphériques blocs (disques durs) en KiB/s


system
Utilisation du CPU par le noyau et par les processus :
  • in : « Interrupts » : Nombre d'interruptions générées par les périphériques d'E/S du système
  • cs : « Context Switches » : Nombre de changements de contexte par seconde


cpu
Utilisation du CPU :
  • us : « Temps Utilisateur » : Opérations lancées en mode utilisateur : les programmes applicatifs, calcul, etc.
  • sy : « Temps Système » : Opérations lancées en mode kernel : création de socket, ouverture de fichier, etc.
  • id : « Idle » : Temps où le processeur ne fait rien
  • wa : « Wait» : En attente de ressource (disque, réseau...)
  • st : « Steal Time » : Temps de CPU qui a été "volé" par des machines virtuelles sur le même hôte physique.
  • gu : « Guest Time » : Temps de CPU utilisé par des processus invités, tels que des machines virtuelles ou des conteneurs.


Quelques options utiles



Notez que plus les relevés sont nombreux, plus l'affichage peut partir en désordre.
Il est possible d'utiliser l'option -w qui permet d'afficher la sortie de façon moins condensée :

Code BASH :
vmstat -w 1 5


Depuis quelques années, l'option -t a fait son apparition et permet d'afficher la date et heure de la collecte :

Code BASH :
vmstat -t 1 5


Par défaut, lorsque les entêtes ne sont plus affichées à l'écran, celles-ci sont affichées à nouveau.
Si on utilise la commande vmstat à travers un script, on pourra éviter que ces entêtes se répètent avec l'option -n :

Code BASH :
vmstat -n 1 60


Interfaçage avec des scripts



Il est possible de collecter périodiquement en tâche de fond ces mesures via un script que voici :

Code BASH :
#!/bin/bash
DATE=`date +"%Y-%m-%d"`if [ ! -d /var/log/vmstat ]
then
  mkdir /var/log/vmstat
fi
/usr/bin/vmstat -n -t $1 $2 > /var/log/vmstat/vmstat.$DATE


Et placer la ligne suivante dans crontab pour l'exécuter tous les jours à minuit avec un relevé toute les 5 secondes :
Code BASH :
00 00 * * * /root/scripts/vmstat_recolte.sh  5  17280


Sortir les résultats en CSV



Pour exporter des résultats en CSV, on va générer les informations comme nous le souhaitons avec la commande vmstat, sans répéter les entêtes.

Voici un exemple avec 5 relevés à I seconde avec le timestamp :
Code BASH :
vmstat -t -n 1 5 > vmstat.txt


Ensuite, on pourra avec awk convertir le fichier en CSV facilement.

Si on veut les entêtes de colone (ici je récupère juste l'heure) :
Code BASH :
awk 'NR > 1 { print $1 "," $2 "," $3 "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "," $10 "," $11 "," $12 "," $13 "," $14 "," $15 "," $16 "," $17 "," $19 }' vmstat.txt > vmstat.csv


Si on ne veut que les valeurs (ici je récupère juste l'heure) :
Code BASH :
awk 'NR > 2 { print $1 "," $2 "," $3 "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "," $10 "," $11 "," $12 "," $13 "," $14 "," $15 "," $16 "," $17 "," $19 }' vmstat.txt > vmstat.csv



Astuces archivées



Ceci n'est plus valable car l'option -t a été ajoutée depuis la première rédaction de l'article.
Cependant, si vous manipulez sur d'anciens systèmes, vous pouvez utiliser cette astuce.


Si on souhaite avoir l'heure de chaque relevé, sous AIX, on peut utiliser l'option -t.

Sous Linux, elle n'est pas disponible.

On peut alors créer un script perl qui retourne l'heure :
Code PERL :
#!/usr/bin/perl
while (<>) {
        $time = qx(date "+%H:%M:%S");
        chomp($time);
        print $time . ": $_";
}


Et on appelle vmstat que l'on pipe dans le script précédemment créé :

Code BASH :
vmstat 1 5 | ./timestamp.pl


Ce qui donne ceci :
Code TEXT :
18:46:46: procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
18:46:46:  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
18:46:46:  4  1      0 8799148 346640 3134508    0    0  1085   397 7101    6  4  4 92  0  0
18:46:47:  2  0      0 8795564 346640 3139300    0    0  2960   296 6735 7750  1  9 90  0  0
18:46:48:  2  0      0 8800760 346656 3137236    0    0     0   540 7521 9739  1  9 90  0  0
18:46:49:  2  0      0 8813152 346680 3139300    0    0     0   508 7679 9329  2  9 89  0  0
18:46:50:  2  0      0 8816244 346688 3137252    0    0     0   152 6117 7180  1  9 90  0  0
Cette page a été vue 25200 fois