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

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

Preciso obter o uso de memória em% do vmstat, mas não entendo muito 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 de memória total do sistema? É 'swpd' + 'free' + 'buff' + 'cache', que totaliza 1620612?

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

O problema é que eles não somam nem chegam perto do que o 'top' relatou. A saída de 'top' que tirei ao mesmo tempo 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 em 'vmstat' que eu não conhecia?

Preciso usar 'vmstat' para essa finalidade e não outros comandos, pois é isso que o requisito declara.

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

<used_memory>/<total_memory> * 100%.

Obrigado!

Responder1

O que você está procurando é a saída de "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 passeio:

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

759456KB é "usado" (segunda coluna, linha superior). Dessa memória "usada", 23.132 KB são buffers (5ª coluna, linha superior) e 592.484 KB (sexta coluna, linha superior) são cache, deixando 144.840 KB (2ª coluna, 2ª linha) de memória física que está sendo usada por processos ativos.

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

A partição swap, como eu disse, tem 500344 KB (1ª coluna, linha inferior). 21.972 KB (2ª coluna, linha inferior) do arquivo de troca estão em uso, deixando 478.372 KB (3ª coluna, linha inferior) livres.

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

Isso deve lhe dar o suficiente para calcular uma porcentagem conforme achar adequado.


Aqui está o resultado de top e free:

$ 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 top e free concordam (embora com uma pequena diferença - esta é uma máquina multiusuário e o uso de memória dos programas top e free está refletido nela).


Adicione um "-s" ao chamar vmstate e você verá praticamente a mesma saída, apenas em um formato 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 do free.

Responder2

Eu tenho a mesma pergunta com você e criei 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

Responder3

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

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

Responder4

Aqui está umPOSIXfunção shell que arredonda a porcentagem desejada para o número inteiro mais próximo (para fins de script, isso pode ser mais útil, poisPOSIXtestes de comparação aritmética 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)) ; } }

informação relacionada