从 /proc/pid/smaps 获取有关进程内存使用情况的信息

从 /proc/pid/smaps 获取有关进程内存使用情况的信息

对于 中的给定进程/proc/<pid>/smaps,对于给定映射条目:

  1. 共享_清洁
  2. 共享_脏
  3. 私人_清洁
  4. 私人_肮脏

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_DirtyRSS的私有部分(即仅映射到该进程中)。

PSS(比例份额大小)正如您所描述的。私有页面按原样汇总,每个共享映射的大小除以共享它的进程数。
因此,如果一个进程有 100k 私有页面、与另一个进程共享的 500k 页面以及与其他四个进程共享的 500k 页面,则 PSS 将为:

100k + (500k / 2) + (500k / 5) = 450k

进一步阅读:

关于全流程总和:

  • RSS可以通过对中的条目求和来获得(大约+)(您不需要将共享/私有共享/脏条目相加)。Rss:smaps

    awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
    
  • Pss:您可以以相同的方式汇总值,以获得 process-global PSS
  • 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
...

相关内容