Pour un processus donné dans /proc/<pid>/smaps
, pour une entrée de mappage donnée, quels sont :
- Shared_Clean
- Shared_Dirty
- Private_Clean
- 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 noyauman proc(5)
- Présentation de la gestion de la mémoire Linux
- Gestion de la mémoire sur TLDP.org
- LinuxMM
Concernant les sommes à l'échelle du processus :
-
RSS
peut être (approximativement) obtenu en additionnant lesRss:
entrées danssmaps
(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 globalPSS
. USS
n'est pas signalé danssmaps
, 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é.