Mémoire

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Surveillance et diagnostic de la mémoire
Commande free, vmstat, /proc/meminfo
Contexte Linux générique (RHEL/CentOS et dérivés)
Voir aussi Kernel (zones mémoire, OOM killer)

Aide-mémoire pratique pour surveiller et diagnostiquer l'utilisation de la mémoire sous Linux : vue d'ensemble avec free/vmstat, détail via /proc/meminfo, consommation par processus, et principaux réglages sysctl. Pour le fonctionnement interne du noyau (zones mémoire, OOM killer), voir Kernel.

Vue d'ensemble : free et vmstat

free -h                     # vue synthétique (total/used/free/shared/buff-cache/available)
watch -d -n 1 free -h       # suivre l'évolution en direct, différences surlignées
vmstat 1                    # stats mémoire/CPU/IO toutes les secondes
vmstat -s                   # compteurs cumulés depuis le boot, détaillés par type

La colonne available (présente sur les free récents) est plus fiable que free seule : elle estime la mémoire réellement récupérable depuis les caches/buffers sans avoir besoin de swap.

/proc/meminfo

/proc/meminfo est la source brute derrière free et vmstat, avec le détail complet par compteur :

watch -d -n 1 cat /proc/meminfo   # suivre les I/O de la RAM en direct, champ par champ

Champs les plus utiles au quotidien :

  • MemTotal / MemFree / MemAvailable — totaux et estimation réaliste du disponible
  • Buffers / Cached — caches disque récupérables sous pression mémoire
  • SwapTotal / SwapFree — swap total et restant
  • Dirty — pages modifiées en mémoire pas encore écrites sur disque
  • Slab — mémoire noyau (structures dentries/inodes, etc.)

Pour repérer de la mémoire réservée au boot (avant même le démarrage des services) :

dmesg | grep -i memory

Le détail complet de chaque champ de /proc/meminfo et des réglages /proc/sys/vm/ associés : http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/s-memory-captun.html

Par processus : pmap et smem

pmap <pid>          # cartographie mémoire d'un processus (segments, tailles)
pmap -x <pid>       # détail RSS/dirty par segment

smem -t -k          # tri par consommation, tailles lisibles (Ko/Mo/Go)
smem -u             # totaux agrégés par utilisateur

smem distingue la mémoire partagée au prorata (PSS) du RSS brut — plus fiable que ps/top pour évaluer la consommation réelle d'un ensemble de processus qui partagent des bibliothèques (ex. plusieurs workers d'une même appli).

Réglages sysctl

Swap : swappiness et pression sur les caches

cat /proc/sys/vm/swappiness            # 60 par défaut
echo 10 > /proc/sys/vm/swappiness       # à chaud ; persister via vm.swappiness = 10 dans /etc/sysctl.conf

cat /proc/sys/vm/vfs_cache_pressure     # 100 par défaut
cat /proc/sys/vm/min_free_kbytes
  • swappiness (0-100) — tendance du noyau à swapper plutôt qu'à libérer du cache. 0 ne swappe qu'en dernier recours, juste avant l'OOM killer ; 100 swappe volontiers dès que possible. Un serveur de base de données préfère souvent une valeur basse (1-10) : mieux vaut garder les pages applicatives en RAM et laisser le cache disque se réduire. Couper totalement le swap (le mettre à 0 strictement, ou le désactiver) peut au contraire perturber `kswapd` sur certaines charges — voir Kernel pour le mécanisme complet.
  • vfs_cache_pressure — tendance à réclamer la mémoire utilisée par les caches d'inodes/dentries plutôt que par le cache de pages classique. Une valeur basse privilégie la conservation de ces caches (utile si beaucoup de petits fichiers sont parcourus en boucle) ; une valeur haute les libère plus agressivement.
  • min_free_kbytes — quantité de RAM physique que le noyau essaie toujours de garder libre, en réserve, pour éviter un blocage complet en cas de pic brutal de demande mémoire (allocations réseau/atomiques notamment). Augmenter cette valeur sur des serveurs à forte charge réseau peut éviter des à-coups, mais réduit d'autant la RAM disponible pour le reste.

Dirty pages

cat /proc/sys/vm/dirty_ratio             # % de RAM en pages modifiées avant écriture forcée synchrone
cat /proc/sys/vm/dirty_background_ratio  # % de RAM en pages modifiées déclenchant une écriture asynchrone en tâche de fond

Au-delà de `dirty_background_ratio`, le noyau démarre l'écriture en arrière-plan sans bloquer les processus. Au-delà de `dirty_ratio`, tout processus qui écrit se retrouve bloqué en synchrone jusqu'à ce que suffisamment de pages soient écrites sur disque — un `dirty_ratio` trop haut peut donc transformer un pic d'écriture en gel visible de l'application. Garder ces valeurs par défaut convient à la majorité des cas ; les ajuster surtout sur des serveurs à fort débit d'écriture disque (bases de données, ingestion de logs).

Mémoire noyau : slabtop

slabtop -sc         # tri par taille de cache, façon top
cat /proc/slabinfo   # détail brut

Complète le champ `Slab` de `/proc/meminfo` : `slabtop` détaille quelles structures noyau (dentries, inodes, caches réseau…) consomment cette mémoire, utile quand `Slab` grossit de façon anormale.

overcommit_memory

cat /proc/sys/vm/overcommit_memory
echo 1 > /proc/sys/vm/overcommit_memory   # à chaud ; à persister via /etc/sysctl.conf (vm.overcommit_memory = 1)
  • 0 (par défaut) — heuristique : le noyau estime la mémoire disponible et refuse les requêtes visiblement invalides ; l'estimation n'étant pas exacte, un léger overcommit reste possible.
  • 1 — aucun contrôle : le noyau accepte toujours l'allocation ; overcommit plus probable, mais utile pour les applications qui réservent beaucoup de mémoire virtuelle sans tout utiliser (calcul scientifique, JVM…).
  • 2 — strict : refuse toute requête dépassant la somme swap disponible + overcommit_ratio% de la RAM physique ; le réglage le plus sûr contre l'overcommit, au prix d'un risque de refus sur des applications légitimes.

drop_caches

echo 1 > /proc/sys/vm/drop_caches   # libère le cache de pages
echo 2 > /proc/sys/vm/drop_caches   # libère le cache slab inutilisé
echo 3 > /proc/sys/vm/drop_caches   # libère les deux

⚠️ Opération non destructive (le cache se reconstruit à l'usage) mais à réserver au diagnostic ponctuel — le vider systématiquement en production dégrade les performances I/O au lieu de les améliorer.

Hugepages

Réserver une partie de la RAM en hugepages retire cette zone des recherches habituelles de disponibilité mémoire du noyau, ce qui améliore les performances des applications qui en tirent parti (bases de données notamment) :

# /etc/sysctl.conf — réserver des hugepages (exemple : SGA Oracle, généralement RAM/2)
# 1 unité = 2 Mo
vm.nr_hugepages = 8000
# /etc/security/limits.conf — autoriser l'utilisateur applicatif à verrouiller cette mémoire
oracle soft memlock 16384000
oracle hard memlock 16384000

Voir aussi

  • Kernel — zones mémoire (DMA/Normale/Highmem) et fonctionnement de l'OOM killer, non répété ici
  • Systemctl — gestion des services