Comment mesurer la mémoire sans pages de copie sur écriture?

8

Comment mesurer la mémoire RSS totale occupée par un ensemble de processus (fourchus), sans compter deux fois les pages partagées et les copies sur écriture?

Eugene Pankov
la source
1
Question très intéressante, +1 - cela devrait être possible par une analyse plus approfondie des /proc/*/mapfichiers, même si je n'ai jamais trouvé d'outil qui pourrait le faire. Le principal problème est que les structures de données à suivre sont beaucoup plus complexes qu'elles ne le semblent. Si vous n'obtenez pas une bonne réponse ici, vous pouvez aussi essayer unix SE.
peterh

Réponses:

4

J'ai fini par écrire mon propre utilitaire pour cela: https://gist.github.com/Eugeny/04ccfe8accf4bc74b0ca

Je l'ai exécuté contre init(pid 1) pour les tests et le total rapporté équivaut à peu près à l'utilisation physique du ram (selon htop), donc je suppose que c'est quelque peu correct.

Exemple d'utilisation:

~ » 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
la source
2

Il n'y a aucun moyen clairement défini de déterminer dans un outil que je connais quels processus partagent quelles cartes sans itérer à travers tous les mappages et comparer les adresses.

Cependant, Linux offre une estimation raisonnable connue sous le nom de taille de jeu proportionnelle . Ceci est rapporté dans / proc / [pid]> / maps.

Cette valeur est la taille du mappage divisée par le nombre de frères et sœurs / processus parents avec le même mappage ouvert.

Ainsi, avec un programme qui a un mappage de 1 Mo ouvert, plus un 1 Mo partagé avec 4 autres processus, la taille de jeu proportionnelle est de 1 Mo + 1 (1 Mo / 4) ou 1 250 Mo. Le RSS dans ce cas serait de 2 Mo.

Il existe un patch pour htop flottant qui utilisera le PSS pour calculer une «bonne estimation» de la mémoire réelle utilisée.

Matthew Ife
la source