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.
759456KB está "usado" (segunda columna, fila superior). De esta memoria "usada", 23132 KB son búferes (5.ª columna, fila superior) y 592.484 KB (sexta columna, fila superior) son caché, lo que deja 144.840 KB (2.ª columna, 2.ª fila) de memoria física que utilizan los procesos activos.
Si considera que la memoria utilizada por los búferes y la memoria caché podría utilizarse para los procesos, eso deja 630716 KB (tercera columna, segunda 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án en uso, lo que deja 478 372 KB (tercera columna, fila inferior) libres.
Por lo tanto, su definición de % de memoria libre depende de si está contando los búferes y el caché o no, y si está contando el intercambio o no.
Eso debería darte suficiente para calcular un porcentaje como mejor te 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 están de acuerdo 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á 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 todos los mismos números que gratis.
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