Wie kann der Speicher ohne Copy-on-Write-Seiten gemessen werden?

8

Wie kann der gesamte RSS-Speicher gemessen werden, der von einer Reihe von (gegabelten) Prozessen belegt wird, ohne gemeinsam genutzte Seiten und Seiten, die beim Schreiben kopiert werden, doppelt zu zählen?

Eugene Pankov
quelle
1
Sehr interessante Frage, +1 - es sollte durch eine eingehendere Analyse der /proc/*/mapDateien möglich sein, obwohl ich nie ein Tool gefunden habe, das das könnte. Das Hauptproblem besteht darin, dass die zu verfolgenden Datenstrukturen viel komplexer sind, als es scheint. Wenn Sie hier keine nette Antwort erhalten, können Sie vielleicht auch Unix SE ausprobieren.
Peterh - Wiedereinsetzung Monica

Antworten:

4

Am Ende habe ich mein eigenes Dienstprogramm dafür geschrieben: https://gist.github.com/Eugeny/04ccfe8accf4bc74b0ca

Ich habe es initzum Testen gegen (pid 1) ausgeführt und die gemeldete Summe entspricht in etwa der physischen RAM-Nutzung (gemäß htop), also denke ich, dass es etwas korrekt ist.

Anwendungsbeispiel:

~ » 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
quelle
2

In keinem mir bekannten Tool gibt es eine klar definierte Methode, um festzustellen, welche Prozesse welche Zuordnungen gemeinsam nutzen, ohne alle Zuordnungen zu durchlaufen und Adressen zu vergleichen.

Linux bietet jedoch eine vernünftige Schätzung, die als Proportional-Set-Größe bezeichnet wird . Dies wird in / proc / [pid]> / maps gemeldet.

Dieser Wert ist die Größe der Zuordnung geteilt durch die Anzahl der Geschwister / übergeordneten Prozesse mit derselben geöffneten Zuordnung.

Bei einem Programm mit einer offenen 1-MB-Zuordnung und einer 1-MB-Zuordnung, die mit 4 anderen Prozessen gemeinsam genutzt wird, beträgt die proportionale Satzgröße 1 MB + (1 MB / 4) oder 1,250 MiB. Das RSS in diesem Fall wäre 2MiB.

Es gibt einen Patch für htop, der mithilfe der PSS eine "gute Schätzung" des tatsächlich verwendeten Speichers berechnet.

Matthew Ife
quelle