继续这个问题 。 Debian,如果有关系的话。
我明白有些内存是在分叉进程之间共享的。 那么我怎么能确定一个进程/一组分叉进程使用了多less内存呢?
使用这个类似问题中推荐的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更高的价值,我认为共享意味着更less(所以我想大概解释不正确)。
我没有和这个工具绑在一起 我只是想获得一个“内存使用”数字的方式,有点准确地反映了进程正在使用的实际内存量。
比例组大小可能是您可用的每个进程的最佳内存使用量。 这是唯一的设置大小+(共享页面/共享stream程的数量)。
所以一个进程已经使用了44176个页面,其中19388个对于这个进程是独一无二的。 这意味着24788与其他人共享。
将PSS视为USS +(分担权重)。 这种情况下的权重是8193,这是归因于该过程的共享内存页面(24788)的比例。 您共享页面的应用程序越多,每个进程的权重就越低。
您可以在多个进程中对PSS进行求和,并且不会多次对共享页计数。 但是,您不能总结USS和PSS,并期望RSS,因为PSS已经包含了USS。
据我所知(但有人请纠正我,如果我错了),只有程序段共享时,一个进程分叉 – 数据段成为分开。
因此,可执行(二进制)和任何加载的共享库将在进程之间共享。
每个进程都将得到自己在fork之前分配的内存的副本(*),但随后分配的内存对于该进程将是唯一的。
(*)一个非常聪明的操作系统可以避免必须通过在写入algorithm上使用拷贝来为孩子的副本实际分配数据段,以便只有当任一进程试图改变它时才分配内存。 看到这里。