Академический Документы
Профессиональный Документы
Культура Документы
La Trilogie Classique :
Dans un monde où tout est connecté, l'administrateur système doit pouvoir savoir ce qui se passe dans
ses machines à trois niveaux : le réseau bien sûr, mais aussi le disque et la mémoire. Voici quelques
explications sur les usages et les conclusions à en tirer.
La performance d'un système ne peut être réduite à la fréquence du processeur de la machine qu'il
exploite. Il faut également prendre en compte le système d'entrées/sorties et le réseau, le tout relié à
l'environnement général (d'où la notion de système eh eh) : applications utilisés, services ouverts, etc.
Dans la plupart des environnements Unix, iostat, vmstat et netstat sont les outils dédiés pour savoir ce
qui se passe sous le capot et choisir la bonne configuration pour le bon usage. Passons-les en revue
avec leurs différentes options et voyons comment on peut les relier aux autres composants du système
et prendre le cas échéant, les décisions qui s'imposent.
iostat
iostat est la concaténation de "input output statistics". Il s'appelle sous Linux sysstat et n'est pas installé
par défaut sur Ubuntu par exemple. Pas de problème, un petit :
Que ce soit sous ce vocable (iostat) ou un autre (sysstat), ce binaire fournit des informations à propos
de l'ensemble des périphériques d'entrée et sortie, à savoir : les disques (on suppose que vous en avez
plus d'un), le ou les terminaux, les autres périphériques série et bien sur, la mémoire. En fonction des
plates-formes, les options divergent mais l'esprit d'ensemble est le même. Nous allons nous concentrer
ici sur les données qui concernent les disques.
option – chaque système est bien évidemment différent, excusez la répétition (c'est tout le
charme du monde Unix) – un bon coup de manuel ne fera pas de mal, mais on peut voir
quelques exemples pratiques;
interval – c'est la période de temps entre chaque collecte d'information; iostat 5 fournira donc
des données toutes les cinq secondes; faisons quand même attention à ne pas donner un
intervale trop restreint qui surchargerait le système
count – c'est le nombre de prélèvements que l'on veut effectuer; iostat 5 4 par exemple donnera
donc des informations à 4 reprises espacées de 5 secondes; si aucun comptage n'est spécifié,
la commande envoie les infos jusqu'à la fin des temps (ou presque) ou jusqu'à un fatidique ^C;
en règle générale, l'on observe le rendu pendant quelques minutes durant des phases d'activité
particulière pour un prélèvement qui présente un intérêt dans la durée
Sans argument passé, iostat donnera un instantané de l'activité depuis le dernier reboot. Cette
information n'est cependant pas très utile.
Prenons l'exemple d'une commande iostat typique sur un système Solaris (en train de roupiller comme
vous pourrez le constater).
Les colonnes r/s, w/s, kr/s, et kw/s montrent respectivement les read et write par secondes en octets et
kilo-octets.
Sur Solaris, les colonnes importantes à observer sont : svc_t, wait %w et %b – plus le temps de
traitement est élevé, plus la performance s'en ressent bien évidemment. Couplés l'un à l'autre, le temps
de traitement et le temps d'occupation donnent une bonne impression sur l'état des entrées / sorties
d'un disque. Un taux d'occupation de plus de deux-tiers et un temps de traitement de plus de 50
millisecondes sont les indicateurs d'un goulot d'étranglement.
vmstat
vmstat effectue les rapports statistiques sur la mémoire virtuelle allouée aux processes, sur la mémoire
virtuelle en tant que telle et sur le ou les disques et l'activité du processeur. C'est un outil utile pour
comprendre comment les uns s'articulent par rapport aux autres au sein d'un même système. Sur les
multi-processeurs, vmstat rapporte en général une moyenne.
La syntaxe basique pour vmstat est : la commande suivie par l'option et l'intervale du temps avec le
nombre de fois que l'on souhaite répéter la commande (ça rappelle iostat de toute façon, c'est le même
principe derrière) :
options – on l'utilise pour une activité spécifique (un coup de man vmstat car là encore, les
implémentations diffèrent);
interval – c'est le temps entre deux prises d'instantané; trop peu de temps (< 5 sec) pas une
vision exacte de l'état de la mémoire car le résultat serait surchargé par la commande elle-
même;
count – c'est le nombre de répétitions
La première ligne de vmstat donne la moyenne obtenue depuis le reboot du système et peut donc être
ignorée pour des résultats que l'on souhaite obtenir pour un moment particulier. Sans l'option "count", la
commande produit des résultats continuels jusqu'à ce qu'on la termine avec un Ctrl + C par exemple.
On peut laisser ainsi filer pendant deux ou trois minutes en production à dix secondes d'intervalle et voir
comment ça tourne.
Sans aucune des options, vmstat affiche une ligne de résumé de la moyenne de l'activité de la mémoire
depuis le dernier boot. Voici un exemple avec Solaris, qui affiche des champs spécifiques :
example# vmstat 5
Les champs importants sont : procs r en run queue b bloqués pour des I/O, de la pagination, etc. w
swappé page (par seconde) re nombre de pages réclamées mf fautes mineures pi kilo-octets entrés en
pagination po kilo-octets sortis en pagination fr kilo-octets libérés de manque de mémoire anticipé à
court-terme (en kilo-octets)) sr pages scannées par un algorithme d'horloge cpu – c'est le pourcentage
du temps d'utilisation de la CPU, qui affiche une moyenne dans le cas de systèmes multi-processeurs.
Francis Kouassi Francis, Ingénieur Support CISCI Page 4
Voici un autre exemple avec AIX :
% vmstat 5 3
Pour diagnostiquer les problèmes liés à la CPU, on doit porter notre attention aux colonnes "proc" et
"cpu" (procs r). Sous Solaris, ça nous donne :
procs cpu
r b w us sy id
0 0 0 4 14 82
0 0 1 3 35 62
0 0 1 3 33 64
La sortie nous montre :
r : c'est le nombre moyen de threads du kernel qui sont prêts et en attente de traitement (ils
sont dits "runnable" en anglais);
b : c'est le nombre moyen de threads du kernel en attente de ressource et d'entrée/sortie durant
l'intervalle de l'échantillonnage effectué;
w : les processes idle et swappés;
us : le pourcentage de la CPU utilisé en mode utilisateur; cela signifie que le process n'utilise
pas de ressources du noyau;
sy : le pourcentage de temps CPU utilisé pour exécuter un process en mode système, donc
avec des appels systèmes pour accéder au kernel;
id : le pourcentage de temps durant lequel la CPU est inactive, c'est-à-dire qu'il n'y a pas de
threads disponibles pour l'exécution ou que la queue de traitement est vide; vmstat ne prend
pas en compte iowait lors du calcul de l'inactivité de la CPU, tandis que top et mpstat le font;
d'où les différences de sortie entre les commandes;
wa : le pourcentage de temps durant lequel la CPU est inactive et en attente d'opérations
provenant du ou des disques locaux et des disques montés en NFS.
r : cette valeur devrait être inférieure à 5 sur des systèmes à simple CPU; sur des SMP, elle
devrait être inférieure à 5 x (Ntotal - Nbind), où Ntotal est le nombre total de processeurs et
Nbind est le nombre de processeurs qui sont attachés à des processes;
si le nombre de processes dans la colonne "r" sous procs est constamment supérieure au
nombre de CPUs sur le système, alors cela ralentira le système car le nombre de processes
dépasse celui de CPUs disponibles;
si ce nombre est plus de quatre fois supérieures au nombre de CPUs disponibles dans le
système, alors on est face à un manque problématique de ressources en processeurs;
si le temps d'inactivité (cpu id) est constamment à 0 et le temps de CPU-système est (cpu sy)
est le double du temps CPU-utilisateur (cpu us), le système fait face à un manque de
ressources en processeurs.
En poussant le raisonnement, on gardera en mémoire les aspects suivants (en quelque sorte une liste
des choses à faire) :
vmstat permet également de collecter des informations sur la mémoire. On les trouve dans les colonnes
suivantes :
pi : il s'agit du nombre de pages depuis la mémoire virtuelle qui se trouve sur le disque;
po : le nombre de pages renvoyées dans l'espace de pagination; quand un processus se
termine normalement, l'espace de pagination qui lui était alloué est libéré;
fr : le nombre de pages libérées par seconde; il faut toujours un minimum de ressources
système pour libérer une page, même si le système d'entrée / sortie n'est pas en jeu;
sr : le "scan rate" (disons : taux de balayage) est le nombre de pages examinées par seconde
par l'algorithm de remplacement de page; sur des systèmes avec de multiples processes
utilisant beaucoup de pages différentes, le taux de balayage peut de loin dépasser le taux de
libération (fr);
de : sous Solaris, la colonne "de" représente le manque anticipé de mémoire en Ko qui est
utilisé par le système de balayage de pages pour faire face aux besoins.
collecter plus d'informations sur les processes qui utilisent le plus de mémoire et trouver les
raisons d'un tel comportement;
régler l'allocation de mémoire pour les instances du serveur d'applications Java et arrêter les
instances inutiles;
régler les applications et les serveurs pour une meilleure utilisation de la mémoire et des
caches;
augmenter la mémoire du système;
sous Solaris, on peut activer la pagination prioritaire en ajoutant la ligne "set priority paging=1"
dans /etc/system;
supprimer les processus zombies du système.
Voilà donc qui devrait donner du boulot à plus d'un sysadmin (eh eh...).
netstat
C'est un peu l'incontournable du réseau. En règle générale, on retrouve au moins trois ou quatre
options communes aux différents *nix. La syntaxe est la suivante :
#netstat intervalle
avec les options les plus significatives :
Commençon avec un peu de routage appliqué pour démarrer avec netstat. On utilise pour cela les
options r et n. En voici un exemple sous Solaris :
$netstat -rn
On peut toujours rétablir une route par défaut à la main. C'est la bien connue commande :
$route add default 192.168.0.1
par exemple à effectuer en mode super-utilisateur bien évidemment. Toujours aussi évidemment, on
vérifie sa câblerie (c'est même à effectuer en premier).
Sous OpenBSD ou tout autre *nix du même genre, on peut constater qu'il faut de toute façon ajouter la
route "à la main" (comprenez en script) lors d'une connexion PPPoA (Point to Point Protocol over ATM),
soit en réalité lors d'une connexion ADSL standard grand public. C'est valable pour n'importe quel FAI.
On commence donc avec un :
L'option "i" de netstat donne des indications précieuses sur la transmission des paquets et les collisions
de données sur les interfaces réseaux (toutes sont listées par défaut). C'est très utile quand on a par
exemple une solution GPRS / 3G et que vous vous apercevez que votre consommation semble élevée.
On scripte alors chacune de ses connexions, on fait le total et on voit que SFR (mais les autres doivent
adopter la même méthode), calcule les paquets de données non pas octet par octet mais directement
par palliers de dix octets. De quoi gratter ici et là du traffic.
$ netstat -i
Name Mtu Net/Dest Address Ipkts Ierrs Opkts Oerrs Collis Queue
lo0 8232 loopback localhost 77814 0 77814 0 0 0
hme0 1500 server1 server1 10658566 3 4832511 0 279257 0
Les valeurs importantes à noter sont :
Il y a bien évidemment pratiquement aucune collision dans un réseau avec un switch contrairement à
un réseau avec un hub. Mais un taux trop élevé de collisions doit attirer l'attention tout comme certains
rapports entre les différentes masses. Ainsi :
Passons à présent aux sockets avec l'option a. Il s'agit d'examiner tout particulièrement les états TCP
(et ils sont nombreux et significatifs), ce qui nous donne :
Voyons un exemple :
Trop de connexions avec un état FIN_WAIT ? Cela signifie généralement qu'il faut modifier le
paramétrage TCP/IP car les connexions ne sont pas terminées (en tout cas terminées proprement
d'après les séquences prévues) et des connexions inactives s'accumulent. Cela peut conduire à un
épuisement des ressources système. Le mieux est de contrôler le TCP "timeout" qui ferme au bout d'un
certain nombre de secondes une connexion inutilisée. Le pool peut ainsi être utilisé par de nouvelles
connexions.
On peut aussi prendre un autre cas qui montre une connexion en ssh toute simple vue depuis le
serveur :