Ank*_*wal 55 linux process memory virtual-memory
对于 中的给定进程/proc/<pid>/smaps
,对于给定的映射条目是:
是Shared_Clean
+Shared_Dirty
是与其他进程共享的存储器的量?所以它就像共享RSS?
同样是Private_Clean
+仅可用于一个进程Private_Dirty
的内存量?所以它就像私人RSS?
PSS 值是否 = PrivateRSS +(SharedRSS / 共享它的进程数)?
阅读此链接后还有一些问题:LWN
现在让我们从整体上讨论这个过程,我们正在查看其 smaps 条目。
我注意到,如果我为流程的每个 smaps 条目执行Shared_Clean
+ Shared_Dirty
+ Private_Clean
+ Private_Dirty
,我会得到流程的 RSS 报告ps
,这非常酷。例如
ps -p $$ -o pid,rss
Run Code Online (Sandbox Code Playgroud)
将为我提供与/proc/$$/smaps中每个Shared_Clean
, Shared_Dirty
, Private_Clean
,Private_Dirty
条目的总和(大约)相同的 rss 值。
但是整个过程的PSS呢?那么,从上面的示例中,我如何获得 $$ 的 PSS?我可以为每个 smaps 映射添加 PSS 条目并以 $$ 到达 PSS 吗?
那么整个过程中的USS呢?再次以上面的例子为例,我猜测我可以通过为 $$.. 对每个 smaps 条目仅汇总 Private_* 条目来以 $$ 到达 USS,对吗?
注:
PSS=比例套装尺寸。
USS= 唯一的集合大小。
Mat*_*Mat 58
干净页面是自映射以来未修改的页面(通常,共享库中的文本部分仅从磁盘读取(在必要时),从不修改,因此它们将位于共享的干净页面中)。
脏页面是不干净的页面(即已被修改)。
私有页面仅对该进程可用,共享页面由其他进程映射*。
RSS 是当前映射到进程中的页面总数,无论是否共享。所以Shared_Clean
+Shared_Dirty
将是 RSS 的共享部分(即也映射到其他进程的 RSS 部分),以及Private_Clean
+ Private_Dirty
RSS 的私有部分(即仅在此进程中映射)。
PSS(比例份额大小)如您所描述。私有页面按原样汇总,每个共享映射的大小除以共享它的进程数。
因此,如果一个进程有 100k 个私有页面,500k 个页面与一个其他进程共享,500k 个页面与其他四个进程共享,PSS 将是:
100k + (500k / 2) + (500k / 5) = 450k
Run Code Online (Sandbox Code Playgroud)
进一步阅读:
Documentation/filesystems/proc.txt
在内核源代码中man proc(5)
关于流程范围的总和:
RSS
可以(大约+)通过对中的Rss:
条目求和来获得smaps
(您不需要将共享/私有共享/脏条目相加)。
awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
Run Code Online (Sandbox Code Playgroud)Pss:
以相同的方式总结值,以获得 process-global PSS
。USS
中没有报告smaps
,但确实是私有映射的总和,因此您也可以通过相同的方式获得它*请注意,在实际共享之前,“可共享”页面被视为私有映射。即,如果当前只有一个进程在使用libfoo
,则该库的文本部分将出现在进程的私有映射中。仅当/当另一个进程开始使用该库时,它才会被计入共享映射(并从私有映射中删除)。
+对于所有进程,这些值并不完全相加。不完全确定为什么......抱歉。
归档时间: |
|
查看次数: |
63270 次 |
最近记录: |