Esta questão é abordada aqui em grande detalhe.
Como você mede o uso de memória de uma aplicação ou processo no Linux?
Do artigo do blog Entendendo o uso de memória no Linux, o `ps' não é uma ferramenta precisa a ser utilizada para esta intenção.
Porque
ps
é "errado"Dependendo de como você olha para ele, o
ps
não está relatando a utilização real da memória dos processos. O que ele realmente está fazendo é mostrar quanta memória real cada processo ocuparia se fosse o único processo em execução. É claro, uma máquina Linux típica tem várias dezenas de processos rodando a qualquer momento, o que significa que os números VSZ e RSS reportados pelo `ps' estão quase definitivamente conformes.
Com ps
ou ferramentas similares, você terá apenas a quantidade de páginas de memória alocada por esse processo. Este número é correto, mas:
não reflecte a quantidade real de memória utilizada pela aplicação, apenas a quantidade de memória reservada para a mesma
pode ser enganador se as páginas forem partilhadas, por exemplo, por vários tópicos ou através da utilização de bibliotecas ligadas dinamicamente
Se você realmente quer saber que quantidade de memória sua aplicação realmente usa, você precisa executá-la dentro de um perfilador. Por exemplo, valgrind
pode lhe dar insights sobre a quantidade de memória utilizada, e, mais importante, sobre possíveis vazamentos de memória em seu programa. A ferramenta heap profiler do valgrind é chamada de 'massif':
O Massif é um profiler de montes. Ele faz um perfil detalhado da pilha tirando instantâneos regulares da pilha de um programa. Ele produz um gráfico mostrando o uso da pilha ao longo do tempo, incluindo informações sobre quais partes do programa são responsáveis pela maior parte das alocações de memória. O gráfico é complementado por um arquivo de texto ou HTML que inclui mais informações para determinar onde a maior parte da memória está sendo alocada. O Massif executa programas cerca de 20x mais lentos que o normal.
Como explicado na documentação valgrind, você precisa executar o programa através do valgrind:
valgrind --tool=massif <executable> <arguments>
O Massif escreve um dump de instantâneos de uso de memória (por exemplo, massif.out.12345
). Estes fornecem, (1) uma linha de tempo de uso de memória, (2) para cada instantâneo, um registro de onde em seu programa a memória foi alocada.
Uma ótima ferramenta gráfica para analisar estes arquivos é o massif-visualizer. Mas eu encontrei ms_print
, uma ferramenta simples baseada em texto enviada com o valgrind, que já é de grande ajuda.
Para encontrar vazamentos de memória, utilize a ferramenta (padrão) `memcheck' do valgrind.
É difícil dizer com certeza, mas aqui estão duas coisas "próximas" que podem ajudar.
$ ps aux
dar-lhe-á Tamanho Virtual (VSZ)
Você também pode obter estatísticas detalhadas em /proc file-system indo para `/proc/$pid/status'.
O mais importante é o VmSize, que deve estar próximo do que o ps aux
dá.
/proc/19420$ cat status Nome: firefox Estado: S (dormindo) Tgid: 19420 Pid: 19420 PPid: 1 TracerPid: 0 Uid: 1000 1000 1000 1000 Gid: 1000 1000 1000 1000 1000 Tamanho FDS: 256 Grupos: 4 6 20 24 25 29 30 44 46 107 109 109 115 124 1000 VmPeak: 222956 kB Tamanho VmSize: 212520 kB VmLck: 0 kB VmHWM: 127912 kB VmRSS: 118768 kB VmData: 170180 kB VmStk: 228 kB VmExe: 28 kB VmLib: 35424 kB VmPTE: 184 kB Roscas: 8 SigQ: 0/16382 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000020001000 SigCgt: 000000018000442f CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 Cpus_allowed: 03 Mems_allowed: 1 comutadores_de_texto_voluntários: 63422 comutadores_de_texto_não-voluntários: 7171
Arranja o Valgrind. Dá-lhe o teu programa para correr, e ele dir-te-á muito sobre o seu uso de memória.
Isto só se aplicaria no caso de um programa que funciona durante algum tempo e pára. Não sei se o Valgrind pode pôr as mãos num processo já em execução ou não deve parar processos como o daemons.