Como medir a memória sem copiar-sobre-escrever páginas?

8

Como medir a memória RSS total ocupada por um conjunto de processos (bifurcados), sem contar duas vezes as páginas compartilhadas e a cópia na gravação?

Eugene Pankov
fonte
1
Pergunta muito interessante, +1 - deve ser possível uma análise mais profunda dos /proc/*/maparquivos, apesar de eu nunca encontrar uma ferramenta que possa fazer isso. O principal problema é que as estruturas de dados a seguir são muito mais complexas quanto parecem. Se você não receber uma resposta legal aqui, talvez você também possa experimentar o Unix SE.
peterh - Restabelece Monica

Respostas:

4

Acabei escrevendo meu próprio utilitário para isso: https://gist.github.com/Eugeny/04ccfe8accf4bc74b0ca

Eu o executei init(pid 1) para testes e o total relatado é aproximadamente igual ao uso físico de ram (conforme htop), então acho que é um pouco correto.

Exemplo de uso:

~ » 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
Eugene Pankov
fonte
2

Não há uma maneira claramente definida de determinar em qualquer ferramenta que eu conheça quais processos compartilham quais mapas sem iterar através de todos os mapeamentos e comparar endereços.

No entanto, o linux oferece uma estimativa razoável, conhecida como tamanho do conjunto proporcional . Isso é relatado em / proc / [pid]> / maps.

Este valor é o tamanho do mapeamento dividido pelo número de irmãos / processos-pai com o mesmo mapeamento aberto.

Portanto, com um programa que possui um mapeamento de 1MiB aberto, mais um 1MiB compartilhado com outros 4 processos, o tamanho proporcional do conjunto é 1MiB + (1Mib / 4) ou 1.250 MiB. O RSS nesse caso seria 2MiB.

Existe um patch para o htop flutuando em torno do qual usará o PSS para calcular uma 'boa estimativa' da memória real em uso.

Matthew Ife
fonte