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


46

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

  1. Shared_Clean
  2. Shared_Dirty
  3. 私人清洁
  4. 私人脏话

Shared_Clean+ Shared_Dirty与其他进程共享的内存量吗?就像共享RSS?

同样,Private_Clean+ 仅可用于一个进程Private_Dirty的内存量吗?就像私人RSS?

PSS值是否= PrivateRSS +(SharedRSS /共享它的进程数)?

阅读此链接后还有其他问题:LWN

现在,让我们讨论整个过程,我们正在查看其smap条目。

我注意到,如果我这样做Shared_Clean+ Shared_Dirty+ Private_Clean+ Private_Dirty,每smaps条目的过程中,我得到的报告过程中的RSS ps,这是很酷。例如

ps -p $$ -o pid,rss

能不能给我的RSS的(约)相同的值的每一个总和Shared_CleanShared_DirtyPrivate_CleanPrivate_Dirty在/ proc / $$ / smaps项。

但是整个过程的PSS呢?因此,从上面的示例中,如何获得$$的PSS?我可以为每个smap映射添加PSS条目,然后以$$的价格到达PSS吗?

那么在整个过程中USS呢?再次以上述示例为例,我猜想我可以通过对$$ ..的每个smaps条目仅汇总Private_ *条目来以$$到达USS。

注意:
PSS =比例设置大小。
USS =唯一的集合大小。

Answers:


50

干净页面是指自映射以来从未被修改过的页面(通常,共享库中的文本部分仅从磁盘上读取(必要时),而从未被修改,因此它们将位于共享的干净页面中)。
脏页面是指不干净(即已被修改)的页面。

专用页面仅对该进程可用,共享页面由其他进程*映射。

RSS是当前映射到进程中的页面总数(共享或不共享)。因此Shared_Clean+ Shared_Dirty将是RSS的共享部分(即RSS的一部分,也映射到其他进程),而Private_Clean+ Private_Dirty是RSS的私有部分(即仅在此进程中映射)。

PSS(比例份额)就是您所描述的。私有页面按原样汇总,每个共享映射的大小除以共享它的进程数。
因此,如果一个进程有10万个私有页面,与另一个进程共享50万个页面,与其他四个进程共享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,则该库的文本部分将出现在该进程的私有映射中。仅当/当另一个进程开始使用该库时,它将在共享映射中考虑(并从私有映射中删除)。
+这些值并非对所有过程都完全相同。不确定原因...抱歉。


感谢您的出色回答。欣赏它。我读了LWM文章,这启发了我再问几个问题,因此我将它们添加到上面的问题中。
Ankur Agarwal'3

大!这是非常非常有帮助的!
卡米诺2012年

我仍然对shared_dirty感到困惑-这样的肮脏本质会阻止它仍然被共享吗?
凯文

@Kevin:如果不共享它们,则不会被考虑在内Shared_Dirty-您能澄清您的问题吗?
马太福音

脏是指从原件修改而来。过程,对不对?这不是从共享到本地化的过程吗?
凯文
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.