Pregunta ¿Cómo medir la memoria sin copiar páginas en la escritura?


¿Cómo se puede medir la memoria RSS total ocupada por un conjunto de procesos (bifurcados), sin contar dos veces las páginas compartidas y de copia en escritura?


8
2018-03-18 08:18


origen


Pregunta muy interesante, +1 - debería ser posible mediante un análisis más profundo de la /proc/*/map Archivos, a pesar de que nunca encontré una herramienta que pudiera hacer eso. El principal problema es que las estructuras de datos a seguir son mucho más complejas como parece. Si no obtiene una buena respuesta aquí, quizás también pueda probar Unix SE. - peterh


Respuestas:


Terminé escribiendo mi propia utilidad para esto: https://gist.github.com/Eugeny/04ccfe8accf4bc74b0ca

Lo corrí contra init (Pid 1) para las pruebas y el total informado es aproximadamente el uso del ram físico (según htop), así que supongo que es algo correcto.

Ejemplo 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

4
2018-03-18 17:07





No hay una forma claramente definida de determinar en ninguna herramienta que conozca qué procesos comparten qué mapas sin iterar a través de todas las asignaciones y comparar direcciones.

Sin embargo, Linux ofrece una estimación razonable conocida como Tamaño proporcional del conjunto. Esto se reporta en / proc / [pid]> / maps.

Este valor es el tamaño de la asignación dividido por el número de hermanos / procesos principales con la misma asignación abierta.

Entonces, con un programa que tiene un mapeo de 1MiB abierto, más un 1MiB compartido con otros 4 procesos, el tamaño del conjunto proporcional es 1MiB + (1Mib / 4) o 1.250 MiB. El RSS en este caso sería 2MiB.

Hay un parche para htop flotante que utilizará el PSS para calcular una "buena estimación" de la memoria real en uso.


2
2018-03-18 22:17