Performance et optimisation

vmstat : Surveillance système en temps réel

Cet article a été mis à jour, vous consultez ici une archive de cet article!


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.
Elle s'utilise simplement :
Code BASH :
adrien@oxygen ~ $ vmstat
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 450860 148752  79152 881524    0    0     0     1    0    1  9  7 83  1  0

Il est possible de passer des nombres en paramètres, de telle façon que
Code BASH :
vmstat $INTERVAL $NOMBRE

Voici un exemple concret de relevés toutes les 2 secondes, 5 fois :
Code BASH :
adrien@oxygen ~ $ vmstat 2 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0 450860 148752  79152 881524    0    0     0     1    0    1  9  7 83  1  0
 0  0 450860 148744  79152 881528    0    0     0     8  974 1995 12  5 83  0  0
 0  0 450860 148712  79152 881528    0    0     0     0  947 1884  9  8 83  0  0
 0  0 450860 148712  79152 881528    0    0     0     6  961 1985  9  7 84  0  0
 0  0 450860 148712  79152 881528    0    0     0   316  938 1899 11  6 82  1  0

Apportons quelques explications sur les différentes parties :
procs
Rapports sur les éléments suivants :
  • r : La « runqueue » : file de thread prêt à être (ou déjà) en mode « run » - en attente de ressource cpu. Appelée aussi la charge système générale (load average)
  • b : La « waitqueue » (notée b pour block) : nombre de thread en attente de ressource autre que la cpu. Ex : disque, mémoire, réseau, etc.


memory
Rapports sur l'utilisation de la mémoire :
  • swapd : Espace de swap utilisé
  • free : Mémoire disponible
  • buff : Mémoire utilisée en buffer
  • cache : Mémoire utilisée en cache


swap
Rapports sur l'utilisation de la swap :
  • si : « Swap In » : Mémoire déchargée du SWAP vers la RAM par seconde
  • so : « Swap Out » : Mémoire déchargée de la RAM vers la SWAP par seconde


io
Rapports sur l'utilisation du disque :
  • bi : « Block In » : Lecture sur les périphériques blocs (disques durs) en blocs/s
  • bo : « Block Out » : Écriture sur les périphériques blocs (disques durs) en blocs/s


cpu
Rapports sur l'utilisation du processeur :
  • 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...)


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 $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/batch/vmstat_recolte.sh  5  17280

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 bricoler :
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 :
Code BASH :
adrien@oxygen ~ $ vmstat 1 5 | ./timestamp.pl
11:21:19: procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
11:21:19:  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
11:21:19:  2  0 450860 142508  79864 888100    0    0     0     1    0    1  9  7 83  1  0
11:21:20:  0  0 450860 142828  79864 888100    0    0     0     0  982 1965 13  8 80  0  0
11:21:21:  0  0 450860 142852  79864 888096    0    0     0     8  962 1894 10  8 82  0  0
11:21:22:  0  0 450860 142852  79864 888096    0    0     0     0  906 1908 11  7 82  0  0
11:21:23:  0  0 450860 143100  79864 888096    0    0     0     0  982 1915  9  7 84  0  0