Pour un processus donné dans /proc/<pid>/smaps
, pour une entrée de mappage donnée, quels sont:
Est Shared_Clean
+ Shared_Dirty
la quantité de mémoire partagée avec d'autres processus? C'est comme un RSS partagé?
De même est Private_Clean
+ Private_Dirty
la quantité de mémoire disponible pour un seul processus ? C'est comme un flux RSS privé?
La valeur PSS = PrivateRSS + (SharedRSS/nombre de processus la partageant)?
Quelques questions supplémentaires après avoir lu ce lien: LWN
Maintenant, parlons du processus dans son ensemble, dont nous examinons l'entrée smaps.
J'ai remarqué que si je le fais Shared_Clean
+ Shared_Dirty
+ Private_Clean
+ Private_Dirty
pour chaque entrée smaps pour le processus, j'obtiens le RSS du processus tel que rapporté par ps
, ce qui est plutôt cool. Par exemple.
ps -p $$ -o pid,rss
Me donnera la (approximative) 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 de 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 smaps et arriver à PSS pour $$?
Et qu'en est-il de l'USS pour l'ensemble du processus? 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 $$ .. non?
Remarques:
PSS = Taille de jeu proportionnelle.
USS = Taille unique définie.
Les pages propres sont des pages qui n'ont pas été modifiées depuis qu'elles ont été mappées (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 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 sont disponibles uniquement 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. Ainsi 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 de RSS (c'est-à-dire uniquement mappée 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 la partagent.
Donc, si un processus avait 100 000 pages privées, 500 000 pages partagées avec un autre processus et 500 000 pages partagées avec quatre autres processus, le PSS serait:
100k + (500k / 2) + (500k / 5) = 450k
Lectures complémentaires:
Documentation/filesystems/proc.txt
dans la source du noyauman proc(5)
Concernant les sommes à l'échelle du processus:
RSS
peut être (environ+) obtenu en additionnant les entrées Rss:
dans smaps
(vous n'avez pas besoin d'ajouter les entrées partagées/privées partagées/sales).
awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
Pss:
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, vous pouvez donc également 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 en fait partagée. c'est-à-dire que si un seul processus utilise actuellement libfoo
, la section de texte de cette bibliothèque apparaîtra dans les mappages privé du processus. Elle ne sera prise en compte dans les mappages partagés (et supprimée des mappages privés) que si/quand un autre processus commence à utiliser cette bibliothèque.
+Les valeurs ne s'additionnent pas exactement pour tous les processus. Je ne sais pas exactement pourquoi ... désolé.