2012-03-29 17 views
15

我混淆了有关在PSS列的/ proc/PID/smaps,所以我写了一个程序来测试它:什么PSS意味着在/ 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 

这里我发现pss等于Private_Dirty,但我想知道为什么。

顺便提一下:有没有关于smaps的详细资料?

回答

27

lwn.net

“比例设定大小”(PSS)的过程的引用是,其中每个页面由 进程共享它的数量除以它在存储器 页计数。因此,如果一个进程有1000页中的所有其自身, 和1000与一个其他进程共享,其PSS将是1500

Linux Kernel Documentation

/proc/PID/smaps是基于在地图上的一个延伸,示出了存储器每个进程映射的消耗量为 。对于每一个映射那里 是一系列的线,如下面的:

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 

第一这些线示出了如在/proc /进程/地图显示 该映射的相同的信息。其余行示出的映射的大小 (大小),即目前 驻留在RAM的映射的量(RSS),则处理这个映射 (PSS)的比例的份额,所述映射中干净和肮脏的私人页面的数量。 请注意,即使是作为映射的一部分的页面,但是具有 的只有单个映射的pte,即当前仅由一个进程 使用的页面被认为是私有的而不是共享的。 “引用”表示当前标记为引用或访问的内存量为 。 “Anonymous”显示不属于任何 文件的内存量。即使与文件关联的映射也可能包含匿名 页面:当MAP_PRIVATE页面被修改时,文件页面被 替换为私有匿名副本。 “Swap”显示将使用多少个 匿名存储器,但使用swap。

This Question关于Unix and Linux Stackexchange涵盖了几乎所有的主题。看到马特的优秀答案,肯定会清除你所有的疑惑。

+0

为什么我会在我的二进制文件上运行smaps时看到很多PSS。这是一个二进制锁定的输出:0 kB 77afd000-77afe000 r - p 00007000 00:0e 20581089 /lib/ld-uClibc-0.9.33.2.so。我是否需要添加所有PSS来实际计算二进制文件占用的大小?这个大小是否等于RAM中占用的大小? 大小:4 kB Rss:4 kB Pss:4 kB Private_Dirty:4 kB引用:4 kB 匿名:4 kB AnonHugePages:0 kB 77ab2000-77ad6000 r-xp 00000000 00:0e 20711467/usr/lib/libdbus- glib-1.so.2.0.0 大小:144 kB Rss:112 kB Pss:12 kB – 2013-11-14 12:11:42