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


9

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

En particular, dada una salida 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

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

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

El problema es que no cuadran ni se parecen a lo que informaron los "principales". La salida de 'top' que tomé al mismo tiempo que 'vmstat's de arriba es:

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

Entonces ... ¿Asumo 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 este es el requisito establecido.

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

<used_memory>/<total_memory> * 100%.

¡Gracias!


Respuestas:


20

Lo que estás buscando es la salida 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í hay un recorrido:

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

759456 KB se "usa" (segunda columna, fila superior). De esta memoria "usada", 23132KB son memorias intermedias (5ta columna, fila superior) y 592484KB (sexta columna, fila superior) es caché, dejando 144840KB (2da columna, 2da fila) de memoria física que utilizan los procesos activos.

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

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

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

Eso debería darte lo suficiente para seguir calculando un porcentaje como mejor te parezca.


Aquí está la salida de top y gratis:

$ 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 están de acuerdo la parte superior y la libre (aunque con una pequeña diferencia: esta es una máquina multiusuario y el uso de la memoria de la parte superior y los programas gratuitos se reflejan allí).


Agregue un "-s" cuando llame a vmstate, y verá la misma salida, 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 todos los mismos números que gratis.


¡La mejor respuesta que he encontrado hasta ahora sobre este tema complicado!
rinogo

2

Tengo la misma pregunta contigo y se me ocurre 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 he probado en la versión vmstat de procps-ng 3.3.10 y vmstat de procps-ng 3.3.9



0

Aquí hay una función de shell POSIX que redondea el porcentaje deseado al entero más cercano (para propósitos de script esto puede ser más útil, ya que las pruebas de comparación aritmética de shell POSIX solo funcionan con 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)) ; } }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.