¿Cómo obtener el % de uso de memoria con vmstat?

¿Cómo obtener el % de uso de memoria con vmstat?

Necesito obtener un porcentaje de uso de memoria de vmstat, pero no entiendo bien algunos de los números relacionados con la memoria que se muestran en vmstat.

En particular, dado un resultado como este

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

¿Cuál es la cantidad de memoria total del sistema? ¿Es 'swpd' + 'gratis' + 'buff' + 'cache', que suman 1620612?

¿Cuál es la cantidad de memoria libre del sistema? ¿Es 45396, como se muestra en la columna "gratis"?

El problema es que no cuadran ni se acercan a lo que informó 'top'. El resultado de 'top' que tomé casi al mismo tiempo que el de 'vmstat' anterior es:

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

Entonces... ¿Supongo que debe haber números/opciones ocultos en 'vmstat' que no conocía?

Necesito usar 'vmstat' para este propósito y no otros comandos, ya que esto es lo que establece el requisito.

Idealmente, lo que quiero lograr con 'vmstat' es el porcentaje de uso de memoria, como en:

<used_memory>/<total_memory> * 100%.

¡Gracias!

Respuesta1

Lo que estás buscando es el resultado de "gratis":

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

Aquí tienes un recorrido:

Esta es una caja con 768 MB de RAM física y una partición de intercambio de 500344 KB.

759456 KB están "usados" (segunda columna, fila superior). De esta memoria "usada", 23132 KB son búfer (quinta columna, fila superior) y 592484 KB (sexta columna, fila superior) son caché, lo que deja 144840 KB (segunda columna, 2 fila) de memoria física que están utilizando los procesos activos.

Cuando se considera que la memoria utilizada por los buffers y el caché podría usarse para procesos, eso deja 630716 KB (3.ª columna, 2.ª fila) de memoria física libre.

La partición de intercambio, como dije, es de 500344 KB (primera columna, fila inferior). 21972 KB (segunda columna, fila inferior) del archivo de intercambio están en uso, lo que deja 478372 KB (tercera columna, fila inferior) libres.

Por lo tanto, su definición de % de memoria libre depende de si está contando buffers y caché o no, y de si está contando el intercambio o no.

Eso debería darle suficiente para calcular un porcentaje como mejor le parezca.


Aquí está el resultado de top y 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

Puede ver cómo coinciden los programas top y free (aunque con una pequeña diferencia: esta es una máquina multiusuario y el uso de memoria de los programas top y free se refleja allí).


Agregue una "-s" cuando llame a vmstate y verá prácticamente el mismo resultado, solo que en una 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

Puede ver que vmstat muestra los mismos números que gratis.

Respuesta2

Tengo la misma pregunta contigo y se me ocurrió una 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}'

Lo probé en la versión vmstat de procps-ng 3.3.10 y vmstat de procps-ng 3.3.9.

Respuesta3

Le recomendaría que lea este Redbook de IBM "Pautas de ajuste y rendimiento de Linux" (http://www.redbooks.ibm.com/abstracts/redp4285.html?Abierto). Tiene detalles sobre los datos devueltos por numerosos comandos y debería ayudarle.

Normalmente he usado el comando "gratuito" en Linux o "cat /proc/meminfo".

Respuesta4

Aquí está unPOSIXfunción de shell que redondea el porcentaje deseado al entero más cercano (para propósitos de secuencias de comandos, esto puede ser más útil, ya quePOSIXLas pruebas de comparación aritmética de Shell solo funcionan con números enteros):

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

Salida (en mi sistema):

12

Lo mismo, con free:

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

información relacionada