如何确定分叉进程(Linux)使用的内存?

如何确定分叉进程(Linux)使用的内存?

这个问题. Debian,如果这很重要的话。

我知道一些内存在派生进程之间共享。那么我如何确定一个进程/一组派生进程使用了​​多少内存?

使用推荐的 smem 工具这个类似的问题,我得到的值如下:

Command                         Swap      USS      PSS      RSS 
/usr/sbin/spamd --create-pr        0    16820    24974    41628
spamd chil                         0    19388    27581    44176
spamd chil                         0    32328    40038    55708

我理解 swap 列,RSS 列是通常报告的内容(例如在 ps 中)。通过阅读 smem 文档,听起来 USS 是专门用于该子进程的内存,而 PSS 是进程间共享的内存的一部分。但是,将 USS 添加到 PSS 会给出比 RSS 更高的值,而我认为共享意味着更少(所以我可能理解错了)。

我并不依赖 smem 工具。我只是想通过某种方式获取“内存使用量”数字,以便准确反映进程实际使用的内存量。

答案1

比例集大小可能是您可用的每个进程内存使用量的最佳数字。它是唯一集大小 +(共享页面/共享进程数)。

因此,一个进程使用了​​ 44176 个页面,其中 19388 个页面是该进程独有的。这意味着 24788 个页面与其他页面共享。

将 PSS 视为 USS +(共享权重)。本例中的权重为 8193,即归属于此进程的共享内存页面(24788)的比例。共享页面的应用程序实例越多,每个进程的权重就越低。

您可以对多个进程的 PSS 求和,并且不会多次计算共享页面。但是,您不能对 USS 和 PSS 求和并期望 RSS,因为 PSS 已经包含 USS。

答案2

据我了解(但如果我错了,请纠正我),当进程分叉时,只有程序段是共享的 - 数据段变得分开。

因此,可执行文件(二进制)和任何加载的共享库将在进程之间共享。

每个进程都将获得在 fork 之前分配的任何内存的副本(*),但随后分配的任何内存对于该进程而言都是唯一的。

(*)一个真正聪明的操作系统可以避免实际上通过使用写时复制算法,这样只有当任一进程试图更改内存时,才会分配内存。参见这里。

相关内容