GNU/Linux >> Tutoriels Linux >  >> Linux

Linux - Obtenir des informations sur l'utilisation de la mémoire d'un processus à partir de /proc/pid/smaps ?

Pour un processus donné dans /proc/<pid>/smaps , pour une entrée de mappage donnée, quels sont :

  1. Shared_Clean
  2. Shared_Dirty
  3. Private_Clean
  4. Private_Dirty

Est Shared_Clean + Shared_Dirty la quantité de mémoire partagée avec d'autres processus ? C'est donc comme un RSS partagé ?

De même est Private_Clean + Private_Dirty la quantité de mémoire disponible pour un seul processus ? C'est donc comme un RSS privé ?

La valeur PSS est-elle =PrivateRSS + (SharedRSS / nombre de processus le partageant) ?

Quelques questions supplémentaires après avoir lu ce lien :LWN

Parlons maintenant du processus dans son ensemble, dont nous examinons l'entrée smaps.

J'ai remarqué que si je fais Shared_Clean + Shared_Dirty + Private_Clean + Private_Dirty pour chaque entrée smaps pour le processus, je reçois le RSS du processus tel que
rapporté par ps , ce qui est plutôt cool. Par exemple

ps -p $$ -o pid,rss

Me donnera (approximativement) la même valeur pour rss que la somme de chaque Shared_Clean , Shared_Dirty , Private_Clean , Private_Dirty entrée dans /proc/$$/smaps.

Mais qu'en est-il du PSS pour l'ensemble du processus ? Donc, à partir de l'exemple ci-dessus, comment puis-je obtenir le PSS pour $$ ? Puis-je simplement ajouter l'entrée PSS pour chaque mappage smaps et arriver à PSS pour $$ ?

Et qu'en est-il de l'USS pour l'ensemble du processus ? En reprenant l'exemple ci-dessus, je suppose que je peux arriver à l'USS pour $$ en additionnant uniquement les entrées Private_* pour chaque entrée smaps pour $$..n'est-ce pas ?

Remarques :
PSS=Taille de l'ensemble proportionnel.
USS=Taille de l'ensemble unique.

Réponse acceptée :

Les pages propres sont des pages qui n'ont pas été modifiées depuis leur mappage (généralement, les sections de texte des bibliothèques partagées ne sont lues qu'à partir du disque (si nécessaire), jamais modifiées, elles seront donc dans des pages partagées et propres).
Les pages sales sont des pages qui ne sont pas propres (c'est-à-dire qui ont été modifiées).

Les pages privées ne sont disponibles que pour ce processus, les pages partagées sont mappées par d'autres processus.

RSS est le nombre total de pages, partagées ou non, actuellement mappées dans le processus. Donc Shared_Clean + Shared_Dirty serait la partie partagée du RSS (c'est-à-dire la partie du RSS qui est également mappée dans d'autres processus) et Private_Clean + Private_Dirty la partie privée du RSS (c'est-à-dire mappée uniquement dans ce processus).

PSS (taille de part proportionnelle) est comme vous le décrivez. Les pages privées sont résumées telles quelles et la taille de chaque mappage partagé est divisée par le nombre de processus qui le partagent.
Ainsi, si un processus avait 100 000 pages privées, 500 000 pages partagées avec un autre processus et 500 000 partagées avec quatre d'autres processus, le PSS serait :

100k + (500k / 2) + (500k / 5) = 450k

Lectures complémentaires :

  • ELC :Quelle quantité de mémoire les applications utilisent-elles réellement ?
  • Documentation/filesystems/proc.txt dans les sources du noyau
  • man proc(5)
  • Présentation de la gestion de la mémoire Linux
  • Gestion de la mémoire sur TLDP.org
  • LinuxMM
Connexes :Linux - le drapeau de montage noauto pour ?

Concernant les sommes à l'échelle du processus :

  • RSS peut être (approximativement) obtenu en additionnant les Rss: entrées dans smaps (vous n'avez pas besoin d'additionner les entrées partagées/privées partagées/modifiées).

    awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
    
  • Vous pouvez résumer Pss: valeurs de la même manière, pour obtenir le processus global PSS .
  • USS n'est pas signalé dans smaps , mais en fait, c'est la somme des mappages privés, donc vous pouvez aussi l'obtenir de la même manière

Notez qu'une page « partageable » est considérée comme un mappage privé jusqu'à ce qu'elle soit réellement partagé. c'est-à-dire s'il n'y a qu'un seul processus utilisant actuellement libfoo , la section de texte de cette bibliothèque apparaîtra dans le processus privé mappages. Il sera comptabilisé dans les mappages partagés (et supprimé des mappages privés) uniquement si/quand un autre processus commencera à utiliser cette bibliothèque.
Les valeurs ne s'additionnent pas exactement pour tous les processus. Je ne sais pas exactement pourquoi... désolé.


Linux
  1. Comment obtenir le chemin d'un processus sous Unix / Linux

  2. Comment calculer l'utilisation CPU d'un processus par PID sous Linux à partir de C ?

  3. Nom du processus à partir de son pid sous Linux

  4. Comment savoir à partir de quel dossier un processus est en cours d'exécution ?

  5. Limiter l'utilisation de la mémoire pour un seul processus Linux

Un guide pour le système de fichiers ‘/proc’ sous Linux

Fichiers /proc/cpuinfo et /proc/meminfo sous Linux

Comment puis-je obtenir l'utilisation totale du processeur d'une application à partir de /proc/pid/stat ?

Comment lire depuis /proc/$pid/mem sous Linux ?

Comment l'utilisation de la mémoire est-elle signalée sous Linux ?

Représentation graphique de l'utilisation de la mémoire des processus sous Linux