2012-03-29 11 views
15

me estaba confundiendo sobre la columna de la PSS en/proc/PID/smaps, así que escribí un programa para probarlo:lo que quiere decir pss en/proc/PID/smaps

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 

Aquí encontré pss igual a Private_Dirty, pero me pregunto por qué.

BTW: ¿hay alguna documentación detallada para smaps?

Respuesta

27

Citando lwn.net

El "tamaño proporcional conjunto" (PSS) de un proceso es el recuento de páginas que tiene en la memoria, donde cada página se divide por el número de procesos compartirlo. Así que si un proceso tiene 1000 páginas todos a sí mismo, y 1000 compartido con otro proceso, su PSS será 1500

De Linux Kernel Documentation,

El /proc/PID/smaps es una extensión basada en mapas, mostrando la memoria consumo para cada una de las asignaciones del proceso. Para cada una de las asignaciones de allí es una serie de líneas tales como las siguientes:

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 primera de estas líneas muestra la misma información que se visualiza para el mapeo en /proc/PID/mapas . Las líneas restantes muestran el tamaño de la aplicación (tamaño), la cantidad de la asignación que se encuentra actualmente residente en la memoria RAM (RSS), el proceso parte proporcional de este mapeo (PSS), el número de páginas privadas limpias y sucias en la asignación. Tenga en cuenta que incluso una página que forma parte de una asignación MAP_SHARED, pero tiene solo un solo pte asignado, es decir, actualmente se utiliza solo en un proceso, se considera como privado y no como compartido. "Referenciado" indica la cantidad de memoria actualmente marcada como referencia o acceso. "Anónimo" muestra la cantidad de memoria que no pertenece a ningún archivo . Incluso una asignación asociada a un archivo puede contener páginas anónimas : cuando MAP_PRIVATE y una página se modifica, la página del archivo es reemplazada por una copia privada anónima. "Swap" muestra cuánto sería la memoria anónima también se utiliza, pero fuera de swap.

This Question en Unix and Linux Stackexchange cubre casi el tema. Vea la excelente respuesta de Mat que seguramente aclarará todas sus dudas.

+0

¿Por qué veo muchos PSS cuando ejecuto los smaps en mi binario? Aquí está la salida de uno de los binarios -Locked: 0 kB 77afd000-77afe000 r - p 00007000 00: 0e 20581089 /lib/ld-uClibc-0.9.33.2.so.¿Debo agregar todo el PSS para calcular el tamaño tomado por el binario? ¿Es este tamaño igual al tamaño ocupado en la RAM? Tamaño: 4 kB RSS: 4 kB Pss: 4 kB Private_Dirty: 4 kB Referencia: 4 kB Anónimo: 4 kB AnonHugePages: 0 kB 77ab2000-77ad6000 r-xp 00000000 00: 20711467 0e/usr/lib/libdbus- glib-1.so.2.2.0 Tamaño: 144 kB Rss: 112 kB Pss: 12 kB –

Cuestiones relacionadas