Comment obtenir% d'utilisation de la mémoire avec vmstat?

9

J'ai besoin d'obtenir une utilisation de la mémoire en% de vmstat, mais je ne comprends pas très bien certains des chiffres relatifs à la mémoire affichés dans vmstat.

En particulier, étant donné une sortie comme celle-ci

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

Quelle est la quantité de mémoire totale du système? Est-ce «swpd» + «gratuit» + «buff» + «cache», qui totalisent 1620612?

Quelle est la quantité de mémoire libre du système? Est-ce 45396, comme indiqué dans la colonne "gratuit"?

Le problème est qu'ils ne s'additionnent pas ou ne ressemblent même pas à ce que le «top» a rapporté. La sortie de 'top' que j'ai prise à peu près en même temps que celle de 'vmstat ci-dessus est:

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

Alors ... je suppose qu'il doit y avoir des nombres / options cachés dans 'vmstat' que je ne connaissais pas?

J'ai besoin d'utiliser 'vmstat' à cet effet et pas d'autres commandes car c'est ce que l'exigence a indiqué.

Donc, idéalement, ce que je veux réaliser avec 'vmstat', c'est l'utilisation de la mémoire%, comme dans:

<used_memory>/<total_memory> * 100%.

Merci!

Le sien
la source

Réponses:

20

Ce que vous cherchez, c'est la sortie de "free":

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

Voici une visite:

Il s'agit d'une boîte avec 768 Mo de RAM physique et une partition de swap de 500344 Ko.

759456 Ko est "utilisé" (deuxième colonne, ligne supérieure). De cette mémoire "utilisée", 23132 Ko sont des tampons (5e colonne, ligne supérieure) et 592484 Ko (6e colonne, ligne supérieure) sont du cache, ce qui laisse 144840 Ko (2e colonne, 2e rangée) de mémoire physique utilisée par les processus actifs.

Lorsque vous considérez que la mémoire utilisée par les tampons et le cache peut être utilisée pour les processus, cela laisse 630716 Ko (3e colonne, 2e ligne) de mémoire physique libres.

La partition de swap, comme je l'ai dit, est de 500344 Ko (1ère colonne, ligne du bas). 21972 Ko (2e colonne, rangée inférieure) du fichier d'échange est en cours d'utilisation, laissant 478372 Ko (3e colonne, rangée inférieure) libres.

Ainsi, votre définition du% de mémoire libre dépend de si vous comptez les tampons et le cache ou non, et si vous comptez le swap ou non.

Cela devrait vous donner suffisamment pour calculer un pourcentage comme bon vous semble.


Voici la sortie de top et gratuite:

$ 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

Vous pouvez voir comment top et free s'accordent (bien qu'avec une petite différence - il s'agit d'une machine multi-utilisateurs et l'utilisation de la mémoire des programmes top et gratuits y est reflétée).


Ajoutez un "-s" lorsque vous appelez vmstate, et vous verrez à peu près la même sortie, juste sous une forme différente:

$ 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

Vous pouvez voir que vmstat affiche tous les mêmes numéros comme gratuits.

Evan Anderson
la source
Meilleure réponse que j'aie encore trouvée sur ce sujet alambiqué!
rinogo
2

J'ai la même question avec vous et je viens avec une formule

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}'

Je l'ai testé sur la version vmstat de procps-ng 3.3.10 et vmstat de procps-ng 3.3.9

Chienchi Lo
la source
1

Je vous recommande de lire ce IBM Redbook «Linux Performance and Tuning Guidelines» ( http://www.redbooks.ibm.com/abstracts/redp4285.html?Open ). Il contient des détails sur les données renvoyées par de nombreuses commandes et devrait vous aider.

J'ai généralement utilisé la commande "free" sous Linux ou "cat / proc / meminfo".

Aaron Bush
la source
0

Voici une fonction shell POSIX qui arrondit le pourcentage souhaité à l'entier le plus proche (à des fins de script, cela peut être plus utile, car les tests de comparaison arithmétique du shell POSIX ne fonctionnent qu'avec des entiers):

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

Sortie (sur mon système):

12

Même chose, avec free:

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