Los archivos / herramientas estándar que informan sobre la memoria parecen tener diferentes formatos en diferentes distribuciones de Linux. Por ejemplo, en Arch y Ubuntu.
Arco
$ free total used free shared buff/cache available Mem: 8169312 3870392 2648348 97884 1650572 4110336 Swap: 16777212 389588 16387624 $ head /proc/meminfo MemTotal: 8169312 kB MemFree: 2625668 kB MemAvailable: 4088520 kB Buffers: 239688 kB Cached: 1224520 kB SwapCached: 17452 kB Active: 4074548 kB Inactive: 1035716 kB Active(anon): 3247948 kB Inactive(anon): 497684 kB
Ubuntu
$ free total used free shared buffers cached Mem: 80642828 69076080 11566748 3063796 150688 58358264 -/+ buffers/cache: 10567128 70075700 Swap: 20971516 5828472 15143044 $ head /proc/meminfo MemTotal: 80642828 kB MemFree: 11565936 kB Buffers: 150688 kB Cached: 58358264 kB SwapCached: 2173912 kB Active: 27305364 kB Inactive: 40004480 kB Active(anon): 7584320 kB Inactive(anon): 4280400 kB Active(file): 19721044 kB
Entonces, ¿cómo puedo obtener de forma portátil (solo en las distribuciones de Linux) y obtener de forma confiable la cantidad de memoria, excluyendo el intercambio, que está disponible para que mi software la use en un momento determinado? Presumiblemente, eso es lo que se muestra como "disponible" y "MemAvailable" en la salida free
y cat /proc/meminfo
en Arch, pero ¿cómo obtengo lo mismo en Ubuntu u otra distribución?
awk -v low=$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}') '{a[$1]=$2}END{m=a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]; print a["MemAvailable:"],m-low}' /proc/meminfo
cual debería darme el mismo número impreso dos veces. Sin embargo, el segundo número (según entiendo el algoritmo que sugiere) es más alto que el que seMemAvailable
muestra en/proc/meminfo
. ¿Qué estoy haciendo mal?/proc/zoneinfo
cuenta páginas, que en su mayoría tienen un tamaño de 4KBamd64
; también le falta la seguridad adicional agregada al caché de la página y la memoria recuperable. Simplificando esto último, podemos restar la marca de agua baja tres veces, por lo quem-12*low
(3 × 4KB) da el resultado correcto en mi sistema. (Esta simplificación subestima la memoria disponible si la memoria caché de la página o la memoria recuperable es menor que el doble de la marca de agua baja, pero de todos modos no querrá usar mucha memoria en esa situación, por lo que parece ser un compromiso razonable).(file)
entradas ni laSReclaimable
entrada? En una caja de centos anterior con kernel v 2.6.18-348.16.1.el5xen (peruname -r
), esta es la salida que obtengo: pastebin.com/iFWiM1kX . Su cálculo solo tira de laMemFree
parteSi bien la respuesta de Stephen es perfectamente suficiente y se equivoca por el lado de la precaución, decidí escribir la lógica completa, incluidas las comparaciones mínimas. La información se lee primero de / proc / meminfo y se almacena en una variable para que los detalles de la memoria sean consistentes.
El resultado almacenado en variable está en bytes.
fuente