web-dev-qa-db-fra.com

Que signifie pss dans / proc / pid / smaps

J'étais confus à propos de la colonne pss dans/proc/pid/smaps, j'ai donc écrit un programme pour le tester:

void sa();
int main(int argc,char *argv[])
{
    int fd;
    sa();
    sleep(1000);
}

void sa()
{
   char *pi=new char[1024*1024*10];
   for(int i=0;i<4;++i) {
        for(int j=0;j<1024*1024;++j){
                *pi='o';
                pi++;
        }
   }
   int cnt;
   for(int i=0;i<6;++i) {
        for(int j=0;j<1024*1024;++j){
                cnt+=*pi;
                pi++;
        }
   }
   printf("%d",cnt);
}
$cat /proc/`pidof testprogram`/smaps

08838000-0885b000 rw-p 00000000 00:00 0          [heap]
Size:                140 kB
Rss:                  12 kB
Pss:                  12 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        12 kB
Referenced:           12 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
b6dcd000-b77d0000 rw-p 00000000 00:00 0 
Size:              10252 kB
Rss:               10252 kB
Pss:                4108 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:      4108 kB
Referenced:         4108 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB

Ici, j'ai trouvé pss égal à Private_Dirty, mais je me demande pourquoi.

BTW: existe-t-il une documentation détaillée pour smaps?

19
camino

Citant de lwn.net

La "taille de jeu proportionnelle" (PSS) d'un processus est le nombre de pages qu'il a en mémoire, où chaque page est divisée par le nombre de processus qui la partagent. Donc, si un processus a 1000 pages pour lui-même et 1000 partagées avec un autre processus, son PSS sera de 1500

De Documentation du noyau Linux ,

Le /proc/PID/smaps est une extension basée sur des cartes, montrant la consommation de mémoire pour chacun des mappages du processus. Pour chacun des mappages, il existe une série de lignes telles que les suivantes:

08048000-080bc000 r-xp 00000000 03:02 13130      /bin/bash
Size:               1084 kB
Rss:                 892 kB
Pss:                 374 kB
Shared_Clean:        892 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:          892 kB
Anonymous:             0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:              374 kB

La première de ces lignes affiche les mêmes informations que celles affichées pour le mappage dans /proc/PID/maps. Les lignes restantes indiquent la taille du mappage ( taille), la quantité du mappage qui réside actuellement dans RAM ( [~ # ~] rss [~ # ~]), la part proportionnelle du processus de ce mappage ( [~ # ~] pss [~ # ~]), le nombre de nettoyages et des pages privées sales dans le mappage. Notez que même une page qui fait partie d'un mappage MAP_SHARED, mais qui n'a qu'un seul pte mappé, c'est-à-dire qui n'est actuellement utilisée que par un seul processus, est considérée comme privée et non comme partagée. " Référencé" indique la quantité de mémoire actuellement marquée comme référencée ou accessible. " Anonymous" indique la quantité de mémoire qui n'appartient à aucun fichier. Même un mappage associé à un fichier peut contenir des pages anonymes: lorsque MAP_PRIVATE et qu'une page est modifiée, la page du fichier est remplacée par une copie anonyme privée. " Swap" indique la quantité de mémoire qui serait également anonyme, mais non échangeable.

Cette question le Unix and Linux Stackexchange couvre presque le sujet. Voir l'excellente réponse de Mat qui effacera sûrement tous vos doutes.

32
Pavan Manjunath