Généralités système Linux

Performance : Mémoire avec free et vmstat

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

Introduction



Quand un système Unix manque de mémoire, cela a des conséquences souvent catastrophiques : l'ensemble du système se met à fonctionner au ralenti jusqu'à la paralysie complète de la machine ! Le manque de mémoire est donc un problème majeur à traiter sans délai. Il faut donc avant tout être capable de repérer ce phénomène.


La commande free



Pour mesurer la consommation de la mémoire, il existe plusieurs commandes, chacune avec sa spécificité. La commande free fournit des informations détaillées sur la façon dont la mémoire est consommée :

Code BASH :
free -m
 
             total       used       free     shared    buffers     cached
Mem:          7865       4992       2872        295        334       2281
-/+ buffers/cache:       2375       5489
Swap:         8188          0       8188
 


La première ligne indique la consommation de la mémoire physique, c'est à dire celle fournie par les barrettes de mémoire :
Code BASH :
             total       used       free     shared    buffers     cached
Mem:          7865       4992       2872        295        334       2281
 


  • total indique la quantité de mémoire physique totale.
  • used indique la quantité de mémoire physique consommée par le système dans son ensemble.
  • free indique la quantité de mémoire physique inutilisée.
  • shared est obsolète et doit être ignoré.
  • buffers et cached renseignent sur la mémoire utilisée pour (essentiellement) optimiser les performances du système. Cette mémoire peut être rendue disponible à tout moment.


Dans l'exemple ci-dessus, le système dispose en tout de 7865 Mo de mémoire. Sur ce total, 4992 Mo sont utilisés et 2872 Mo sont inutilisés. A première vue, près de 5Go de mémoire sont utilisés, soit plus de 50%. Pourtant, ça n'est pas du tout le cas. Attention à ne pas confondre mémoire inutilisée et mémoire disponible !
Le système consomme un maximum de mémoire pour optimiser au mieux ses performances via l'utilisation de caches, et il n'y a donc que très peu de mémoire inutilisée (colonne free).
Mais la mémoire utilisée par les caches (colonnes buffers et cached) peut être libérée à tout moment.

La deuxième ligne indique la quantité de mémoire réellement consommée par les applications (colonne used) et la mémoire réellement disponible (colonne free) :

Code BASH :
-/+ buffers/cache:       2375       5489


En cessant d'utiliser les caches, le système ne consommerait donc plus que 2375 Mo de mémoire alors que 5489 Mo seraient disponibles. Finalement, ce serveur a encore beaucoup de mémoire disponible en réserve !

A quoi servent les buffers / cached ?

Lire un fichier, le modifier, écrire dedans... toutes ces actions ont des répercutions importantes sur les performances du système car les accès disques sont très lents comparés aux accès en mémoire. Pour minimiser les accès disques en lecture et en écriture, le noyau conserve en mémoire aussi longtemps que possible les informations lues ou écrites. Travailler sur une copie en mémoire est alors très rapide. Mais attention au crash ! Pour ne pas perdre l'ensemble de ces données en cas de panne du système, elles sont écrites sur le disque à intervalle régulier (généralement 5 secondes).


La dernière ligne indique la consommation de mémoire swap :

Code BASH :
Swap:         8188          0       8188


Le swap est une partition particulière du disque dur utilisée par le noyau pour étendre la mémoire physique. Ce besoin découle de la différence entre le prix de la mémoire qui est beaucoup plus cher que celui des disques. Pourquoi dans ce cas ne pas se servir du disque comme si c'était de la mémoire physique ? C'est exactement le rôle du swap qui permet d'étendre considérablement la mémoire utilisable par le système. En revanche les accès disques étant beaucoup plus lents, cet espace ne sera utilisé qu'en cas d’extrême nécessité, quand la mémoire physique est épuisée.

Quand le système se met à utiliser son swap (on dit alors qu'il "swappe"), les conséquences sur les performances globales du système sont très visibles car celui-ci est alors considérablement ralenti. Le swap doit donc essentiellement être vu comme une mémoire de secours, à utiliser le moins possible. Dans l'exemple ci-dessus, la colonne used avec une valeur de 0 indique que le swap n'est pas utilisé, ce qui est plutôt rassurant pour cette machine.

Notez que certains noyau utilisent une petite portion du swap pour y entreposer de façon temporaire des informations. Cela n'a rien d'alarmant tant que cette consommation est modérée et qu'il reste suffisamment de mémoire physique de libre.


La commande vmstat



La commande vmstat permet de suivre en temps réel l'utilisation de la mémoire :

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
 2  0        8  2938616   343704  2351364    0    0    22    15  318  393  5  2 93  0  0
 1  0        8  2938608   343704  2351364    0    0     0     0 4205 10462  4  2 94  0  0
 0  0        8  2933060   343704  2351412    0    0     0   888 4366 10795  5  2 93  0  0
 2  0        8  2934372   343704  2351364    0    0     0     0 4220 9886  4  2 94  0  0
 0  0        8  2933572   343704  2351364    0    0     0     0 4327 9998  4  3 93  0  0
 2  0        8  2932856   343704  2351364    0    0     0     0 4165 9886  4  3 94  0  0


Dans l'exemple ci-dessus, une nouvelle ligne de rapport est affichée par vmstat toutes les secondes (le 1 ). le paramètre -w permet d'élargir les colonnes pour éviter un décalage des informations avec de grandes valeurs.

La première ligne de rapport ne fournit que des informations statistiques et doit être ignorée. Les lignes suivantes fournissent en revanche de très nombreuses informations relatives notamment à la consommation de CPU et de mémoire. Nous n'examinerons ici que les informations relatives à cette dernière.

Les colonnes free, buff et cache sont très importantes car ce sont elles qui nous renseignent sur la mémoire physique encore disponible (en kilo-octets). La colonne free indique la quantité de mémoire inutilisée, les colonnes buff et cache indiquent les quantités utilisées par les buffers et le cache. Comme les buffers et le cache sont libérables à tout moment, la mémoire réellement disponible correspond à la somme de ces trois indicateurs.

La colonne swpd montre la quantité de swap utilisée. Dans le cas présent, les 8 Ko utilisés n'ont rien d'alarmant car la mémoire physique disponible est encore très importante et cette consommation n'est donc pas liée à une quelconque pénurie. Elle sert juste au noyau à entreposer temporairement quelques informations.

Les deux colonnes suivantes, si et so, nous fournissent de très précieux renseignements quant à la santé du système. Nous avons vu plus haut qu'en cas de pénurie de mémoire physique, le noyau pioche dans le swap. En fait, le swap n'est pas utilisé exactement comme de la mémoire physique mais plutôt comme un entrepôt intermédiaire.

Quand le noyau souhaite utiliser une information en swap, il doit d'abord la transférer en RAM. Ce type de transferts est signalé par la colonne si (swap in memory).
Mais... n'avons nous pas dit qu'il n'y avait plus assez de RAM libre ? Exactement, et c'est pourquoi le noyau doit d'abord faire un peu de place en transférant des informations de la RAM vers le swap. Ces transferts sont signalés par la colonne so (swap out of memory).
La présence de ces transferts est un indicateur fort de la pénurie de mémoire physique.
Un système qui utilise son swap passe son temps à faire de nombreux allers et retours entre le disque et la RAM. C'est donc un système aux performances très dégradées!


Que faire si il n'y a plus assez de mémoire ?



La pénurie de mémoire sur un serveur est rapidement dramatique en termes de performances. L'utilisation de l'espace de swap n'est qu'une solution de secours pour continuer d'assurer le fonctionnement du système et l’empêcher de crasher directement. Mais son utilisation est en soi un problème majeur. Autrement dit, votre serveur est en danger et il est temps d'agir !

Il y a en général deux raisons qui peuvent expliquer cette pénurie de mémoire :

  • La quantité de mémoire du serveur a été sous-dimensionnée en vue de son utilisation courante.
  • Un processus est victime d'un memory leak (fuite de mémoire) .
  • Un processus gourmand en mémoire a été lancé sur une machine bien chargée .


Le premier cas concerne une machine dont le fonctionnement ne comporte pas d'anomalie notable, elle manque juste de mémoire. Dans ce cas là, il est rare que le fonctionnement soit complètement ralenti, il faudra juste planifier une intervention afin de rajouter de la mémoire.

Le second problème concerne un processus qui se met à consommer de façon anormale toute la mémoire. Un memory leak (fuite de mémoire) se rapporte au fonctionnement d'un processus qui consomme de la mémoire sans jamais la rendre au système. Il s'agit en général d'un bug (une erreur de programmation) qui doit à terme être corrigé par une mise à jour du programme ou du package. Le graphe d'utilisation de la mémoire du serveur permet de mettre facilement en évidence l'existence de ce genre de bogue. Ces graphes ont un aspect en "dent de scie" avec une consommation mémoire qui augmente linéairement jusqu'à épuisement complet de celle-ci.
Il n'y a en général qu'une seule chose à faire : arrêter le processus fautif et le relancer. Toutefois, il s'agit juste d'une action à très court terme qui ne peut que temporairement soulager la machine.

Dans le troisième cas, il faut arrêter ce processus lancé, et veiller à vérifier la mémoire avant de lancer de programmes trop gourmands (Cas typique d'une machine virtuelle lancée).