在/proc/pid/smaps中,pss是什么意思?

29

我对/proc/pid/smaps中的Pss列感到困惑,所以我编写了一个测试程序:

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的详细文档?

1个回答

42

引自lwn.net

一个进程的“比例集大小”(PSS)是它在内存中拥有的页面数,其中每个页面都被共享它的进程数所除。因此,如果一个进程独占1000页,另一个进程共享1000页,则它的PSS将为1500。

来自Linux内核文档

/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/PID/maps 中相同的信息。其余行显示映射的大小(size)、当前驻留在RAM中的映射量(RSS)、进程在此映射中的比例份额(PSS)、映射中干净和脏私有页的数量。请注意,即使是一个 MAP_SHARED 映射的页,但只有一个 pte 被映射,即当前仅被一个进程使用,也被视为私有而不是共享的。"Referenced" 表示目前标记为引用或访问的内存量。 "Anonymous" 显示不属于任何文件的内存量。即使与文件相关联的映射也可能包含匿名页面:当 MAP_PRIVATE 并且页面已被修改时,文件页将被替换为私有匿名副本。"Swap" 显示多少虚拟内存被使用,但是已经被交换至交换区。

这个问题Unix and Linux Stackexchange上涵盖了这个主题。请查看Mat的杰出答案,它肯定会解决您所有的疑问。


当我在我的二进制文件上运行smaps时,为什么会看到许多PSS?这是其中一个二进制文件的输出-Locked: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.2.0 大小:144 kB Rss:112 kB Pss:12 kB - dexterous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接