Como você mede a pegada de memória de um conjunto de processos bifurcados?

5

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

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

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

Por que o top não mostra que fração da memória é COW? Existe uma maneira de fazer isso? Ou há outro comando que eu possa usar?

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

    
por Dustin Boswell 19.10.2012 / 10:40

1 resposta

4

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

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

Aqui está um extrato da execução de algo parecido com 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á um lote de 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 contabilizada em sua entrada PSS para eles. )

Aqui está um bom artigo sobre isso: ELC: Quanta memória as aplicações estão realmente usando?

Não conheço uma ferramenta semelhante a um top comum para exibir essas informações, e não acho que ps tenha opções para mostrar isso, infelizmente. O artigo aponta para um repositório com scripts python chamado pagemap de Matt Mackall que você poderia usar ou adaptar.

Plug sem vergonha: você encontrará algumas postagens em Unix & Linux sobre o PSS e o arquivo smaps se você estiver interessado nisso.

    
por 19.10.2012 / 11:22