Aller au contenu
Administration Linux medium

Diagnostiquer la mémoire sous Linux

14 min de lecture

Sur Linux, la mémoire n’est pas ce que free semble dire. Un serveur qui affiche 90 % de mémoire utilisée est probablement en parfaite santé — ce que vous voyez, c’est le cache. La compétence à acquérir en diagnostic mémoire est de lire les bons champs (available plutôt que free), d’identifier les processus qui consomment vraiment, et d’anticiper la pression mémoire avant que l’OOM killer ne tue un service critique. Ce guide trace la boucle complète : vue d’ensemble, détail, processus, temps, action.

  • Distinguer used, free, available, buff/cache et swap dans free -h
  • Lire les champs essentiels de /proc/meminfo sans vous noyer dans la soixantaine de lignes
  • Identifier les processus qui consomment vraiment la RAM avec ps et top/htop
  • Observer l’évolution avec vmstat et sar -r
  • Agir : fichier swap, swappiness, purge de cache
  • Anticiper l’OOM killer et réagir quand il frappe

Ce diagnostic sert dans trois scénarios fréquents :

  • Un service vient d’être tué — le journal mentionne Out of memory: Killed process. Il faut retrouver qui consommait, pourquoi, et si la machine est sous-dimensionnée.
  • Le serveur ralentit sans raison évidente — pic de swap, contention mémoire, un processus qui fuit progressivement.
  • Préparation d’un dimensionnement — avant d’ajouter un service, vérifier la marge disponible et la posture swap.

C’est une compétence LFCS (domaine Essential Commands and System Operations) et RHCSA (Operate running systems).

  • Un terminal avec droits sudo
  • Les bases de processus Linux
  • Installer htop et sysstat (pour sar) si absents :
Fenêtre de terminal
sudo apt update
sudo apt install -y htop sysstat

Avant de lire les commandes, cinq concepts suffisent.

RAM physique. La mémoire vive de la machine, limite physique stricte.

Mémoire virtuelle. Chaque processus a son propre espace d’adresses virtuel, mappé à la RAM par le noyau. Les pages non utilisées peuvent migrer vers le disque (swap).

Buffers et cache. Linux garde en RAM ce qui a été lu ou écrit récemment sur disque. Cette mémoire est immédiatement récupérable dès qu’un processus en a besoin — free la compte dans used, mais available la compte comme disponible. Ne confondez pas les deux.

Swap. Extension disque de la mémoire. Quand la RAM sature, des pages peu actives y sont écrites pour libérer de la place. L’accès disque est 100 à 1000× plus lent que la RAM — un système qui swappe beaucoup ralentit fortement.

OOM killer. Quand RAM + swap sont saturées, le noyau tue un processus pour libérer de la mémoire et éviter le gel total. Le choix est piloté par le score /proc/<pid>/oom_score.

La première commande, à lire de gauche à droite :

Fenêtre de terminal
free -h

Sortie typique :

total used free shared buff/cache available
Mem: 31Gi 2.6Gi 25Gi 13Mi 3.9Gi 28Gi
Swap: 8.0Gi 0B 8.0Gi

Les colonnes qui comptent :

ColonneSignificationÀ surveiller ?
totalRAM physiqueConstante, sert de référence
usedMémoire allouée aux processus plus buff/cachePeut paraître élevée sans que ce soit anormal
freeMémoire non utilisée du toutSouvent basse — c’est normal
buff/cacheCaches I/O, récupérables à la demandeÉlevé = système tire parti de la RAM
availableCe qui peut être attribué à un nouveau processusLa vraie métrique santé
Swap total/usedZone swap configurée / utiliséeUn used qui monte = pression mémoire

free lit ses chiffres dans /proc/meminfo. Ce fichier expose ~60 champs ; 7 suffisent pour un diagnostic courant.

Fenêtre de terminal
grep -E '^(MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree|Dirty|Writeback):' /proc/meminfo

Sortie typique :

MemTotal: 32602704 kB
MemFree: 26288324 kB
MemAvailable: 29867396 kB
Buffers: 511084 kB
Cached: 3327372 kB
SwapTotal: 8388604 kB
SwapFree: 8388604 kB
Dirty: 252 kB
Writeback: 0 kB

Les champs à retenir :

  • MemAvailable — ce que le noyau estime allouable à un nouveau processus, en tenant compte des caches récupérables. C’est cette valeur qui compte, pas MemFree.
  • Buffers + Cached — mémoire récupérable. Une chute brutale signale une demande forte.
  • SwapFree — si proche de zéro, l’OOM killer approche.
  • Dirty — pages modifiées en attente d’écriture disque. Une valeur haute persistante = goulot d’étranglement I/O.

Trier par consommation RAM, dix premiers :

Fenêtre de terminal
ps aux --sort=-%mem | head -n 11

Colonnes clés :

ColonneSignification
USERPropriétaire du processus
%MEM% de RAM physique utilisée
VSZTaille de l’espace virtuel (en Ki) — peut être trompeur, contient des pages mappées non chargées
RSSResident Set Size — mémoire physique réellement occupée (en Ki)
COMMANDCommande ayant lancé le processus

Préférez RSS à VSZ pour savoir ce qu’un processus consomme vraiment.

top donne une vue temps réel :

Fenêtre de terminal
top -o %MEM

Dans l’interface, M trie par mémoire, c montre la commande complète, f permet de choisir les colonnes affichées.

htop est plus lisible et intuitif :

Fenêtre de terminal
htop

Les barres du haut visualisent la RAM et la swap ; la colonne MEM% trie par un simple clic ou par F6.

ps double-compte la mémoire partagée entre plusieurs processus. smem expose le Proportional Set Size (PSS) — la part réellement imputable à chaque processus :

Fenêtre de terminal
sudo smem -rs pss | head -n 10
ColonneSignification
USSMémoire unique au processus
PSSPart proportionnelle des pages partagées + USS
RSSTotalité, double comptée si pages partagées

C’est indispensable pour diagnostiquer un serveur qui héberge beaucoup de processus d’une même application (Apache, PostgreSQL…).

Fenêtre de terminal
vmstat 2 5

(Cinq relevés espacés de deux secondes.)

Colonnes essentielles pour la mémoire :

ColonneSignification
freeMémoire non utilisée
buff / cacheBuffers et cache
si / soSwap in / out par seconde — activité swap en direct
rProcessus en attente d’exécution
bProcessus bloqués sur I/O

sar (paquet sysstat) collecte des métriques en continu et permet de revenir en arrière :

Fenêtre de terminal
# Temps réel : 3 relevés espacés de 1 s
sar -r 1 3
# Historique de la journée
sar -r
# Historique d'un jour donné
sar -r -f /var/log/sysstat/sa$(date -d yesterday +%d)

Colonnes principales : kbmemfree, kbmemused, %memused, kbbuffers, kbcached, kbswpfree, kbswpused, %swpused. Indispensable pour un audit ou un post-mortem à froid.

Symptômes à croiser :

  • free -h montre available < 10 % de total
  • vmstat 2 affiche si/so non-nuls en continu
  • dmesg -T | tail -50 contient Out of memory: Killed process
  • Le load average grimpe sans que le CPU soit saturé — les processus attendent la mémoire

Commandes de diagnostic enchaînées :

Fenêtre de terminal
# qui consomme ?
ps aux --sort=-%mem | head -n 10
# depuis quand ?
sar -r | tail -30
# swap actif ?
vmstat 2 5
# OOM killer déjà passé ?
sudo dmesg -T | grep -iE 'oom|killed'
journalctl -k --since "1 hour ago" | grep -iE 'oom|killed'

Si l’OOM killer a frappé, la ligne typique dans dmesg est :

Out of memory: Killed process 1234 (nginx) total-vm:512000kB, anon-rss:400000kB

On a alors le PID, le nom du processus, et sa consommation au moment du kill.

Diagnostic posé, on peut intervenir. Les leviers se divisent en deux : ajuster la politique (swappiness, ajout de swap) ou libérer ponctuellement (drop_caches).

vm.swappiness (0-100) règle l’agressivité du swap. Valeurs typiques :

  • 10 — serveur de base de données, latence critique
  • 60 — valeur par défaut, poste de travail
  • 100 — swap au maximum (rare)

Modification runtime :

Fenêtre de terminal
sudo sysctl vm.swappiness=10
cat /proc/sys/vm/swappiness

Persistance :

Fenêtre de terminal
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system

Utile sur un VPS sans partition swap. Avec un fichier d’1 Gi :

  1. Créer le fichier et le sécuriser

    Fenêtre de terminal
    sudo fallocate -l 1G /swapfile
    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
  2. Activer

    Fenêtre de terminal
    sudo swapon /swapfile
    swapon --show
  3. Persister dans /etc/fstab

    Fenêtre de terminal
    echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
  4. Vérifier après reboot

    Fenêtre de terminal
    sudo systemctl reboot
    # après reconnexion
    swapon --show
    free -h
Fenêtre de terminal
# tout désactiver
sudo swapoff -a
# tout réactiver (selon /etc/fstab)
sudo swapon -a

swapoff -a peut geler la machine si la RAM ne suffit pas à réintégrer les pages swappées. À utiliser avec prudence.

Fenêtre de terminal
sudo sync
echo 3 | sudo tee /proc/sys/vm/drop_caches

Valeurs possibles : 1 (pagecache), 2 (dentry + inodes), 3 (tout). Utile pour des mesures de performance ou un test de régénération du cache — pas pour résoudre une pression mémoire, Linux libère déjà le cache automatiquement.

  • Lisez available, pas free. 90 % des erreurs de diagnostic viennent de là.
  • Surveillez si/so de vmstat pour détecter un swap chronique.
  • Gardez sysstat activésar sauve la mise pour les post-mortems.
  • Ne purgez pas le cache en production sauf test ciblé. Linux s’en charge.
  • Dimensionnez le swap : typiquement égal à la RAM jusqu’à 8 Gi, puis moitié au-dessus. Pour un serveur de base de données avec swappiness=1, un petit swap suffit comme filet.
  • Alertez sur MemAvailable et SwapUsed, pas sur MemFree.

La seule manipulation risquée du guide est swapoff -a quand la swap est en usage. Avant de désactiver la swap :

Fenêtre de terminal
# vérifier qu'elle n'est pas utilisée
free -h
swapon --show
# si 'used' > 0, désactiver progressivement ou pas du tout

Les modifs de swappiness sont réversibles sans risque. Si un fichier swap n’est plus voulu :

Fenêtre de terminal
sudo swapoff /swapfile
sudo sed -i '/\/swapfile/d' /etc/fstab
sudo rm /swapfile
SymptômeCause probableAction
free affiche used très haut mais tout va bienused inclut buff/cache, lire available à la placeInterpréter différemment, pas d’intervention
available bas + si/so non-nulPression mémoire réelleps aux --sort=-%mem → identifier et limiter
OOM killer a tué un serviceRAM+swap saturées`dmesg -T
Swap remplie à 100 % mais available hautSwap remplie historiquement, pas en usage actifswapoff -a && swapon -a pour vider — seulement si RAM confortable
Swap ignorée sur VPS cloudImage sans swap, swapon --show videCréer un fichier swap (cf. ci-dessus)
htop / free incohérentsRare, cache ps vs lecture directe /procCroiser avec cat /proc/meminfo
  • Lisez available, pas free. C’est la seule bonne métrique de RAM disponible.
  • Le cache remplit toujours la RAM — c’est sain, pas un problème.
  • Les champs critiques de /proc/meminfo : MemAvailable, Buffers+Cached, SwapFree.
  • ps aux --sort=-%mem et htop pour trouver les processus gourmands ; smem -s pss pour la part proportionnelle.
  • vmstat 2 : surveillez si/so. Non-nuls en continu = swap chronique.
  • sar -r préserve l’historique mémoire — indispensable pour les post-mortems.
  • vm.swappiness ajustable runtime (sysctl) et permanent (/etc/sysctl.d/).
  • Fichier swap utile sur VPS sans partition dédiée : fallocate + mkswap + swapon + entrée /etc/fstab.
  • OOM killer frappe quand RAM+swap saturées — le log est dans dmesg et journalctl -k.
  • Ne purgez pas drop_caches en production sauf test contrôlé.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn