Come ottenere% di utilizzo della memoria con vmstat?


9

Devo ottenere un utilizzo della memoria in% da vmstat, ma non capisco bene alcuni dei numeri relativi alla memoria visualizzati in vmstat.

In particolare, dato un output come questo

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 è la quantità di memoria totale del sistema? È 'swpd' + 'free' + 'buff' + 'cache', per un totale di 1620612?

Qual è la quantità libera di memoria del sistema? È 45396, come visualizzato nella colonna "gratuita"?

Il problema è che non si sommano né si avvicinano nemmeno a ciò che è stato riportato "in alto". L'output di 'top' che ho preso nello stesso momento di 'vmstat's sopra è:

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

Quindi ... suppongo che ci siano numeri / opzioni nascosti in "vmstat" che non conoscevo?

Ho bisogno di usare 'vmstat' per questo scopo e non altri comandi in quanto questo è il requisito dichiarato.

Quindi idealmente, ciò che voglio ottenere da 'vmstat' è l'utilizzo della memoria%, come in:

<used_memory>/<total_memory> * 100%.

Grazie!


Risposte:


20

Quello che stai cercando è l'output di "free":

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

Ecco un tour:

Questa è una scatola con 768 MB di RAM fisica e una partizione di swap da 500344 KB.

759456 KB è "usato" (seconda colonna, riga superiore). Di questa memoria "utilizzata", 23132 KB sono buffer (5a colonna, riga superiore) e 592484 KB (sesta colonna, riga superiore) è cache, lasciando 144840 KB (2a colonna, 2a riga) di memoria fisica utilizzata dai processi attivi.

Se si considera che la memoria utilizzata dai buffer e dalla cache può essere utilizzata per i processi, ciò lascia liberi 630716 KB (terza colonna, seconda riga) di memoria fisica.

La partizione di swap, come ho detto, è 500344 KB (1a colonna, riga inferiore). 21972 KB (seconda colonna, riga inferiore) del file di scambio è in uso, lasciando liberi 478372 KB (terza colonna, riga inferiore).

Quindi, la tua definizione di% di memoria libera dipende dal fatto che stai contando i buffer e la cache o meno e se stai contando lo swap o meno.

Questo dovrebbe darti abbastanza per continuare a calcolare una percentuale come meglio credi.


Ecco l'output di 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

Puoi vedere come top e free siano d'accordo (anche se con una piccola differenza: questa è una macchina multiutente e l'utilizzo della memoria dei programmi top e free si riflette lì).


Aggiungi un "-s" quando chiami vmstate e vedrai più o meno lo stesso output, solo in una forma diversa:

$ 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

Puoi vedere che vmstat mostra tutti gli stessi numeri come gratuiti.


La migliore risposta che ho trovato su questo argomento contorto!
Rinogo,

2

Ho la stessa domanda con te e mi viene in mente una formula

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

L'ho provato su vmstat versione da procps-ng 3.3.10 e vmstat da procps-ng 3.3.9



0

Ecco una funzione shell POSIX che arrotonda la percentuale desiderata al numero intero più vicino (a scopi di scripting questo può essere più utile, poiché i test di confronto aritmetico della shell POSIX funzionano solo con numeri interi):

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

Uscita (sul mio sistema):

12

Stessa cosa, con free:

furp() { free | { read z; read a b c d; echo $((100*$c/$b)) ; } }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.