Como você mede o espaço ocupado pela memória de um conjunto de processos bifurcados?

8

Digamos que eu tenho um processo usando 200 MB de memória, e ele fork () s:

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

Programas como 'top' mostrarão cada processo usando 200 MB, com muito pouca memória SHRd, portanto, parece que os processos estão usando 400 MB no total. No entanto, como o fork () implementa a cópia na gravação (COW) para as páginas de memória do processo, a realidade é que os processos estão usando apenas 200 MB no total.

Por que o topo não mostra qual fração da memória é COW? Existe uma maneira de fazê-lo? Ou existe outro comando que eu possa usar?

Nota: 'top' no OSX parece ter uma coluna RSHRD que faz o que eu esperaria. Minha pergunta é para Linux.

Dustin Boswell
fonte

Respostas:

5

Você pode obter esse tipo de informação do /proc/<pid>/smapsarquivo para cada processo na forma da Pssentrada (abreviação de "Tamanho do compartilhamento proporcional").

No exemplo acima, com 200 MB "compartilhados" entre dois processos, cada processo mostraria 100 MB na entrada PSS para esse mapeamento, ou seja, a memória é distribuída igualmente entre os processos que o compartilham (até que seja copiada e não compartilhada por qualquer processo).

Aqui está um trecho da execução de algo como o que você postou:

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

(Há muitas coisas nesses arquivos, incluindo mapeamentos para bibliotecas compartilhadas que são potencialmente compartilhadas entre muitos processos e, portanto, cada processo recebe apenas uma pequena parte da sua entrada no PSS.)

Aqui está um bom artigo sobre isso: ELC: quanta memória os aplicativos estão realmente usando?

Não conheço uma ferramenta top-like comum para exibir essas informações e, psinfelizmente, não tenho opções para mostrar isso. O artigo aponta para um repositório com scripts python chamado pagemappor Matt Mackall que você pode usar ou adaptar.

Plugue sem vergonha: você encontrará alguns posts no Unix e Linux sobre PSS e o smapsarquivo, se estiver interessado nisso.

Esteira
fonte