2012-05-16 5 views
9

Wenn es ein Prozess ist, der eine große Datei liest und speichert sie in seinem Speicher (oder nur ein malloced char *), und das Hauptverfahren gegabelt ist, wenn das Kind Prozess nur aus diesem Speicher liest (oder char *), Gemäß Copy-on-Write wird der Speicher, in dem der Zeiger gespeichert ist, nicht kopiert, und Eltern und Kind teilen den gleichen Speicher, bis einer von ihnen versucht, in diesen Speicher zu schreiben. In diesem Fall erstellt der Prozess eine Kopie des Speichers und ändert das.Wie findet man heraus, wie viel Speicher zwischen gegabelten Prozessen mit Copy-on-Write unter Linux geteilt wird?

So ist meine Frage, ob es eine Copy-on-Schreib implementiert ist, ist es eine Möglichkeit, die Größe des Speichers zu wissen, dass das Kind das verwendet wird, nicht mit dem Hauptprozess geteilt? Mit anderen Worten, wie viel Speicher verwendet ein Child-Prozess tatsächlich, wenn er Elternspeicher von einigen Leseaufrufen verwendet?

oben oder ps-Befehle werden nur die Gesamtspeichermenge geben, die das Kind haben soll. (d. h. Annahme, dass Daten im Speicher oder Zeiger vom Kind kopiert werden.)

Gibt es eine Möglichkeit, die Datenmenge zu ermitteln, die tatsächlich von CoW-Semantik verwendet wird?

Ich ging durch /proc/[pid]/smaps wie aix und Mat vorgeschlagen, aber alles, was ich war viele leere smaps Dateien gefunden. Ich habe versucht, diesen Befehl zu finden, welche Dateien Daten in ihnen hat: tail -n 5 */smaps | less Und das o/p, die ich erhielt, war

==> 1012/smaps <== 

==> 1074/smaps <== 

==> 10/smaps <== 

==> 1148/smaps <== 

==> 11862/smaps <== 

==> 11/smaps <== 

==> 1355/smaps <== 

==> 1356/smaps <== 

==> 1357/smaps <== 

==> 1358/smaps <== 

==> 1361/smaps <== 

==> 13/smaps <== 

==> 14900/smaps <== 

==> 14/smaps <== 

==> 1501/smaps <== 

==> 15/smaps <== 

==> 1684/smaps <== 

==> 1685/smaps <== 

==> 16/smaps <== 

==> 17772/smaps <== 

==> 17827/smaps <== 

==> 17/smaps <== 

==> 18490/smaps <== 

==> 18/smaps <== 

==> 1932/smaps <== 

==> 1934/smaps <== 

==> 19863/smaps <== 

==> 19/smaps <== 

==> 1/smaps <== 

==> 20125/smaps <== 

==> 20126/smaps <== 

==> 20127/smaps <== 

==> 20128/smaps <== 

==> 20129/smaps <== 

==> 20134/smaps <== 

==> 20135/smaps <== 

==> 20811/smaps <== 

==> 20868/smaps <== 

==> 20/smaps <== 

==> 21116/smaps <== 

==> 21774/smaps <== 

==> 21/smaps <== 

==> 22393/smaps <== 

==> 22394/smaps <== 

==> 22395/smaps <== 

==> 22398/smaps <== 

==> 22639/smaps <== 

==> 22824/smaps <== 

==> 22/smaps <== 

==> 23009/smaps <== 

==> 23058/smaps <== 

==> 23059/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

==> 23835/smaps <== 

==> 23961/smaps <== 

==> 23962/smaps <== 

==> 23963/smaps <== 

==> 23964/smaps <== 

==> 23/smaps <== 

==> 24180/smaps <== 

==> 24268/smaps <== 

==> 24467/smaps <== 

==> 24/smaps <== 

==> 252/smaps <== 

==> 25352/smaps <== 

==> 25435/smaps <== 

==> 25/smaps <== 

==> 26465/smaps <== 

==> 26/smaps <== 

==> 27884/smaps <== 

==> 27/smaps <== 

==> 28/smaps <== 

==> 29/smaps <== 

==> 2/smaps <== 

==> 303/smaps <== 

==> 30/smaps <== 

==> 316/smaps <== 

==> 31/smaps <== 

==> 32074/smaps <== 

==> 32076/smaps <== 

==> 32112/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

==> 32116/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

==> 322/smaps <== 

==> 32466/smaps <== 

==> 32467/smaps <== 

==> 32/smaps <== 

==> 33/smaps <== 

==> 34/smaps <== 

==> 37/smaps <== 

==> 38/smaps <== 

==> 3991/smaps <== 

==> 3992/smaps <== 

==> 39/smaps <== 

==> 3/smaps <== 

==> 4005/smaps <== 

==> 4006/smaps <== 

==> 4007/smaps <== 

==> 4008/smaps <== 

==> 4009/smaps <== 

==> 4010/smaps <== 

==> 4018/smaps <== 

==> 4029/smaps <== 

==> 4038/smaps <== 

==> 4044/smaps <== 

==> 4045/smaps <== 

==> 4046/smaps <== 

==> 4053/smaps <== 

==> 4054/smaps <== 

==> 4055/smaps <== 

==> 40/smaps <== 

==> 41/smaps <== 

==> 42/smaps <== 

==> 4339/smaps <== 

==> 435/smaps <== 

==> 436/smaps <== 

==> 43/smaps <== 

==> 44/smaps <== 

==> 45/smaps <== 

==> 46/smaps <== 

==> 47/smaps <== 

==> 48/smaps <== 

==> 49/smaps <== 

==> 4/smaps <== 

==> 50/smaps <== 

==> 51/smaps <== 

==> 52/smaps <== 

==> 53/smaps <== 

==> 54/smaps <== 

==> 55/smaps <== 

==> 56/smaps <== 

==> 57/smaps <== 

==> 58/smaps <== 

==> 5988/smaps <== 

==> 59/smaps <== 

==> 5/smaps <== 

==> 6058/smaps <== 

==> 6059/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

==> 60/smaps <== 

==> 61/smaps <== 

==> 62/smaps <== 

==> 63/smaps <== 

==> 64/smaps <== 

==> 65/smaps <== 

==> 66/smaps <== 

==> 67/smaps <== 

==> 68/smaps <== 

==> 69/smaps <== 

==> 6/smaps <== 

==> 70/smaps <== 

==> 71/smaps <== 

==> 72/smaps <== 

==> 73/smaps <== 

==> 74/smaps <== 

==> 771/smaps <== 

==> 77/smaps <== 

==> 782/smaps <== 

==> 78/smaps <== 

==> 79/smaps <== 

==> 7/smaps <== 

==> 80/smaps <== 

==> 814/smaps <== 

==> 819/smaps <== 

==> 81/smaps <== 

==> 82/smaps <== 

==> 83/smaps <== 

==> 84/smaps <== 

==> 8654/smaps <== 

==> 8655/smaps <== 

==> 8656/smaps <== 

==> 892/smaps <== 

==> 8/smaps <== 

==> 949/smaps <== 

==> 950/smaps <== 

==> 9/smaps <== 

==> self/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

Also, was soll ich jetzt tun? Ich habe Prozesse mit leeren Smaps, die ausgeführt werden. Wie bekomme ich die Smaps dieser Pid's?

+1

Hängt vom Betriebssystem ab. Linux? – Mat

+0

ja das os ist linux. –

+4

http://unix.stackexchange.com/questions/33381/getting-information-about-a-process-memory-usage-from-proc-pid-smaps könnte Sie interessieren – Mat

Antwort

5

Ich weiß nicht, von einem Werkzeug, das Ihnen diese Informationen geben würde, aber Sie können dies wahrscheinlich auf /proc/[pid]/smaps Basis berechnen:

/proc/[pid]/smaps (since Linux 2.6.14) 
      This file shows memory consumption for each of the process’s mappings. 
      For each of mappings there is a series of lines such as the following: 

       08048000-080bc000 r-xp 00000000 03:02 13130  /bin/bash 
       Size:    464 kB 
       Rss:    424 kB 
       Shared_Clean:  424 kB 
       Shared_Dirty:   0 kB 
       Private_Clean:  0 kB 
       Private_Dirty:  0 kB 

      The first of these lines shows the same information as is displayed for 
      the mapping in /proc/[pid]/maps. The remaining lines show the size of 
      the mapping, the amount of the mapping that is currently resident in RAM, 
      the number of clean and dirty shared pages in the mapping, and the number 
      of clean and dirty private pages in the mapping. 

Einzelheiten finden Sie Getting information about a process' memory usage from /proc/pid/smaps.

+0

können Sie mir bitte eine andere Alternative als/proc/pid/maps oder smaps sagen, da beide Dateien leer sind. –

+0

@PrasanthMadhavan: Sie sind leer auch für Ihre eigenen Prozesse? – NPE

+0

yup. Alle sind leer. Siehe meine Frage. Es zeigt Smaps, aber die Karten sind auch die gleichen .. –