Gestion de la RAM sous Linux

décembre 31, 2012  |   Blog   |     |   Commentaires fermés sur Gestion de la RAM sous Linux

Introduction

La gestion de la mémoire sous Linux est souvent source de questions et d’inquiétudes. En effet, on se retrouve souvent avec un serveur utilisant 95% de sa mémoire vive. Le but de cet article sera donc d’expliquer les raisons de ce phénomène ainsi que donner quelques pistes afin de pouvoir vérifier si cette utilisation importante a un impact sur les performances de votre serveur.

Premièrement, nous allons faire un rapide tour d’horizon sur les différentes mémoires d’un serveur.
Tout d’abord nous avons la mémoire vive (RAM). Sa particularité est que, comme son nom l’indique, elle est très rapide (Bande passante moyenne : 12GB/s en DDR3).

En face de cette mémoire, nous avons la mémoire morte “ROM” (Disques). A l’inverse de la première, celle-ci est persistante après l’arret du PC mais est comparativement très lente (Maximum 600MB/s en SAS2.0, générallement 100MB/s en RAID).

Comparons donc les forces et la faiblesses de ces deux mémoires.

Avantages Inconvénient
RAM Très rapide (± 12GB/s) Non persitante après arrêt.Prix élévé (environ 10€/Go)

 

HDD Capacité élevé.Bon marché (environ 0,10€/Go) Lent (±100 MB/s)

 

Après ce rapide tour d’horizon des différentes mémoires, regardons comment elle est couramment distribuée dans un serveur.
De nos jours il est courant de monter des disques durs de 500Go ou 1To dans nos serveurs.
A coté de ceux-ci, nous trouvons généralement entre 8Go et 24Go de RAM.

Une pratique courante est alors de se dire que si on manque de RAM, on utilisera le disque dur (bien que plus lent) en secours. Cette méthode consistant à utiliser un espace défini du disque en plus de la mémoire vive s’appelle le “SWAP” (Générallement, autant de SWAP que de RAM). L’avantage du swap est que dans un premier temps, il evite le plantage complet du système. Cependant, le fait même qu’il entre en action ralenti considérablement ce même système.

En résumé, un serveur typique aurait donc :
– 2x 500Go de disque dur (dont 16Go alloué au SWAP)
– 16 Go de RAM

Le système de ce serveur va donc pouvoir charger en RAM toutes les informations dont le processeur aura besoin pour assurer le fonctionnement de ses applications. La logique voudrait que quand l’application à fini de s’executer, la mémoire RAM soit libérée pour laisser la place à d’autre applications. C’est sur ce point que Linux est différent dans sa façon de gérer sa mémoire.

La gestion sous Linux

Tout d’abord, de ces deux catégories, Linux en fait 4 :

– Mémoire Physique (Physical)
– Mégmoire Tampon (Buffers)
– Mémoire Cache (Cached)
– Mémoire Swap (Swap)


Commençons par décrire les deux plus simples : la mémoire physique et la mémoire swap. La première correspond simplement à la RAM installée et la seconde à l’espace provisionné sur les disques durs.

Ensuite, Linux apporte deux nouvelles notions : le tampon et le cache.

Comme nous l’avons vu précedemment, comparé à la RAM, un disque dur est environ 100x plus lent. C’est dans ce cadre qu’est utilisé la mémoire tampon. Linux place dans celle-ci toutes les données en attente d’écriture sur le disque, les données lues sur un disque conservées pour améliorer les performances du système (resultat d’un ‘ls’, droits sur les fichiers, …), la position des blocs libres sur les disques, …
En bref, toutes les informations utiles pour augmenter les performances du système dans ses interactions avec les périphériques tel que les disques durs.

A l’inverse, les données conservées en cache n’ont rien à voir avec les problèmatiques liées à la lenteur des disques durs et ce sont majoritairement ces données qui remplissent la mémoire vive.

Exemple :

$ free -mt
                        total       used       free     shared    buffers     cached
Mem:                     3043       2867        176          0        216       2257
-/+ buffers/cache:        392       2650
Swap:                     400          0        399
Total:                   3443       2867        575

Une petite explication de ce que le système conserve dedans s’impose. Dans cette mémoire cache, nous retrouvons :

– Les partitions montées en ram (tmpfs, ramfs, …)
– Les données d’application terminée
– Les données d’application non “vitales” à l’execution (contenu d’un fichier video par exemple en cours de lecture)
– Eventuellement la mémoire vive de machines virtuelles


Pour bien comprendre l’interet de garder/monter en mémoire cache des données peu ou plus utiles, il faut se dire que tout espace RAM non utilisé est gaspillé. Si besoin, Linux libérera une zone mémoire pour l’execution d’une autre application. Cependant, si une application se relance, une partie des informations sont déjà en mémoire.

Enfin, vous pourrez remarquer que Linux n’utilise pas forcément le swap comme mémoire de secours. En prenant en compte la problèmatique que ce type de mémoire est lent, il peut être interessant de stocker des données en swap qui ne sont pas accédées souvent. C’est pourquoi vous trouverez souvent quelques Mo d’utilisation de swap sur votre système.

Voilà pour ce rapide tour d’horizon sur la gestion de la mémoire sous Linux. En somme, ce qu’il faut retenir :

– Linux évite le gaspillage de mémoire, c’est pour ca que l’utilisation est souvent élevée
– Le SWAP ne sert pas forcement en dernier recours
– La mémoire tampon sert à accelerer/grouper/anticiper les accès aux disques durs
– La mémoire cache est globalement de la conservation de confort et peut-être libérée
– Une machine utilisant fortement le SWAP voit ses performances fortement dégradées

 

Vérifier que tout va bien

Tout d’abord, nous allons vérifier que le système détecte bien toute la mémoire.

La commande “free” va nous être utile avec les options :

  • -m : Affiche la mémoire en Mo
  • -t : Affiche une ligne “Total”
$ free -mt
                        total       used       free     shared    buffers     cached
Mem:                     3043       2866        176          0        217       2259
-/+ buffers/cache:        390       2652
Swap:                     400          0        399
Total:                   3443       2866        576

Ici notre serveur a 3Go de RAM, donc tout va bien. Cependant, on voit que la quantité de RAM disponible est de 176 Mo et que le cache utilise 2259Mo sur ces 3Go. Avec les explications de la partie précédente, plus d’inquiétudes. On voit même que free affiche une ligne “-/+ buffers/cache:”.
Grâce à cette ligne, nous avons exactement les informations que nous voulons. Dans notre cas, sur les 3043 Mo de RAM, seulement 390 Mo sont réelement utilisés et 2652Mo peuvent être disponibles, soit une grande partie du cache.

Pour le swap, nous voyons ici qu’il y a 0Mo d’utilisé (sans l’option “m” on constate que 112ko sont utilisés). La raison en est sans doute les 2,6 Go de RAM libre disponible.

Si toutefois vous êtes toujours inquiet pour l’utilisation du Swap, vous pouvez verifier à l’aide de la commande “vmstat x” son utilisation : (1 = une nouvelle ligne par seconde.)

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
3  0    112 165332 222912 2314288    0    0     1     2    1    1  5  1 94  0
0  0    112 178396 222912 2314292    0    0     0     0   90  363  3  1 96  0
7  0    112 170840 222916 2314304    0    0     0   724   78  346  5  6 89  0
2  0    112 163664 222916 2314356    0    0     0     0   87  399 23  4 73  0

Les chiffres en gras correspondent aux colonnes “si” et “so” pour “Swap In” et “Swap Out”. Si ces chiffres sont proches de 0, votre serveur n’utilise pas son swap de façon importante.

Enfin, si malgré toutes ces explications vous vouliez quand même libérer votre mémoire, vous pouvez toujours le demander au système avec la commande :

$ sync; echo x > /proc/sys/vm/drop_caches

Le sync permet de s’assurer que toutes les informations en mémoire en attente d’écriture soient bien répercutées sur le disque.

Ensuite, remplacez le x par  :

1 => Libère la mémoire des données en cache
2 => Libère la mémoire des données en tampon
3 => Libère la mémoire des données cache et tampon

Les commentaires sont fermés.