如何才能测量一组(分叉的)进程占用的总 RSS 内存,而无需重复计算共享和写时复制页面?
答案1
我最终为此编写了自己的实用程序:https://gist.github.com/Eugeny/04ccfe8accf4bc74b0ca
我针对init
(pid 1) 运行了它进行测试,报告的总数大致等于物理内存使用量(根据 htop),所以我猜它有点正确。
使用示例:
~ » pstree -ap 15897
zsh,15897
└─sudo,9783 make rundev
└─make,9784 rundev
└─sh,9785 -c cd ajenti-panel && ./ajenti-panel -v --autologin --plugins ../plugins --dev
└─python ./ajenti,9786
├─./ajenti-panel ,9834
├─./ajenti-panel ,9795
└─{python ./ajenti},9796
~ » sudo ./memuse.py 15897
PID Commandline Frames (+unique) VMEM
- 15897 (/usr/bin/zsh ): 1776 +1776 7104 KB
- 9783 (sudo make rundev ): 608 +408 2432 KB
- 9784 (make rundev ): 261 +98 1044 KB
- 9785 (/bin/sh -c cd ajenti-panel && ): 166 +48 664 KB
- 9786 (python ./ajenti-panel -v --aut): 9279 +8977 37116 KB
- 9795 (./ajenti-panel worker [restric): 7637 +1334 30548 KB
- 9834 (./ajenti-panel worker [session): 8972 +2639 35888 KB
----------------------------------------------------------------------------------------
TOTAL: 15280 61120 KB
答案2
在我所知的任何工具中,没有明确定义的方法来确定哪些进程共享哪些映射,而无需遍历所有映射并比较地址。
然而,Linux 确实提供了合理的估计,即比例集大小。这在 /proc/[pid]>/maps 中有报告。
该值是映射的大小除以打开相同映射的兄弟/父进程的数量。
因此,如果某个程序打开了 1MiB 映射,并与其他 4 个进程共享了 1MiB,则比例集大小为 1MiB + (1MiB / 4) 或 1.250 MiB。在这种情况下,RSS 为 2MiB。
有一个针对 htop 的补丁,它将使用 PSS 来计算实际使用内存的“良好估计值”。