/proc/pid/smaps 中的 pss 是啥意思

Posted

技术标签:

【中文标题】/proc/pid/smaps 中的 pss 是啥意思【英文标题】:What does pss mean in /proc/pid/smaps/proc/pid/smaps 中的 pss 是什么意思 【发布时间】:2012-04-12 22:55:41 【问题描述】:

我对@9​​87654322@中的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】:

引用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/PID/maps 中的映射。其余行显示大小 映射的大小(size),当前映射的数量 驻留在 RAM (RSS) 中,进程在此映射中的比例份额 (PSS),映射中干净和脏私有页面的数量。 请注意,即使是 MAP_SHARED 映射的一部分,但具有 只有一个 pte 映射,即当前仅由一个进程使用, 被视为私有而不是共享。 “引用”表示 当前标记为已引用或已访问的内存量。 “Anonymous”显示不属于任何人的内存量 文件。甚至与文件关联的映射也可能包含匿名 pages:当MAP_PRIVATE页面被修改时,文件页面为 取而代之的是私人匿名副本。 “Swap”显示了多少 还使用了可能是匿名的内存,但在交换时用完了。

This Question on Unix and Linux Stackexchange 几乎涵盖了这个主题。请参阅 Mat 的出色答案,这肯定会消除您的所有疑虑。

【讨论】:

为什么我在二进制文件上运行 smap 时会看到很多 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

以上是关于/proc/pid/smaps 中的 pss 是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

使用 awk 解析 /proc/pid/smaps

linux /proc/$pid/smaps 文件中各个字段代表啥含义

dumpsys meminfo数据与smaps文件对应关系

面试系列——内存,CPU,帧率采集原理总结

面试系列——内存,CPU,帧率采集原理总结

JVM内存问题定位