
Angenommen, ich habe einen Prozess, der 200 MB Speicher nutzt, und er führt eine Fork()-Operation aus:
python -c "import os; data='x'*200000000; os.fork(); raw_input()"
Programme wie „top“ zeigen, dass jeder Prozess 200 MB verwendet, mit sehr wenig SHRd-Speicher, 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, verwenden die Prozesse in Wirklichkeit insgesamt nur 200 MB.
Warum zeigt top nicht an, welcher Anteil 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 erwarte. Meine Frage bezieht sich auf Linux.
Antwort1
Solche Informationen können Sie der /proc/<pid>/smaps
Datei in Form des Pss
Eintrags (kurz für „Proportionale Anteilsgröße“) für jeden Prozess entnehmen.
Im obigen Beispiel mit 200 MB, die zwischen zwei Prozessen „geteilt“ werden, würde jeder Prozess im PSS-Eintrag für diese Zuordnung 100 MB anzeigen, d. h. der Speicher wird gleichmäßig zwischen den Prozessen verteilt, die ihn teilen (bis er kopiert und von einem der Prozesse die Freigabe aufgehoben wird).
Hier ist ein Auszug aus einem Beispiel, das dem ähnelt, was 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
...
(Da ist einvielvon Sachen in diesen Dateien, einschließlich Zuordnungen für gemeinsam genutzte Bibliotheken, die potenziell von vielen Prozessen gemeinsam genutzt werden, und daher wird jedem Prozess in seinem PSS-Eintrag nur ein kleiner Teil davon berücksichtigt.)
Hier ist ein schöner Artikel dazu: ELC:Wie viel Speicher verwenden Anwendungen wirklich?
Ich kenne kein gängiges top-ähnliches Tool, um diese Informationen anzuzeigen, und ich glaube ps
leider auch nicht, dass es Optionen dafür gibt. Der Artikel verweist auf ein Repository mit Python-Skripten namenspagemap
von Matt Mackall, das Sie jedoch verwenden oder anpassen könnten.
Unverhohlene Werbung: Sie finden einige Beiträge aufUnix und Linuxüber PSS und die smaps
Datei, falls Sie daran interessiert sind.