继这个问题. 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 之前分配的任何内存的副本(*),但随后分配的任何内存对于该进程而言都是唯一的。
(*)一个真正聪明的操作系统可以避免实际上通过使用写时复制算法,这样只有当任一进程试图更改内存时,才会分配内存。参见这里。