Estou um pouco confuso com alguns dos resultados que estou vendo do ps e gratuito .
No meu servidor, este é o resultado de free -m
[root@server ~]# free -m
total used free shared buffers cached
Mem: 2048 2033 14 0 73 1398
-/+ buffers/cache: 561 1486
Swap: 2047 11 2036
Meu entendimento de como o Linux gerencia a memória é que ele armazenará o uso do disco na RAM, para que cada acesso subseqüente seja mais rápido. Eu acredito que isso é indicado pelas colunas "em cache". Além disso, vários buffers são armazenados na RAM, indicados na coluna "buffers".
Portanto, se eu entendi corretamente, o uso "real" deve ser o valor "usado" de "- / + buffers / cache" ou 561 neste caso.
Então, assumindo que tudo isso está correto, a parte que me joga é o resultado de ps aux
.
Meu entendimento dos ps
resultados é que a 6a coluna (RSS) representa o tamanho em kilobytes que o processo usa para a memória.
Então, quando eu executo este comando:
[root@server ~]# ps aux | awk '{sum+=$6} END {print sum / 1024}'
1475.52
O resultado não deve ser a coluna "usada" de "- / + buffers / cache" de free -m
?
Então, como posso determinar corretamente o uso de memória de um processo no Linux? Aparentemente, minha lógica é falha.
htop
autor a uma pergunta semelhante eu tive no outro dia ... Como calcular o uso de memória de / proc / meminfo (como htop)Respostas:
Este exata mesma pergunta foi feita em serverfault apenas no outro dia :-)
O sistema de memória virtual linux não é tão simples. Você não pode simplesmente adicionar todos os campos RSS e obter o valor relatado
used
porfree
. Existem muitas razões para isso, mas vou abordar algumas das maiores.Quando um processo se bifurca, o pai e o filho são exibidos com o mesmo RSS. No entanto, o linux emprega
copy-on-write
para que ambos os processos estejam realmente usando a mesma memória. Somente quando um dos processos modifica a memória será realmente duplicada. Portanto, isso fará com que ofree
número seja menor que atop
soma do RSS.O valor do RSS não inclui memória compartilhada. Como a memória compartilhada não pertence a nenhum processo,
top
não a inclui no RSS. Portanto, isso fará com que ofree
número seja maior que atop
soma do RSS.fonte
shmget
oummap
. As palavras em torno do material da memória são muito complicadas. Usar a palavra errada no lugar errado pode estragar totalmente o significado de uma frase.Se você está procurando números de memória que somam, dê uma olhada no smem :
Por exemplo aqui:
O mesmo
PSS
vale para a coluna aqui, pois leva em consideração a memória compartilhada.Ao contrário
RSS
, é significativo adicioná-lo. Temos um total de 654Mb para os processos da terra do usuário aqui.A saída de todo o sistema fala sobre o resto:
Então, 1Gb de RAM total = 654Mb de processos do usuário + 346Mb de memória do kernel + 16Mb grátis
(mais ou menos alguns Mb)
No geral, cerca de metade da memória é usada para cache (494Mb).
Pergunta de bônus : o que é cache do usuário versus cache do kernel aqui?
btw para algo visual tentar:
fonte
Uma ferramenta realmente boa é a
pmap
lista do uso atual da memória para um determinado processo:Para obter mais informações, consulte a página de manual
man pmap
e também veja 20 Ferramentas de Monitoramento do Sistema Linux que todo SysAdmin deve saber , que listam ótimas ferramentas que eu sempre uso para obter informações sobre minha caixa do Linux.fonte
free
informa.pmap -x PID
também inclui uma coluna RSS, que geralmente é bastante útil para ter uma idéia de onde a soma RSS de um processo (como observado, por exemplo, viatop
vem).Execute o topo, pressione
h
ajuda ef
adicione campos. você pode adicionar os seguintes campos:RSS
quantidade de memória física que o aplicativo está usandoCODE
quantidade total de memória que o código executável do processo está usandoDATA
- quantidade total de memória (kb) dedicada aos dados e à pilha de um processoEntre esses três, você deve ter resultados bastante precisos. Você também pode usar substituições mais detalhadas para o topo que eu recomendo
htop
ouatop
.Edit: quase esqueci se você quiser informações realmente detalhadas. Encontre o PID e crie o arquivo a seguir.
PID=123
cat /proc/123/status
Editar 2: se você pode encontrá-lo ou tê-lo, o livro:
- possui uma seção Capítulo 5: Ferramentas de desempenho: memória específica de processo - possui muito mais informações do que você jamais desejaria.
fonte
ps
fornece a quantidade de memória usada por cada processo. Parte dessa memória são arquivos mmapped, que são contabilizados no cache. Parte dessa memória (especialmente o código) é compartilhada com outros processos; portanto, se você adicionar os valores de RSS, ele será contado várias vezes.Não há resposta certa para “quanta memória esse processo usa?”, Porque não depende apenas do processo, mas também do ambiente. Há muitos valores diferentes que você pode chamar de "uso de memória" do processo, e eles não correspondem ou se somam porque estão contando coisas diferentes.
fonte
Como outros já apontaram corretamente, é difícil controlar a memória real usada por um processo, com regiões compartilhadas e com arquivos mapeados e outros enfeites.
Se você é um experimentador, pode executar valgrind e massif . Isso pode ser um pouco pesado para o usuário casual, mas você terá uma idéia do comportamento da memória de um aplicativo ao longo do tempo. Se um aplicativo malloc () é exatamente o que ele precisa, isso fornecerá uma boa representação do uso real da memória dinâmica de um processo. Mas esse experimento pode ser "envenenado".
Para complicar, o Linux permite que você comprometa demais sua memória. Quando você malloc () memória, você está declarando sua intenção de consumir memória. Mas a alocação não acontece realmente até você escrever um byte em uma nova página da sua "RAM" alocada. Você pode provar isso escrevendo e executando um pequeno programa em C da seguinte maneira:
Execute isso em uma máquina com menos de 16 GB de RAM e, voila!, Você acabou de ganhar 16 GB de memória! (Não, na verdade não).
Observe que
top
você vê "VIRT" como 16.004G, mas% MEM é 0.0Execute isso novamente com valgrind:
E o maciço diz "soma de todas as atribuições () = 16GB". Então isso não é muito interessante.
MAS, se você executá-lo em um processo são :
E aqui vemos (muito empiricamente e com muita confiança) que o compilador alocou 77 KB de heap.
Por que se esforçar tanto para obter apenas o uso de heap? Porque todos os objetos compartilhados e seções de texto que um processo usa (neste exemplo, o compilador) não são muito interessantes. Eles são uma sobrecarga constante para um processo. De fato, as invocações subsequentes do processo quase vêm de graça.
Além disso, compare e contraste o seguinte:
MMAP () um arquivo de 1 GB. Seu VMSize será de 1 + GB. Mas seu Tamanho do conjunto residente será apenas as partes do arquivo em que você causou a paginação (desreferenciando um ponteiro para essa região). E se você "ler" o arquivo inteiro, no momento em que chegar ao fim, o kernel poderá já ter paginado o início (isso é fácil de fazer, porque o kernel sabe exatamente como / onde substituir essas páginas, se desreferenciado novamente ) Em ambos os casos, nem o VMSize nem o RSS são um bom indicador do "uso" da sua memória. Você realmente não fez nada com malloc ().
Por outro lado, Malloc () e toque em MUITA memória - até que sua memória seja trocada para o disco. Portanto, sua memória alocada agora excede o seu RSS. Aqui, o seu VMSize pode começar a lhe dizer algo (seu processo possui mais memória do que o que realmente reside na sua RAM). Mas ainda é difícil diferenciar entre VMs que são páginas compartilhadas e VMs que são dados trocados.
É aqui que o valgrind / maciço se torna interessante. Ele mostra o que você alocou intencionalmente (independentemente do estado de suas páginas).
fonte
Tente o seguinte: ele fornecerá a RAM total realmente usada por todo o processo em execução em MB
fonte
size
relatado porps
tem pouca relação com o uso real de memória. É o tamanho virtual de cada processo que não é necessariamente alocado de memória. Também não inclui alguns segmentos que estão alocados.Ele mostrará a quantidade de memória que os usuários usam.
fonte
Use este comando para encontrar a utilização da memória em%.
Memória utilizada:
memoria livre
fonte
grep
vai ficar lá esperando por entrada.free -m | grep Mem | awk '{print $3/$2 * 100.0}'