对于 中的给定进程/proc/<pid>/smaps
,对于给定映射条目:
- 共享_清洁
- 共享_脏
- 私人_清洁
- 私人_肮脏
Shared_Clean
+是Shared_Dirty
与其他进程共享的内存量吗?那么它就像共享 RSS 吗?
同样是Private_Clean
+Private_Dirty
内存量仅适用于一个进程?那么它就像私人 RSS 吗?
PSS值=PrivateRSS+(SharedRSS/共享它的进程数)吗?
阅读此链接后还有一些问题:低水温网络
现在让我们谈谈整个过程,我们正在查看其 smaps 条目。
我注意到,如果我对进程的每个 smaps 条目执行Shared_Clean
+ Shared_Dirty
+ Private_Clean
+操作Private_Dirty
,我会得到 所报告的进程的 RSS ps
,这非常酷。例如
ps -p $$ -o pid,rss
将为我提供(大约)与/proc/$$/smaps 中每个Shared_Clean
, Shared_Dirty
, Private_Clean
,条目总和相同的 rss 值。Private_Dirty
但是 PSS 呢?对于整个过程?那么,从上面的示例中,我如何获得 $$ 的 PSS ?我可以为每个 smaps 映射添加 PSS 条目并以 $$ 的价格到达 PSS 吗?
那么美国海军呢对于整个过程?再次以上面的例子为例,我猜测我可以通过仅将每个 smaps 条目的 Private_* 条目相加来以 $$ 到达 USS..对吧?
注:
PSS= 比例设定大小。
USS= 独特的套装尺寸。
答案1
干净页面是自映射以来未曾修改的页面(通常,共享库中的文本部分仅从磁盘读取(必要时),从未修改,因此它们将位于共享的干净页面中)。
脏页是不干净的页面(即已被修改)。
私有页面仅对该进程可用,共享页面由其他进程映射*。
RSS 是当前映射到进程的页面总数(无论是否共享)。因此Shared_Clean
+Shared_Dirty
将是RSS的共享部分(即也映射到其他进程的RSS部分),并且Private_Clean
+是Private_Dirty
RSS的私有部分(即仅映射到该进程中)。
PSS(比例份额大小)正如您所描述的。私有页面按原样汇总,每个共享映射的大小除以共享它的进程数。
因此,如果一个进程有 100k 私有页面、与另一个进程共享的 500k 页面以及与其他四个进程共享的 500k 页面,则 PSS 将为:
100k + (500k / 2) + (500k / 5) = 450k
进一步阅读:
- ELC:应用程序实际使用了多少内存?
Documentation/filesystems/proc.txt
在内核源代码中man proc(5)
- Linux 内存管理概述
- 内存管理在 TLDP.org
- LinuxMM
关于全流程总和:
RSS
可以通过对中的条目求和来获得(大约+)(您不需要将共享/私有共享/脏条目相加)。Rss:
smaps
awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
Pss:
您可以以相同的方式汇总值,以获得 process-globalPSS
。USS
中没有报告smaps
,但实际上,它是私有映射的总和,因此您也可以通过相同的方式获取它
*请注意,“可共享”页面被视为私有映射,直到它被实际上共享。即,如果当前只有一个进程正在使用libfoo
,则该库的文本部分将出现在该进程的私人的映射。仅当另一个进程开始使用该库时,才会将其计入共享映射(并从私有映射中删除)。
+并非所有进程的值都精确相加。不太清楚为什么......抱歉。
答案2
在最近的内核中,/proc/$PID/smaps_rollup
包含整个过程中所有映射的汇总信息(参考:https://docs.kernel.org/filesystems/proc.html)。例如:
Rss: 640096 kB
Pss: 463041 kB
Pss_Dirty: 400291 kB
Pss_Anon: 378836 kB
Pss_File: 62264 kB
Pss_Shmem: 21941 kB
Shared_Clean: 195048 kB
Shared_Dirty: 9560 kB
Private_Clean: 38748 kB
Private_Dirty: 396740 kB
Referenced: 640024 kB
Anonymous: 378836 kB
...