
Digamos que eu tenha 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, então parece que os processos estão usando 400 MB 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 200 MB no total.
Por que top não mostra qual fração da memória é COW? Existe uma maneira de fazer isso? Ou há outro comando que posso usar?
Nota: 'top' no OSX parece ter uma coluna RSHRD que faz o que eu esperava. Minha pergunta é para Linux.
Responder1
Você pode obter esse tipo de informação do /proc/<pid>/smaps
arquivo para cada processo na forma de Pss
entrada (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é que seja copiada e descompartilhada por qualquer um dos processos).
Aqui está um trecho 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á ummuitode 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 os aplicativos estão realmente usando?
Não conheço uma ferramenta comum semelhante a um top para exibir essas informações e, ps
infelizmente, também não acho que haja opções para mostrar isso. O artigo aponta para um repositório com scripts python chamadopagemap
por Matt Mackall que você pode usar ou adaptar.
Plugue sem vergonha: você encontrará alguns posts sobreUnix e Linuxsobre o PSS e o smaps
arquivo, se você estiver interessado nisso.