La mémoire dans Linux : comment ça marche

Tous les OS virtualise la mémoire RAM de votre PC en une ou plusieurs mémoires pour le fonctionnement du système d'exploitation et des applications.
Linux ne déroge pas à la règle avec trois types de mémoire : la mémoire privée, de travail et virtuelle.
Cela vaut pour tous les distributions Debian, Ubuntu, Mint, Fedora et autres.

Cet article vous donne toutes les explications, les différences et comment les OS utilisent ces mémoires.

La mémoire dans Linux : comment ça marche

La mémoire dans Linux : Comment ça marche ?

La mémoire virtuelle

Avant de détailler les types de mémoire, il faut comprendre comment Linux organise la mémoire.

Le système d'exploitation sert de couche d'abstraction entre les applications et la mémoire physique.
Ainsi, c'est lui qui organise la mémoire système que les applications peuvent utiliser.

Lorsque Linux utilise la RAM système, il crée une couche de mémoire virtuelle pour ensuite attribuer des processus à la mémoire virtuelle.
Ces adresses virtuelles sont converties en adresses physiques par le processeur sur la base des informations contenues dans un ensemble de tables maintenues par le système d'exploitation.
La mémoire virtuelle est en fait une combinaison de RAM et d'espace de swap. L'espace d'échange est une section de votre disque dur (partition SWAP) désignée comme disponible pour une utilisation en cas d'épuisement de la mémoire RAM utilisable.
Cette couche d'abstraction supplémentaire est là pour que chaque processus en cours ne se chevauche pas et tente d'utiliser la mémoire déjà utilisée par un autre processus.
Cela signifie également que la mémoire virtuelle peut être étendue au-delà de la capacité de la RAM physique, ce qui peut être utile à la rigueur même si ce n'est pas très efficace.

Les pages de mémoire virtuelle

La mémoire virtuelle et physique sont diviséeS en blocs de longueur fixe appelés pages.
La correspondance entre les adresses de mémoire virtuelle et les adresses de mémoire physiques se fait par la page table.

Les pages de mémoire virtuelle, page table et mémoire physique

Chaque processus du système possède son propre espace d'adressage virtuel. Ces espaces d'adressage virtuels sont complètement séparés les uns
des autres et un processus exécutant une application ne peut donc pas en affecter une autre.

C'est au noyau Linux de veiller à la cohérence des adresses et l'état.
Si une application accède à numéro de cadre de page virtuel et trouve l'entrée comme invalide, il doit en informer le noyau qui doit résoudre le problème. Il parle page fault.
De plus, les mécanismes de mémoire virtuelle matérielle permettent de protéger des zones de mémoire contre l'écriture.
Cela empêche le code et les données d'être écrasés par des applications malveillantes.

Optimiser l'utilisation de la mémoire RAM

Pour optimiser et utiliser efficacement la mémoire physique, Linux ne charge que les pages virtuelles actuellement utilisées par les programmes en cours d'exécution.
Un autre mécanisme pour économiser la mémoire physique est le partage de la mémoire virtuelle.
Bien que la mémoire virtuelle permette aux processus d'avoir des espaces d'adressage (virtuels) séparés, il arrive parfois que des processus partagent la mémoire.
Par exemple, il peut y avoir plusieurs processus dans le système exécutant le shell de commande bash. Plutôt que d'avoir plusieurs copies de bash, une dans chaque espace d'adressage virtuel de processus, il est préférable de n'avoir qu'une seule copie dans la mémoire physique et tous les processus exécutant bash la partagent. Les bibliothèques dynamiques sont un autre exemple courant d'exécution de code partagé entre plusieurs processus.

Enfin lorsque la mémoire virtuelle et SWAP sont totalement saturé, Linux utilise OOM killer (Out-Of-Memory Killer).
Ce dernier va tuer des processus considéré comme étant les moins important afin d'éviter un crash total du système.

Comment afficher l'utilisation mémoire et mémoire libre sur Linux

Les utilitaires top

Pour surveiller l'utilisation mémoire, CPU comme souvent, il existe de nombreux utilitaires : htop, atop, nmon, vtop, ...
Mais il affiche tous les mêmes informations puisqu'elles proviennent du système.
Ainsi seul la présentation change.

Depuis un terminal, il existe aussi le bon vieux top :

Afficher l'état de la mémoire libre et utilisée

Pour afficher la mémoire utilisé et libre, on peut utiliser la commande free.
Ce dernier utilise /proc/meminfo mentionné ci-dessous pour donner les informations de l'état de la mémoire Linux.
Les options -k, -m, -g permettent d'afficher en Ko, Mo ou Go.
Par exemple :

free -m

Cela affiche la mémoire totale, la mémoire utilisé et libre et la mémoire partagée.

La cmomande free pour afficher l'utilisation mémoire et la mémoire libre

/proc/meminfo et /proc/sys/vm/

Enfin on peut avoir plus de détails sur l'organisation de la mémoire de Linux en interrogeant directement le noyaux Linux.

/proc/meminfo est utilisé par pour signaler la quantité de mémoire libre et utilisée (à la fois physique et swap) sur le système ainsi que la mémoire partagée et les tampons utilisés par le noyau.
Il donne aussi des statistiques complètes sur la mémoire virtuelle Linux.

/proc/meminfo : afficher les statistisques de la mémoire sur Linux

La configuration de la mémoire virtuelle de Linux se trouve dans /proc/sys/vm/
Pour ce dernier, se reporter à cette documentation : Documentation for /proc/sys/vm/

La mémoire privée, travail, virtuelle de Linux

Lorsque l'on consulte l'état des processus et l'utilisation des ressources systèmes (CPU, mémoire, temps d'exécution), on trouve différents types de mémoire.

Voici les explications des colonnes mémoires :

  • RES (Resident Set Size) : La taille de l'ensemble résident est la partie de l'espace de mémoire virtuelle qui se trouve réellement dans la RAM. Cette valeur peut varier car les pages de mémoire peuvent être échangées vers l'intérieur ou vers l'extérieur. Il peut même être 0 pour un processus qui est en veille depuis longtemps, par ex. un daemon non sollicité
  • VIRT (Virtual Memory) : est la taille totale de toute la mémoire utilisée par le processus, que ce soit dans la RAM ou sur le disque (objets partagés, fichiers mmaped, zone d'échange).
  • SHR (Shared Memory) : est la mémoire physique partagée totale à laquelle le processus a accès.
  • PRI (Private Memory) : c'est la mémoire privée du processus
  • MEM% : RES divisé par la quantité de RAM
  • DATA (parfois ne s'affiche pas) est la mémoire privée totale mappée pour traiter les données physiques ou non

VIRT (Virtual Memory)

Il correspond donc à tous les éléments chargés : la mémoire virtuelle, les objets mappés, zone d'échange, etc.

Ainsi VIRT est toujours plus grand ou égal à RES. Un processus traite toujours (c'est-à-dire allouer / accéder / libérer) de la mémoire virtuelle.
Il appartient au système d'exploitation de mapper certaines ou toutes ces pages sur la RAM.

Sur des serveurs, il n'est pas anormal d'avoir des processus qui occupe plusieurs Go de VIRT.

Un processus utilise plusieurs Go de mémoire virtuelle (VIRT)

La commande pmap permet d'afficher les éléments mappées dans l'espace virtuel du processus.

pmap : Les éléments mappées dans l'espace virtuel du processus

RES (Resident Set Size)

RES est la taille de l'ensemble résident est la partie de l'espace de mémoire virtuelle qui se trouve réellement dans la RAMC'est le plus proche de la mémoire utilisée par le processus en mémoire, à l'exclusion de ce qui est échangé.
Mais gardez à l'esprit que cela inclut aussi le SHR (mémoire physique partagée).

C'est donc un indicateur à suivre pour vérifier si un processus ne leak pas.
Par exemple, ci-dessous on voit que le service clamav (clamd) prend 1.1Go RES.

SHR - Shared Memory

SHR la taille de la mémoire partagée avec d'autres processus.
Ce n'est pas un indicateur de mémoire très pertinent et utile à surveiller.

Liens