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)) ; } }