GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿cómo obtener la cantidad de memoria disponible de forma portátil en todas las distribuciones?

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 manera portátil (solo en distribuciones de Linux) y de manera confiable la cantidad de memoria, sin incluir 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 de free y cat /proc/meminfo en Arch, pero ¿cómo obtengo lo mismo en Ubuntu u otra distribución?

Respuesta aceptada:

MemAvailable está incluido en /proc/meminfo desde la versión 3.14 del kernel; fue agregado por el compromiso 34e431b0a. Ese es el factor determinante en las variaciones de salida que muestra. El mensaje de confirmación indica cómo estimar la memoria disponible sin MemAvailable :

Actualmente, la cantidad de memoria que está disponible para una nueva carga de trabajo, sin forzar el intercambio del sistema, se puede estimar a partir de MemFree , Active(file) , Inactive(file) y SReclaimable , así como las marcas de agua "bajas" de /proc/zoneinfo .

Las marcas de agua bajas son el nivel por debajo del cual se intercambiará el sistema. Entonces, en ausencia de MemAvailable al menos puede sumar los valores dados para MemFree , Active(file) , Inactive(file) y SReclaimable (lo que esté presente en /proc/meminfo ), y reste las marcas de agua bajas de /proc/zoneinfo . Este último también enumera el número de páginas gratuitas por zona, lo que podría ser útil como comparación...

El algoritmo completo se proporciona en el parche para meminfo.c y parece razonablemente fácil de adaptar:

  • sumar las marcas de agua bajas en todas las zonas;
  • tomar la memoria libre identificada (MemFree );
  • restar la marca de agua baja (debemos evitar tocar eso para evitar el intercambio);
  • agregue la cantidad de memoria que podemos usar desde el caché de la página (suma de Active(file) y Inactive(file) ):esa es la cantidad de memoria utilizada por la memoria caché de la página, menos la mitad de la memoria caché de la página o la marca de agua baja, lo que sea menor;
  • añadir la cantidad de memoria que podemos reclamar (SReclaimable ), siguiendo el mismo algoritmo.
Relacionado:Linux:¿cómo hacer que una unidad flash USB se pueda escribir en Linux?

Entonces, juntando todo esto, puede obtener la memoria disponible para un nuevo proceso con:

awk -v low=$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}') 
 '{a[$1]=$2}
  END{ 
   print a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]-(12*low); 
  }' /proc/meminfo 

Linux
  1. ¿Cómo puedo obtener una lista de redes inalámbricas disponibles en Linux?

  2. ¿Cómo enumerar los procesos adjuntos a un segmento de memoria compartida en Linux?

  3. ¿Cómo obtener la cantidad de discos físicos en Linux?

  4. ¿Cómo puedo reservar un bloque de memoria del kernel de Linux?

  5. ¿Cómo me notifican los errores de ECC en Linux?

Cómo obtener el tamaño de un directorio en Linux

Cómo obtener el tamaño de un directorio en Linux

Cómo obtener el nombre de archivo de la ruta completa en Linux

Cómo obtener la cantidad de procesadores/núcleos en Linux

¿Cómo usar el comando procs para mostrar los procesos activos en Linux?

Las 10 mejores distribuciones de Linux