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.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Distinguer
used,free,available,buff/cacheetswapdansfree -h - Lire les champs essentiels de
/proc/meminfosans vous noyer dans la soixantaine de lignes - Identifier les processus qui consomment vraiment la RAM avec
psettop/htop - Observer l’évolution avec
vmstatetsar -r - Agir : fichier swap, swappiness, purge de cache
- Anticiper l’OOM killer et réagir quand il frappe
Dans quel contexte ?
Section intitulée « Dans quel contexte ? »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).
Prérequis
Section intitulée « Prérequis »- Un terminal avec droits
sudo - Les bases de processus Linux
- Installer
htopetsysstat(poursar) si absents :
sudo apt updatesudo apt install -y htop sysstatsudo dnf install -y htop sysstatsudo systemctl enable --now sysstatLe modèle mémoire en 5 minutes
Section intitulée « Le modèle mémoire en 5 minutes »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.
Vue d’ensemble avec free
Section intitulée « Vue d’ensemble avec free »La première commande, à lire de gauche à droite :
free -hSortie typique :
total used free shared buff/cache availableMem: 31Gi 2.6Gi 25Gi 13Mi 3.9Gi 28GiSwap: 8.0Gi 0B 8.0GiLes colonnes qui comptent :
| Colonne | Signification | À surveiller ? |
|---|---|---|
total | RAM physique | Constante, sert de référence |
used | Mémoire allouée aux processus plus buff/cache | Peut paraître élevée sans que ce soit anormal |
free | Mémoire non utilisée du tout | Souvent basse — c’est normal |
buff/cache | Caches I/O, récupérables à la demande | Élevé = système tire parti de la RAM |
available | Ce qui peut être attribué à un nouveau processus | La vraie métrique santé |
Swap total/used | Zone swap configurée / utilisée | Un used qui monte = pression mémoire |
Détail via /proc/meminfo
Section intitulée « Détail via /proc/meminfo »free lit ses chiffres dans /proc/meminfo. Ce fichier expose ~60 champs ; 7 suffisent pour un diagnostic courant.
grep -E '^(MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree|Dirty|Writeback):' /proc/meminfoSortie typique :
MemTotal: 32602704 kBMemFree: 26288324 kBMemAvailable: 29867396 kBBuffers: 511084 kBCached: 3327372 kBSwapTotal: 8388604 kBSwapFree: 8388604 kBDirty: 252 kBWriteback: 0 kBLes 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, pasMemFree.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.
Identifier les processus gourmands
Section intitulée « Identifier les processus gourmands »Trier par consommation RAM, dix premiers :
ps aux --sort=-%mem | head -n 11Colonnes clés :
| Colonne | Signification |
|---|---|
USER | Propriétaire du processus |
%MEM | % de RAM physique utilisée |
VSZ | Taille de l’espace virtuel (en Ki) — peut être trompeur, contient des pages mappées non chargées |
RSS | Resident Set Size — mémoire physique réellement occupée (en Ki) |
COMMAND | Commande ayant lancé le processus |
Préférez RSS à VSZ pour savoir ce qu’un processus consomme vraiment.
Avec top / htop
Section intitulée « Avec top / htop »top donne une vue temps réel :
top -o %MEMDans 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 :
htopLes barres du haut visualisent la RAM et la swap ; la colonne MEM% trie par un simple clic ou par F6.
Comprendre la mémoire partagée avec smem
Section intitulée « Comprendre la mémoire partagée avec smem »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 :
sudo smem -rs pss | head -n 10| Colonne | Signification |
|---|---|
USS | Mémoire unique au processus |
PSS | Part proportionnelle des pages partagées + USS |
RSS | Totalité, 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…).
Observer dans le temps
Section intitulée « Observer dans le temps »vmstat — snapshot toutes les N secondes
Section intitulée « vmstat — snapshot toutes les N secondes »vmstat 2 5(Cinq relevés espacés de deux secondes.)
Colonnes essentielles pour la mémoire :
| Colonne | Signification |
|---|---|
free | Mémoire non utilisée |
buff / cache | Buffers et cache |
si / so | Swap in / out par seconde — activité swap en direct |
r | Processus en attente d’exécution |
b | Processus bloqués sur I/O |
sar -r — historique
Section intitulée « sar -r — historique »sar (paquet sysstat) collecte des métriques en continu et permet de revenir en arrière :
# Temps réel : 3 relevés espacés de 1 ssar -r 1 3
# Historique de la journéesar -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.
Diagnostiquer une pression mémoire
Section intitulée « Diagnostiquer une pression mémoire »Symptômes à croiser :
free -hmontreavailable< 10 % detotalvmstat 2affichesi/sonon-nuls en continudmesg -T | tail -50contientOut 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 :
# 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:400000kBOn a alors le PID, le nom du processus, et sa consommation au moment du kill.
Agir sur la mémoire
Section intitulée « Agir sur la mémoire »Diagnostic posé, on peut intervenir. Les leviers se divisent en deux : ajuster la politique (swappiness, ajout de swap) ou libérer ponctuellement (drop_caches).
Ajuster la swappiness
Section intitulée « Ajuster la swappiness »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 :
sudo sysctl vm.swappiness=10cat /proc/sys/vm/swappinessPersistance :
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.confsudo sysctl --systemAjouter un fichier swap
Section intitulée « Ajouter un fichier swap »Utile sur un VPS sans partition swap. Avec un fichier d’1 Gi :
-
Créer le fichier et le sécuriser
Fenêtre de terminal sudo fallocate -l 1G /swapfilesudo chmod 600 /swapfilesudo mkswap /swapfile -
Activer
Fenêtre de terminal sudo swapon /swapfileswapon --show -
Persister dans
/etc/fstabFenêtre de terminal echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab -
Vérifier après reboot
Fenêtre de terminal sudo systemctl reboot# après reconnexionswapon --showfree -h
Désactiver / réactiver temporairement
Section intitulée « Désactiver / réactiver temporairement »# tout désactiversudo swapoff -a
# tout réactiver (selon /etc/fstab)sudo swapon -aswapoff -a peut geler la machine si la RAM ne suffit pas à réintégrer les pages swappées. À utiliser avec prudence.
Purger le cache (rarement utile)
Section intitulée « Purger le cache (rarement utile) »sudo syncecho 3 | sudo tee /proc/sys/vm/drop_cachesValeurs 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.
Bonnes pratiques
Section intitulée « Bonnes pratiques »- Lisez
available, pasfree. 90 % des erreurs de diagnostic viennent de là. - Surveillez
si/sodevmstatpour détecter un swap chronique. - Gardez
sysstatactivé —sarsauve 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
MemAvailableetSwapUsed, pas surMemFree.
Sécurité et rollback
Section intitulée « Sécurité et rollback »La seule manipulation risquée du guide est swapoff -a quand la swap est en usage. Avant de désactiver la swap :
# vérifier qu'elle n'est pas utiliséefree -hswapon --show
# si 'used' > 0, désactiver progressivement ou pas du toutLes modifs de swappiness sont réversibles sans risque. Si un fichier swap n’est plus voulu :
sudo swapoff /swapfilesudo sed -i '/\/swapfile/d' /etc/fstabsudo rm /swapfileDépannage rapide
Section intitulée « Dépannage rapide »| Symptôme | Cause probable | Action |
|---|---|---|
free affiche used très haut mais tout va bien | used inclut buff/cache, lire available à la place | Interpréter différemment, pas d’intervention |
available bas + si/so non-nul | Pression mémoire réelle | ps aux --sort=-%mem → identifier et limiter |
| OOM killer a tué un service | RAM+swap saturées | `dmesg -T |
Swap remplie à 100 % mais available haut | Swap remplie historiquement, pas en usage actif | swapoff -a && swapon -a pour vider — seulement si RAM confortable |
| Swap ignorée sur VPS cloud | Image sans swap, swapon --show vide | Créer un fichier swap (cf. ci-dessus) |
htop / free incohérents | Rare, cache ps vs lecture directe /proc | Croiser avec cat /proc/meminfo |
À retenir
Section intitulée « À retenir »- Lisez
available, pasfree. 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=-%memethtoppour trouver les processus gourmands ;smem -s psspour la part proportionnelle.vmstat 2: surveillezsi/so. Non-nuls en continu = swap chronique.sar -rpréserve l’historique mémoire — indispensable pour les post-mortems.vm.swappinessajustable 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
dmesgetjournalctl -k. - Ne purgez pas
drop_cachesen production sauf test contrôlé.