Come si misura l'impronta di memoria di un insieme di processi biforcati?


8

Supponiamo di avere un processo che utilizza 200 MB di memoria e fork () s:

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

Programmi come 'top' mostreranno ogni processo usando 200 MB, con pochissima memoria SHRd, quindi sembra che i processi utilizzino 400 MB in totale. Tuttavia, poiché fork () implementa il copy-on-write (COW) per le pagine di memoria del processo, la realtà è che i processi utilizzano solo 200 MB in totale.

Perché top non mostra quale frazione della memoria è COW? C'è un modo per farlo? O c'è un altro comando che posso usare invece?

Nota: 'top' su OSX sembra avere una colonna RSHRD che fa quello che mi aspetto. La mia domanda è per Linux.

Risposte:


5

È possibile ottenere quel tipo di informazioni dal /proc/<pid>/smapsfile per ciascun processo sotto forma di Pssvoce (abbreviazione di "Dimensione della quota proporzionale").

Nell'esempio sopra con 200 MB "condivisi" tra due processi, ogni processo mostrerebbe 100 MB nella voce PSS per quella mappatura, cioè la memoria viene distribuita uniformemente tra i processi che la condividono (fino a quando non viene copiata e non condivisa da nessuno dei due processi).

Ecco un estratto dall'esecuzione di qualcosa di simile a quello che hai pubblicato:

$ 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
...

(Ci sono molte cose in quei file, inclusi i mapping per le librerie condivise che sono potenzialmente condivise tra molti processi, e quindi ogni processo ottiene solo una piccola parte spiegata nella sua voce PSS per quelli.)

Ecco un bell'articolo su questo: ELC: quanta memoria usano davvero le applicazioni?

Non conosco uno strumento comune simile a quello superiore per visualizzare queste informazioni, e non penso che psabbia opzioni per mostrarlo purtroppo. L'articolo indica un repository con script Python chiamati pagemapda Matt Mackall che è possibile utilizzare o adattare.

Spina senza vergogna: troverai alcuni post su Unix e Linux su PSS e il smapsfile se ti interessa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.