Como obter% de uso de memória com vmstat?

9

Preciso obter um uso de memória em% do vmstat, mas não entendo bem alguns dos números relacionados à memória exibidos no vmstat.

Em particular, dada uma saída como esta

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0 139728  45396 199128 1236360    1    2     4   622    3    1 51  4 43  2  0

Qual é a quantidade total de memória do sistema? É 'swpd' + 'free' + 'buff' + 'cache', que totaliza 1620612?

Qual é a quantidade livre de memória do sistema? É 45396, conforme exibido na coluna 'grátis'?

O problema é que eles não somam ou nem parecem próximos do que foi relatado 'top'. A saída de 'top' que eu peguei na mesma época que 'vmstat's acima é:

[...]
Mem:   4059616k total,  3965504k used,    94112k free,   200020k buffers
[...]

Então ... estou assumindo que deve haver números / opções ocultos no 'vmstat' que eu não conhecia?

Eu preciso usar 'vmstat' para esse fim e não outros comandos, pois é isso que o requisito declarou.

Idealmente, o que eu quero alcançar com 'vmstat' é o% de uso de memória, como em:

<used_memory>/<total_memory> * 100%.

Obrigado!

Dele
fonte

Respostas:

20

O que você está procurando é a saída do "free":

$ free
             total       used       free     shared    buffers     cached
Mem:        775556     759456      16100          0      22132     592484
-/+ buffers/cache:     144840     630716
Swap:       500344      21972     478372

Aqui está um tour:

Esta é uma caixa com 768 MB de RAM física e uma partição de troca de 500344KB.

759456 KB é "usado" (segunda coluna, linha superior). Dessa memória "usada", 23132KB são buffers (quinta coluna, linha superior) e 592484KB (sexta coluna, linha superior) são cache, deixando 144840KB (segunda coluna, segunda linha) de memória física que está sendo usada pelos processos ativos.

Quando você considera que a memória usada por buffers e cache pode ser usada para processos, isso deixa 630716KB (3ª coluna, 2ª linha) de memória física livre.

A partição de troca, como eu disse, é 500344KB (1ª coluna, linha inferior). 21972KB (segunda coluna, linha inferior) do arquivo de troca está em uso, deixando 478372KB (terceira coluna, linha inferior) livre.

Portanto, sua definição de% de memória livre depende se você está contando buffers e cache ou não, e se você está contando swap ou não.

Isso deve lhe dar o suficiente para calcular uma porcentagem como achar melhor.


Aqui está a saída do top e grátis:

$ top -n1 | grep "used," ; free
Mem:    775556k total,   751472k used,    24084k free,    20776k buffers
Swap:   500344k total,    21972k used,   478372k free,   586648k cached

             total       used       free     shared    buffers     cached
Mem:        775556     751344      24212          0      20776     586648
-/+ buffers/cache:     143920     631636
Swap:       500344      21972     478372

Você pode ver como o top e o free concordam (embora com uma pequena diferença - esta é uma máquina multiusuário e o uso da memória dos programas top e free são refletidos nele).


Adicione um "-s" ao chamar vmstate e você verá a mesma saída, apenas em uma forma diferente:

$ vmstat -s ; free
       775556  total memory
       759920  used memory
       674680  active memory
        18440  inactive memory
        15636  free memory
        21892  buffer memory
       594372  swap cache
       500344  total swap
        21972  used swap
       478372  free swap
       ... output truncated ...

             total       used       free     shared    buffers     cached
Mem:        775556     759920      15636          0      21892     594372
-/+ buffers/cache:     143656     631900
Swap:       500344      21972     478372

Você pode ver que o vmstat está mostrando todos os mesmos números de graça.

Evan Anderson
fonte
Melhor resposta que eu já encontrei sobre esse assunto complicado!
Rinogo
2

Eu tenho a mesma pergunta com você e crie uma fórmula

vmstat -s | awk  ' $0 ~ /total memory/ {total=$1 } $0 ~/free memory/ {free=$1} $0 ~/buffer memory/ {buffer=$1} $0 ~/cache/ {cache=$1} END{print (total-free-buffer-cache)/total*100}'

Eu testei na versão vmstat do procps-ng 3.3.10 e vmstat do procps-ng 3.3.9

Chienchi Lo
fonte
1

Eu recomendaria que você leia este IBM Redbook "Linux Performance and Tuning Guidelines" ( http://www.redbooks.ibm.com/abstracts/redp4285.html?Open ). Ele possui detalhes sobre os dados retornados por vários comandos e deve ajudá-lo.

Eu normalmente usei o comando "free" no Linux ou "cat / proc / meminfo".

Aaron Bush
fonte
0

Aqui está uma função de shell POSIX que arredonda a porcentagem desejada para o número inteiro mais próximo (para fins de script, isso pode ser mais útil, pois os testes de comparação aritmética POSIX do shell funcionam apenas com números inteiros):

# Vmstat (derived) Used Ram Percent
vurp() { vmstat -s | { read a b ; read c d ; echo $((100*$c/$a)) ; } ; }
vurp

Saída (no meu sistema):

12

A mesma coisa, com free:

furp() { free | { read z; read a b c d; echo $((100*$c/$b)) ; } }
agc
fonte