如何在没有写时复制页面的情况下测量内存?

如何在没有写时复制页面的情况下测量内存?

如何才能测量一组(分叉的)进程占用的总 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 来计算实际使用内存的“良好估计值”。

相关内容