从这个问题开始。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
我了解交换栏,RSS 栏是通常报告的内容(例如以 ps 为单位)。通过阅读 smem 文档,听起来 USS 是专门为那个孩子使用的内存,而 PSS 是进程间共享的内存的一部分。但是,将 USS 添加到 PSS 会比 RSS 提供更高的值,我认为共享意味着更少(所以我可能解释不正确)。
我不依赖于 smem 工具。我只是想要某种方式来获得一个“内存使用”数字,该数字在某种程度上准确地反映了进程正在使用的实际内存量。
比例集大小可能是您可用的每个进程内存使用的最佳数字。它是唯一的集合大小+(共享页面/共享进程数)。
因此,一个进程使用了 44176 个页面,其中 19388 个页面是该进程独有的。这意味着 24788 与其他人共享。
将 PSS 视为 USS +(共享权重)。本例中的权重为 8193,即归属于该进程的共享内存页(24788)的比例。您共享页面的应用程序实例越多,每个进程的权重就越低。
您可以跨多个进程对 PSS 求和,并且不会多次计算共享页面。但是,您不能将 USS 和 PSS 相加并期望 RSS,因为 PSS 已经包含 USS。
据我了解(但如果我错了,请有人纠正我),当进程分叉时,只有程序段被共享 - 数据段变得分开。
因此,可执行文件(二进制)和加载的任何共享库将在进程之间共享。
每个进程都将获得在 fork 之前分配的任何内存的自己的副本(*),但随后分配的任何内存对于该进程都是唯一的。
(*) 一个非常聪明的 O/S 可以通过使用写时复制算法避免为子副本实际分配数据段,这样只有在任一进程尝试更改内存时才会分配内存。见这里。