¿Cómo medir la memoria sin páginas de copia en escritura?

8

¿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?

Eugene Pankov
fuente
1
Pregunta muy interesante, +1: debería ser posible mediante un análisis más profundo de los /proc/*/maparchivos, 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 parecen. Si no obtienes una buena respuesta aquí, quizás también puedas probar unix SE.
peterh - Restablecer Monica

Respuestas:

4

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

Lo ejecuté contra init(pid 1) para probar y el total reportado es más o menos igual al uso físico de RAM (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
Eugene Pankov
fuente
2

No existe 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 el tamaño del conjunto proporcional . Esto se informa en / proc / [pid]> / maps.

Este valor es el tamaño del mapeo dividido por el número de procesos hermanos / padres con el mismo mapeo abierto.

Entonces, con un programa que tiene una asignación de 1MiB abierta, 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 de 2MiB.

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

Matthew Ife
fuente