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

Ank*_*wal 55 linux process memory virtual-memory

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

  1. Shared_Clean
  2. Shared_Dirty
  3. Private_Clean
  4. Private_Dirty

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

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

100k + (500k / 2) + (500k / 5) = 450k
Run Code Online (Sandbox Code Playgroud)

进一步阅读:

关于流程范围的总和:

  • 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,则该库的文本部分将出现在进程的私有映射中。仅当/当另一个进程开始使用该库时,它才会被计入共享映射(并从私有映射中删除)。
+对于所有进程,这些值并不完全相加。不完全确定为什么......抱歉。