Pmap

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Mémoire d'un processus
Commande pmap
Contexte Diagnostic mémoire (fuite, fragmentation) — à ne pas confondre avec ldd
Voir aussi Ps, Mémoire, Smem

pmap affiche la cartographie mémoire (memory map) d'un processus en cours d'exécution : la liste des segments qui composent son espace d'adressage virtuel — tas (heap), pile (stack), bibliothèques partagées chargées, zones anonymes mmap, etc. — avec leur adresse, leur taille et leurs permissions. Attention à une confusion fréquente : pmap ne liste pas les dépendances de bibliothèques d'un exécutable (quelles .so sont requises pour le lier) — c'est le rôle de ldd. pmap montre ce qui est réellement mappé en mémoire pour un processus déjà lancé, à un instant donné, y compris des zones qui n'ont rien à voir avec des bibliothèques (tas, pile, segments anonymes).

Vue simple

pmap 1234

Affiche pour le PID 1234 la liste des segments mappés : adresse de début, taille, permissions et, quand c'est pertinent, le fichier ou la bibliothèque associée (ou [ anon ], [ stack ], [ heap ] pour les zones sans fichier).

Vue étendue (-x)

pmap -x 1234

Ajoute des colonnes utiles pour le diagnostic mémoire réel plutôt que la seule taille réservée :

  • Kbytes — taille virtuelle du segment (ce qui est réservé, pas forcément utilisé)
  • RSS (Resident Set Size) — mémoire physique réellement occupée par ce segment
  • Dirty — pages modifiées depuis leur chargement (donc non partageables avec d'autres processus, à la différence des pages propres d'une bibliothèque partagée en lecture seule)

C'est la vue à privilégier pour évaluer l'empreinte mémoire réelle d'un processus segment par segment, plutôt que pmap 1234 seul qui ne montre que la taille virtuelle.

Vue device (-d)

pmap -d 1234

Variante orientée périphérique : ajoute la colonne du device (majeur/mineur) et de l'inode du fichier mappé, en plus de la taille. Utile pour identifier précisément sur quel système de fichiers/disque se trouve le binaire ou la bibliothèque correspondant à un segment, notamment quand plusieurs versions d'une même lib coexistent sur des montages différents.

Lire les sections d'une sortie pmap

Une sortie pmap typique mélange plusieurs types de segments qu'il faut savoir distinguer :

  • Bibliothèques partagées (.so) — une ligne par bibliothèque chargée (libc, libssl, etc.), généralement en plusieurs segments (code en lecture seule + données) ; leur poids RSS est en grande partie mutualisé entre tous les processus qui les utilisent, donc pas à additionner naïvement pour estimer la mémoire "propre" à un process
  • [ heap ] — tas alloué dynamiquement (malloc et dérivés) ; une croissance continue de ce segment dans le temps est le signal classique d'une fuite mémoire
  • [ stack ] — pile du thread principal (une pile par thread pour un process multi-thread, visibles séparément)
  • [ anon ] — zones mmap anonymes, sans fichier associé (allocations mémoire directes, buffers, parfois des allocateurs mémoire alternatifs à malloc)
  • la ligne total en bas récapitule la somme des tailles (et du RSS en -x) sur l'ensemble des segments

Cas d'usage

Identifier une fuite mémoire : relancer pmap -x PID à intervalles réguliers sur un process suspecté et comparer la taille du [ heap ] (et éventuellement des zones [ anon ]) dans le temps. Une croissance continue sans jamais redescendre, alors que la charge du process est stable, indique une fuite plutôt qu'une simple variation normale d'usage.

watch -n 5 'pmap -x 1234 | tail -5'

Comprendre la fragmentation mémoire : un grand nombre de petits segments [ anon ] épars dans l'espace d'adressage (au lieu de quelques segments larges et contigus) est un signe de fragmentation, souvent lié à un pattern d'allocation/libération désordonné (beaucoup de petites allocations de tailles variées). Comparer le nombre total de mappings (pmap PID | wc -l) entre un process sain et un process qui consomme anormalement peut aider à confirmer le diagnostic.

Diagnostiquer une consommation RSS élevée mal expliquée : trier la sortie -x par RSS décroissant pour repérer immédiatement les segments les plus gros, plutôt que de parcourir une sortie de plusieurs centaines de lignes :

pmap -x 1234 | sort -k3 -n -r | head -20