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

46

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-ce que Shared_Clean+ Shared_Dirtyla quantité de mémoire partagée avec d'autres processus? Donc, c'est comme RSS partagé?

Est-ce que Private_Clean+ est Private_Dirtyla quantité de mémoire disponible pour un seul processus ? Donc, c'est comme RSS privé?

La valeur de PSS = PrivateRSS + (SharedRSS / nombre de processus la 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_Dirtypour 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 donner (environ) même valeur pour rss comme la somme de tous Shared_Clean, Shared_Dirty, Private_Clean, Private_Dirtyentrée dans / proc / $$ / smaps.

Mais qu'en est-il des PSS pour l'ensemble du processus? Ainsi, à partir de l'exemple ci-dessus, comment puis-je obtenir le PSS pour $$? Puis-je simplement ajouter l'entrée PSS pour chaque mappage de 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 résumant uniquement les entrées Private_ * pour chaque entrée smaps pour $$ .. n'est-ce pas?

Remarques:
PSS = Taille du jeu proportionnel.
USS = Taille de jeu unique.

Ankur Agarwal
la source

Réponses:

50

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 que sur le disque (si nécessaire), jamais modifiées, elles seront donc dans des pages propres et partagées).
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 correspond au nombre total de pages, partagées ou non, actuellement mappées dans le processus. So Shared_Clean+ Shared_Dirtyserait la partie partagée du RSS (c'est-à-dire la partie de RSS qui est également mappée dans d'autres processus), et Private_Clean+ Private_Dirtyla partie privée de RSS (c'est-à-dire uniquement mappée dans ce processus).

PSS (taille de part proportionnelle) est comme vous 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 comportait 100 000 pages privées, 500 000 pages partagées avec un autre processus et 500 000 partagées avec quatre autres processus, le PSS serait:

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

Lectures supplémentaires:

En ce qui concerne les sommes globales du processus:

  • RSSpeut être obtenu (approximativement + ) en additionnant les Rss:entrées smaps(vous n'avez pas besoin d'ajouter les entrées shared / private shared / dirty).

    awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
    
  • Vous pouvez résumer les Pss:valeurs de la même manière, pour obtenir un processus global PSS.
  • USSn'est pas signalé dans smaps, mais en effet, c'est la somme des mappages privés, de sorte que vous pouvez 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ée. Autrement dit, si un seul processus est en cours d'utilisation libfoo, la section de texte de cette bibliothèque apparaîtra dans les mappages privés du processus . Il ne sera pris en compte dans les mappages partagés (et supprimés des fichiers privés) que si / lorsqu'un autre processus commence à utiliser cette bibliothèque.
+ Les valeurs ne correspondent pas exactement pour tous les processus. Je ne sais pas trop pourquoi ... désolé.

Tapis
la source
Merci pour la bonne réponse. L'apprécier. J'ai lu l'article de LWM et cela m'a inspiré à poser quelques questions supplémentaires, alors je les ai ajoutées à ma question ci-dessus.
Ankur Agarwal
Génial! c'est très très utile !!
camino
Je ne suis toujours pas confus à propos de shared_dirty - la nature sale de cette action empêche-t-elle encore d'être partagée?
Kevin
@ Kevin: s'ils n'étaient pas partagés, ils ne seraient pas comptabilisés Shared_Dirty- pourriez-vous clarifier votre question?
Mat
sale signifie modifié depuis l'orig. processus, non? qu'est-ce qui ne passe pas du partage au local?
Kevin