Wie messen Sie den Speicherbedarf einer Reihe von gegabelten Prozessen?

8

Angenommen, ich habe einen Prozess mit 200 MB Speicher und es gibt fork () s:

python -c "import os; data='x'*200000000; os.fork(); raw_input()"

Programme wie 'top' zeigen jeden Prozess mit 200 MB und sehr wenig SHRd-Speicher an, sodass es so aussieht, als würden die Prozesse insgesamt 400 MB verwenden. Da fork () jedoch Copy-on-Write (COW) für die Speicherseiten des Prozesses implementiert, werden in der Realität insgesamt nur 200 MB verwendet.

Warum zeigt oben nicht, welcher Teil des Speichers COW ist? Gibt es eine Möglichkeit, dies zu erreichen? Oder gibt es einen anderen Befehl, den ich stattdessen verwenden kann?

Hinweis: 'top' unter OSX scheint eine RSHRD-Spalte zu haben, die das tut, was ich erwarten würde. Meine Frage ist für Linux.

Dustin Boswell
quelle

Antworten:

5

Sie können diese Art von Informationen aus der /proc/<pid>/smapsDatei für jeden Prozess in Form des PssEintrags abrufen (kurz für "Proportional Share Size").

Im obigen Beispiel mit 200 MB, die von zwei Prozessen "gemeinsam genutzt" werden, würde jeder Prozess 100 MB im PSS-Eintrag für diese Zuordnung anzeigen, dh der Speicher wird gleichmäßig auf die Prozesse verteilt, die ihn gemeinsam nutzen (bis er von beiden Prozessen kopiert und freigegeben wird).

Hier ist ein Auszug aus dem Ausführen von etwas, das Sie gepostet haben:

$ top
...
30986 me        20   0  790m 769m 2200 S    0  4.8   0:00.48 python3.2
30987 me        20   0  790m 767m  224 S    0  4.8   0:00.00 python3.2
$ cat /proc/30986/smaps
...
0119a000-015b7000 rw-p 00000000 00:00 0                                  [heap]
Size:               4212 kB
Rss:                3924 kB
Pss:                1992 kB
...
7fa06b020000-7fa09ab11000 rw-p 00000000 00:00 0 
Size:             781252 kB
Rss:              781252 kB
Pss:              390626 kB
...
7fff8e45a000-7fff8e489000 rw-p 00000000 00:00 0                          [stack]
Size:                192 kB
Rss:                 160 kB
Pss:                  82 kB
...

( Diese Dateien enthalten eine Menge Dinge, einschließlich Zuordnungen für gemeinsam genutzte Bibliotheken, die möglicherweise von vielen Prozessen gemeinsam genutzt werden. Daher wird für jeden Prozess nur ein kleiner Teil in seinem PSS-Eintrag für diese berücksichtigt.)

Hier ist ein schöner Artikel dazu: ELC: Wie viel Speicher verwenden Anwendungen wirklich?

Ich kenne kein allgemeines Top-ähnliches Tool zum Anzeigen dieser Informationen, und ich glaube, pses gibt leider auch keine Optionen, um dies anzuzeigen . Der Artikel verweist auf ein Repository mit Python-Skripten, die pagemapvon Matt Mackall aufgerufen wurden und das Sie jedoch verwenden oder anpassen können.

Schamloser Plug: Unter Unix & Linux finden Sie einige Beiträge zu PSS und der smapsDatei, wenn Sie daran interessiert sind.

Matte
quelle