# [FAQ] Pourquoi n'y a-t-il plus de RAM libre?

## ghoti

S'il est bien un sujet qui ne manque pas de préoccuper les newbies transfuges de chez-qui-on-sait, c'est bien la question de la quantité de mémoire libre !

N'a-t-on pas rabâché depuis 20 ans qu'un système bien configuré devait occuper le moins de mémoire possible ?

Et voila qu'on se retrouve sous Linux, avec une mémoire RAM tellement bourrée qu'elle en paraît prête à exploser !

Dans un post récent, l'honorable Sleeper a fourni un lien vers un article en anglais dans lequel sapphirecat fait le tour de la question.

Pour enfoncer encore un peu le clou, il m'a semblé qu'une traduction française de cet excellent article s'imposait !

Malheureusement, je suis loin d'être un pro de la traduction. Alors, si vous avez des corrections ou des améliorations à suggérer, n'hésitez pas !

=======================================================================================

Traduction de l'article https://forums.gentoo.org/viewtopic.php?t=175419 (Auteur : sapphirecat)

Gestion Mémoire sous Linux ou 'Pourquoi n'y a-t-il plus de RAM libre?'

Révision 2

Sections

Aperçu de la gestion mémoire

La limite mystérieuse des 800 Mo sur x86

Les différences entre VIRT, RES et SHR dans la sortie de la commande top

La différence entre les tampons et le cache

Permutabilité ("swappiness" - noyau 2.6)

1. Aperçu de la gestion mémoire

lorsqu'un système a fonctionné pendant un moment, les outils traditionnels comme 'top' rapportent souvent une quantité étonnamment faible de mémoire libre. Par exemple, après environ 3 heures, la machine sur laquelle j'écris ceci affiche moins de 60 Mo de mémoire libre, bien que je dispose de 512 Mo sur ce système. Mais où est donc passée toute cette mémoire ?  

La plus grosse partie est utilisée par le cache disque, lequel occupe pour l'instant aux alentours de 290 Mo. 

'top' affiche cette quantité sous la colonne "cached". La mémoire utilisée pour le cache est essentiellement libre, en ce sens qu'elle peut être récupérée rapidement si un programme en cours (ou qu'on vient de lancer) en a besoin.

La raison pour laquelle Linux utilise autant de mémoire pour le cache disque est que la RAM non utilisée est tout simplement gaspillée. Conserver des données dans le cache signifie que si quelque-chose réclame à nouveau des données déjà utilisées, il y a de bonnes chances qu'elles seront toujours présentes dans le cache.

Récupérer l'information à partir du cache est environ 1.000 fois plus rapide que les lire depuis le disque dur.

Si l'information n'est pas dans le cache, il faudra de toutes façons lire le disque dur mais dans ce cas, il n'y a aucune perte de temps.

Pour avoir une meilleure estimation de la quantité de mémoire réellement libre pour les applications, exécutez la commande :

```
free -m
```

L'option -m signifie megabytes et la sortie devrait ressembler à quelque-chose comme ceci :

```
             total       used       free     shared    buffers     cached

Mem:           503        451         52          0         14        293

-/+ buffers/cache:        143        360

Swap:         1027          0       1027
```

La ligne "-/+ buffers/cache" montre les quantités de mémoire libre et utilisée, vues par les applications.

De manière générale, tant que le swap est peu utilisé, l'utilisation de la mémoire n'a aucune incidence sur les performances.  

Remarquez que j'ai 512 Mo dans ma machine mais que la commande free n'en affiche que 503 de disponible. Cela résulte essentiellement du fait que le noyau ne peut pas être "swapé" et donc, que la mémoire qu'il occupe ne sera jamais disponible.

Il peut aussi y avoir quelques régions réservée pour/par le matériel à des fins diverses, selon l'architecture du système.

2. La mystérieuse limite des 800 Mo sur x86

Le noyau Linux tourne par défaut dans - et ne gère que - la partie basse de la mémoire. Cela simplifie un peu la gestion de la table des pages, ce qui accélère légèrement les accès mémoire. L'inconvénient, c'est que le noyau ne peut alors pas utiliser toute la mémoire lorsque la RAM totale se situe au voisinage de 800 Mo. Dans le passé, ce n'était pas un problème, surtout sur les machines de bureau.  

Pour pouvoir utiliser la mémoire en totalité sur les machines disposant de 1 Go et plus, le noyau a besoin d'être recompilé avec des options spécifiques. Pour cela, lancez 'make menuconfig' (ou votre *config préféré) et choisissez les options suivantes :

```
Processor Type and Features ---->

High Memory Support ---->

(X) 4GB
```

C'est applicable aussi bien pour les noyaux 2.4 que 2.6.

Il faut noter que l'activation de la mémoire supérieure ralentit légèrement les accès et la conviction actuelle voudrait que pour une RAM d'exactement 1 Go, il vaut mieux laisser la mémoire supérieure désactivée et sacrifier l'espace au profit de la vitesse.

Les corrections et commentaires à propos de cette section sont les bienvenus étant donné que je n'ai pas suffisament de RAM pour tester et vérifier cette information moi-même.

3. Les différences entre VIRT, RES et SHR dans la sortie de la commande top

VIRT représente la taille virtuelle d'un processus, c'est-à-dire la somme de la mémoire qu'il utilise réellement, la mémoire qu'il a référencée pour lui (par exemple, la RAM de la carte video pour le serveur X), les fichiers sur disque qu'il référence pour son usage (surtout des bibliothèques partagées) ainsi que la mémoire partagée avec d'autres processus.

VIRT représente la quantité de mémoire à laquelle le programme est capable d'accéder à l'instant présent. 

RES représente la taille résidente, qui est une représentation précise de la quantité réelle de mémoire physique consommée par un processus. (Cela correspond aussi directement à la colonne %MEM). D'un point de vue virtuel, ce chiffre sera toujours inférieur à la taille VIRT étant donné que la plupart des programmes dépendent de la bibliothèque C.

SHR indique quelle quantité de la taille VIRT est réellement partagée (mémoire ou bibliothèques). Dans le cas des bibliothèques, cela ne signifie pas nécessairement que la totalité de la bibliothèque est résidente. Par exemple, si un programmpe n'utilise qu'un petit nombre de fonctions d'une bibliothèque, la totalité de la bibliothèque sera référencée et prise en compte dans VIRT et SHR mais seules les portions de la bibliothèque contenant les fonctions utilisées seront réellement chargées et comptées dans RES.

4. La différence entre les tampons et le cache

Les tampons sont directement associés à un périphérique bloc spécifique et couvrent le cache des métadonnées du système de fichier ainsi que le mouvement des pages.

Le cache n'enregistre que des données de fichiers.

Autrement dit, les tampons se rappellent ce qui se trouve dans les répertoires, quelles sont les permissions des fichiers et retiennent quelles sont les portions de mémoire en cours d'écriture ou de lecture pour un périphérique bloc donné. Le cache, quant à lui n'est occupé que par le contenu des fichiers eux-mêmes.

Les corrections et ajouts à cette section sont les bienvenus; Pour arriver à ces conclusions, j'ai dû faire quelques suppositions basées sur le pistage de la manière dont /proc/meminfo est produit.

5. Permutabilité ("swappiness" - noyau 2.6) (*)

Depuis le 2.6, il existe un moyen d'influencer la manière dont Linux favorise les permutations ("swapping") vers le disque plutôt que la réduction des caches lorsque la mémoire arrive à saturation. 

La permutabilité ("swappiness") prend une valeur comprise entre 0 et 100 pour modifier une heuristique grossière concernant le moment de permuter des processus et quand libérer des pages du cache.

Au niveau 100, le noyau préférera toujours chercher des pages inactives pour les envoyer vers le swap; dans d'autres cas, la permutation vers le swap dépendra de la quantité de mémoire applicative utilisée et du niveau d'inefficacité du cache à trouver et libérer des éléments inactifs.  

La permutabilité par défaut est 60. Une valeur 0 donne quelque-chose d'assez proche de l'ancien comportement dans lequel les applications requérant de la mémoire pouvaient réduire le cache à une fraction minuscule de la RAM. Pour les laptops, on recommande une valeur de 20 car il est préférable de les laisser arrêter leur disque.  

Comme un "sysctl", le "swappiness peut être modifié à la volée avec une de ces deux commandes :

```
# sysctl -w vm.swappiness=30

# echo 30 >/proc/sys/vm/swappiness
```

Sous Gentoo, la valeur par défaut appliquée lors du boot peut également être définie dans /etc/sysctl.conf :

```
# Control how much the kernel should favor swapping out applications (0-100)

vm.swappiness = 30
```

Certains patches permettent au noyau de régler automatiquement la permutabilité comme il l'estime utile : ils peuvent ne pas tenir compte d'une valeur fixée par l'utilisateur.

=======================================================================================

Commentaires suite aux remarques des participants du forum french

(*) SWAPPINESS (Remarque de Leander256) - 05/06/2004

Lorsqu'une application réclame de la mémoire alors que toute la RAM est occupée, le noyau dispose de deux "réservoirs de secours" : ou bien, il peut réduire le "cache disque" dans la RAM en éliminant les données les plus anciennes, ou bien il peut transférer des portions (pages) de programme  les moins utilisés vers la partition "swap" sur le disque.

Il est difficile de prévoir quelle sera la méthode la plus efficace.

Surtout à cause de la loi de Murphy ("loi de la tartine beurrée"  :Wink:  ) qui prétend que c'est toujours la partie qu'on vient d'éliminer dont on aura besoin l'instant d'après !  :Laughing: 

Le noyau fait son choix en calculant assez grossièrement l'efficacité probable de chacune des deux méthodes à un instant donné.

Par exemple, il peut se dire que dans les dernières minutes, un programme a beaucoup utilisé les données du cache mais qu'un autre programme dort depuis pas mal de temps. Il est donc assez légitime de supposer que la situation ne changera pas dans les prochains instants. Il vaut donc mieux mettre le programme "dormant" dans le swap pour garder les données "vivantes" dans la RAM plus rapide.

A l'inverse, il se pourrait que les programmes soient très actifs mais qu'ils manipulent très peu de données. Il est alors plus efficace de garder les programmes en mémoire et d'éliminer les vieilles données qui ne semblent plus utilisées.

Avant le noyau 2.6, l'utilisateur n'avait aucune possibilité d'influencer ce calcul et des situations pouvaient se présenter pour lesquelles le noyau faisait souvent le mauvais choix. Or, un mauvais choix entraîne une activité très importante depuis le disque ce qui se traduit par une diminution considérable des performances.

Depuis le 2.6, l'utilisateur dispose d'une variable lui permettant de forcer à tout instant le degré de préférence que le noyau devra utiliser pour son choix. La variable s'appelle "swappiness" que j'ai maladroitement traduite par "permutabilité" et qui fait référence au degré avec lequel le noyau aura tendance à choisir la solution de permuter ("swapper") les pages de programme vers la partition d'échange ("swap") plutôt que de réduire le cache disque de la RAM.

15/06/2004 : 

Légère adaptation du titre de la section 5, suite à une suggestion de zdra.

13/12/2007

Pour compléter : deux liens intéressants pointés par l'honorable boozo :

- Redhat : /proc/meminfo Explained

- O'Reilly : Surveiller la consommation mémoire sous LinuxLast edited by ghoti on Thu Dec 13, 2007 12:56 pm; edited 5 times in total

----------

## Angelion

Ca revient tellement souvent qu'on devrait presque en faire un post it

----------

## Thom N2h

faudrai^t tout simplement mettre à jour le howto howto

----------

## Leander256

Bravo pour la traduction, je pense juste à un truc, c'est qu'il faudrait que tu précises que la permutabilité concerne la gestion de la partition d'échange, ce n'est pas forcément évident pour un débutant  :Wink: 

----------

## ghoti

 *Leander256 wrote:*   

> Bravo pour la traduction, je pense juste à un truc, c'est qu'il faudrait que tu précises que la permutabilité concerne la gestion de la partition d'échange, ce n'est pas forcément évident pour un débutant 

 

En effet, je me suis contenté de traduire sans essayer d'enrichir le texte original.

J'ai essayé de trouver un mot correspondant à "swappiness" mais ce n'est peut-être pas très heureux.

Pour ne pas dénaturer le texte original, je rajoute un commentaire perso en bas du post  :Wink: 

----------

## zdra

Moi je mettrais simplement le terme anglais à coté entre parenthese... Souvent les termes anglais sont plus parlant pour ceux qui ont qq notions sur la question  :Wink: 

Fin bon en tout cas bravo... meme si j'ai découvert le thread en anglais grace à la  Weekly Newsletter et découvert ensuite ta traduction après avoir lu la verison anglaise  :Rolling Eyes: 

----------

## ghoti

 *zdra wrote:*   

> Moi je mettrais simplement le terme anglais à coté entre parenthese... 

 

C'est ce que j'ai fait à l'intérieur du texte. 

Sur le moment, il m'avait semblé que rajouter le terme anglais dans le titre aurait été trop lourd mais à la réflexion, c'est en effet discutable.

J'ai donc fait la petite adaptation que tu suggères  :Wink: 

----------

## TGL

Merci ghoti pour cet excellent post (enfin, comme d'hab' d'ailleurs, mais là encore plus). Le voilà entré dans l'annuaire de yuk.

----------

## YuLin

Je ne suis pas spécialiste de la gestion mémoire sous Linux, cependant je suis étudiant en linguistique anglaise et je peux dire sans retenue que cette traduction est ma foi plus que convenable  :Wink: 

Trop de gens l'oublient : traduire ce n'est pas forcément bien connaître la langue originale du document qui va subir un changement de langue ; c'est surtout bien connaître la langue de destination. On ne peut pas prétendre traduire correctement en ignorant la qualité du registre de la langue d'arrivé  :Wink: 

Bravo, donc, puisque vous (tu ?) avez su rester près du texte sans pour autant en arriver au calque qui pointe vers l'absurde. Félicitations  :Smile: 

----------

## ghoti

Que de compliments ! Vous allez tous me faire rougir !   :Embarassed: 

 *Quote:*   

> vous (tu ?)

 

Oh, le "tu" est naturellement de rigueur ici et cela me convient parfaitement !  :Wink: 

----------

## yuk159

 *ghoti wrote:*   

> Que de compliments ! Vous allez tous me faire rougir !  
> 
> 

 

C'est mérité !  :Very Happy: 

Merci donc pour ce post

----------

