Cómo verificar el uso de memoria desde la terminal

Hay muchas maneras en que puedes obtener información sobre el uso de memoria en tu sistema Linux. En este resumen, vamos a cubrir los métodos de línea de comandos más comúnmente utilizados:  free, vmstat, y top. También veremos la lectura directamente desde /proc/meminfo.

Cómo Linux usa la RAM

La RAM es un recurso finito del que todos los procesos, como las aplicaciones y los demonios, quieren una parte. Solo hay una cantidad disponible. El kernel arbitra las disputas de memoria y asigna la memoria racionada a todos los procesos hambrientos. Es algo así como una pájara madre con picos abiertos apuntando hacia ella con comida a repartir.

La RAM no utilizada es RAM desperdiciada. Linux usa cualquier RAM libre para cosas como espacio en el búfer de archivos, o para mantener tu computadora funcionando con un rendimiento óptimo.

Es fácil tener la impresión de que la RAM de tu sistema ha sido consumida por algún proceso desbocado o pérdida de memoria. Pero rara vez sucede esta situación.

Por lo general, solo el kernel hace su trabajo tenazmente en segundo plano. Si hay otras demandas de RAM que el kernel ha usado furtivamente para sus propios dispositivos, renuncia a la memoria al instante. Esto para evitar que haya daño.

Si el kernel decide que es más eficiente comenzar a usar el espacio de intercambio, también lo pone en juego. Hay mucha confusión sobre el valor swappiness en Linux y cuándo el kernel comenzará a usar el swap.

No es cierto que el valor swappiness establezca un umbral para el uso de RAM que active el uso de swap.

Pero ahora, revisemos las diferentes técnicas que puedes usar en la ventana de la terminal para ver el uso de RAM en tu computadora Linux.

Comando free

El comando free te brinda una tabla de la RAM total, usada, libre, compartida, buffer/cache y RAM disponible en tu computadora. También te muestra la cantidad total de espacio de intercambio configurado y cuánto se usa y está disponible.

En nuestro ejemplo, usaremos la opción –m (mebibytes). Sin embargo, también puedes usar -b (bytes), -k (kibibytes) o –g (gibibytes).

Escribimos el siguiente comando:

Este es el resultado que obtenemos:

Las columnas Mem contienen la siguiente información:

  • Total: la cantidad total de RAM física en esta computadora.
  • Used: la suma de Free + Buffers + Cache restada de la cantidad total.
  • Free: la cantidad de memoria no utilizada.
  • Shared: cantidad de memoria utilizada por los sistemas de archivos tmpfs.
  • Buff/cache: Cantidad de memoria utilizada para buffers y caché. El kernel puede liberarlo rápidamente si es necesario.
  • Available: Esta es una estimación de la memoria disponible para atender solicitudes de memoria de aplicaciones y cualquier otro software operativo en tu computadora.

Las columnas Swap contienen la siguiente información:

  • Total: el tamaño de la partición o archivo de intercambio.
  • Used: la cantidad de espacio de intercambio que está en uso.
  • Free: la cantidad de espacio de intercambio restante (no utilizado).

También puedes usar el siguiente truco ingenioso que modificamos de uno de nuestros lectores para ver el porcentaje de espacio de intercambio que se utiliza:

Comando vmstat

Es imposible tener una buena comprensión de la forma en que se usa la RAM en tu Linux sin una apreciación del estado de tu espacio de intercambio. La RAM y el espacio de intercambio funcionan en estrecha colaboración.

Puedes usar el comando vmstat para profundizar en cómo se está utilizando tu espacio swap (o memoria virtual). Te proporciona un informe sobre una variedad de estadísticas relacionadas con el swap basadas en los valores promedio desde el último reinicio.

Escribe lo siguiente:

Este es el resultado:

Hay muchos puntos de datos en ese informe, por lo que los desglosaremos:

  • Proc:
    • r: El número de procesos “ejecutables”. Están ejecutando o esperando su próxima ráfaga de ciclos de CPU.
    • b: El número de procesos en suspensión ininterrumpida. Estos no están durmiendo, sino que realizan una llamada al sistema de bloqueo. No pueden ser interrumpidos hasta que completen su acción actual. Por lo general, este proceso es un controlador de dispositivo que espera que algún recurso esté libre. Cualquier interrupción en cola para ese proceso se maneja cuando el proceso reanuda su actividad habitual.
  • Memory:

    • swpd: la cantidad de memoria virtual utilizada, es decir, cuánta memoria se ha intercambiado.
    • free: la cantidad de memoria inactiva (no utilizada).
    • buff: la cantidad de memoria utilizada como buffers.
    • cache: la cantidad de memoria utilizada como caché.
  • Swap:
    • si: la cantidad de memoria virtual intercambiada desde el espacio de swap.
    • so: la cantidad de memoria virtual intercambiada para el espacio swap.
  • IO:
    • bi: Bloques de entrada. El número de bloques de datos utilizados para intercambiar la memoria virtual de vuelta a la RAM.
    • bo: Bloques de salida. El número de bloques de datos utilizados para intercambiar memoria virtual fuera de RAM y en espacio de swap.
  • System:
    • in: el número de interrupciones por segundo, incluido el reloj.
    • cs: el número de cambios de contexto por segundo. Un cambio de contexto es cuando el kernel cambia del sistema al procesamiento en modo de usuario.
  • CPU:  estos valores son todos porcentajes del tiempo total de CPU:
    • us: Tiempo dedicado a ejecutar código de usuario (no kernel).
    • sy: Tiempo dedicado a ejecutar el código del kernel.
    • id: tiempo de inactividad.
    • wa: Tiempo dedicado a esperar entrada o salida.
    • st: El tiempo que una máquina virtual tiene que esperar a que el hipervisor termine de dar servicio a otras máquinas virtuales. Esto antes de que pueda regresar y atender a esta máquina virtual.

Comando top

El comando top muestra una pantalla llena de información.  Los valores se actualizan cada pocos segundos.

Para usarlo, escribimos lo siguiente:

Se presionó la tecla “e”. Esto cambió la visualización a megabytes, que son más fáciles de analizar visualmente que las cadenas largas que representan bytes. Hay cinco líneas de información en la parte superior de la pantalla y un panel inferior con columnas de datos.

Aquí está la información que encontrarás en cada línea:

  • Línea uno: el tiempo, cuánto tiempo ha estado funcionando la computadora, cuántas personas han iniciado sesión y cuál ha sido el promedio de carga en los últimos uno, cinco y 15 minutos.
  • Segunda línea: la cantidad de tareas y sus estados: running, stopped, sleeping, o zombie.
  • Línea tres: información de la CPU (debes consultar el desglose de los campos a continuación).
  • Cuarta línea:  la cantidad total de memoria física y la cantidad libre, utilizada, almacenada o almacenada en caché.
  • Línea cinco: Cantidad total de memoria swap, cuánto está libre, usada y disponible (teniendo en cuenta la memoria que se espera recuperar de los cachés).

Los campos de la CPU en la línea tres son los siguientes:

  • us: Tiempo que la CPU pasa ejecutando procesos para usuarios en el espacio de usuario.
  • sy: Tiempo que la CPU pasó ejecutando procesos del “espacio del kernel” del sistema.
  • ni: Tiempo que la CPU pasó ejecutando procesos con un valor agradable establecido manualmente.
  • id: tiempo de inactividad de la CPU.
  • wa: Tiempo que la CPU pasa esperando a que se complete la E / S.
  • hi: Tiempo que la CPU pasó reparando interrupciones de hardware.
  • si: Tiempo que la CPU pasó reparando interrupciones de software.
  • st (steal time): Tiempo que la CPU perdió debido a la ejecución de máquinas virtuales.

Puede que tengas que presionar las teclas de desplazamiento izquierda o derecha para ver todas las columnas. Los valores en cada columna se describen a continuación:

  • PID: ID del proceso.
  • USER: Nombre del propietario del proceso.
  • PR: prioridad del proceso.
  • NI: El valor ideal del proceso.
  • VIRT: memoria virtual utilizada por el proceso.
  • RES: memoria residente utilizada por el proceso.
  • SHR: memoria compartida utilizada por el proceso.
  • S: estado del proceso. (Debes consultar la lista de valores que este campo puede tomar a continuación).
  • % CPU: el tiempo compartido de CPU utilizado por el proceso desde la última actualización.
  • % MEM:  El porcentaje de memoria física utilizada.
  • TIME+:  tiempo total de CPU utilizado por la tarea en centésimas de segundo.
  • COMMAND:  El nombre o línea del comando (nombre + opciones). (Esta columna está fuera de la pantalla a la derecha en la imagen de arriba).

El estado que se muestra en la columna S puede ser uno de los siguientes:

  • D: Descanso ininterrumpido.
  • R: Ejecutándose
  • S: Descansando.
  • T: Trazado (detenido).
  • Z: zombi.

Debes presionar Q para salir.

Entendiendo /proc/meminfo

Muchas (y, muy probablemente, la mayoría) de las herramientas en Linux que informan estadísticas de memoria recuperan su información del pseudo sistema de archivos /proc/meminfo. Podemos usar los comandos cat less para hacer lo mismo.

Escribimos lo siguiente:

Es posible que veas diferentes campos según el kernel que se esté ejecutando y la arquitectura de la CPU. Obtuvimos los siguientes resultados en nuestra máquina virtual:

Todos los tamaños están en kibibytes a menos que se indique lo contrario. Esto es lo que significan, junto con algunos otros que puedes ver dependiendo de la configuración y el hardware de tu computadora:

  • MemTotal: RAM total utilizable (aparte de algunos bits reservados y el código binario del kernel).
  • MemFree: la suma de LowFree+ HighFree. La cantidad de RAM disponible actualmente.
  • MemAvailable: memoria estimada disponible para iniciar nuevas aplicaciones, sin swap.
  • Buffers: almacenamiento temporal para bloques de disco sin procesar. Esto reduce la entrada y salida del disco duro. También acelera el acceso a solicitudes posteriores de los mismos datos porque ya están en la memoria.
  • Cached: páginas en caché leídas de archivos en el disco duro (sin incluir SwapCached).
  • SwapCached: memoria intercambiada y devuelta, y una copia permanece en el espacio de swap.
  • Active: memoria utilizada recientemente. No se reclama a menos que sea absolutamente necesario.
  • Inactive: memoria utilizada, pero no la más reciente. Es un candidato probable para la recuperación.
  • Active (anon): memoria asignada a los archivos creados en un sistema de pseudoarchivos tmpfs. Los archivos anónimos no residen en el disco duro.
  • Inactive (anon):  cantidad de anónimos, tmpfs y memoria shmem que es candidato para el desalojo (recuperación de memoria).
  • Active (file):  Cantidad de memoria caché de archivo en uso, o que se ha utilizado desde el ciclo de recuperación de memoria anterior.
  • Inactive (file):  cantidad de memoria caché de archivo leída de un disco duro que es candidato para la recuperación.

  • Unevictable: cantidad de memoria que debe ser evitable, pero no porque esté bloqueada en la memoria por procesos de espacio de usuario.
  • Mlocked: la cantidad total de memoria no se puede desalojar porque está bloqueada por procesos de espacio de usuario.
  • HighTotal: cantidad total de HighMem, que utilizan los programas de espacio de usuario y la memoria caché de página. El kernel puede acceder a esta zona de memoria, pero es más lento para acceder que LowMem.
  • HighFree:  Cantidad de HighMem libre.
  • LowTotal:  Cantidad de LowMem, que está disponible para los mismos usos que HighMem, pero también para que el kernel la use para sus propios fines.
  • LowFree: Cantidad de LowMem libre.
  • MmapCopy:  cantidad de memoria asignada a los datos del archivo.
  • SwapTotal: cantidad total de espacio de swap disponible.
  • SwapFree:  cantidad de espacio de swap que actualmente no se utiliza.
  • Dirty:  cantidad de memoria en espera de volver a escribirse en el disco.
  • Writeback: la memoria se vuelve a escribir activamente en el disco.
  • AnonPages: páginas sin copia de seguridad asignadas en tablas de páginas de espacio de usuario.
  • Mapped: archivos (como las bibliotecas) que están asignados a la memoria.
  • Shmem:  Cantidad de memoria consumida en sistemas de pseudoarchivos tmpfs.
  • KReclaimable: asignaciones de memoria del kernel que el kernel intentará reclamar si la demanda de memoria es lo suficientemente grave.
  • Slab: Caché de estructuras de datos en el kernel.
  • SReclaimable:  cantidad de memoria Slab que se puede reclamar, como cachés.
  • SUnreclaim:  cantidad de memoria Slab que no se puede reclamar.
  • KernelStack:  cantidad de memoria asignada a los conjuntos de kernel.
  • PageTables:  cantidad de memoria dedicada al nivel más bajo de tablas de páginas.

  • Quicklists: debido a que la asignación y eliminación de tablas de páginas es una operación muy frecuente, es vital que sea lo más rápido posible. Por lo tanto, las páginas utilizadas para las tablas de páginas se almacenan en caché en varias listas diferentes llamadas “listas rápidas”.
  • NFS_Unstable: páginas del Sistema de archivos de red (NFS) que ha recibido el servidor, pero que aún no se ha escrito en un almacenamiento no volátil.
  • Bounce: memoria utilizada para los búferes de rebote del dispositivo de bloque. Se coloca un búfer de rebote en la memoria lo suficientemente bajo como para que un dispositivo acceda directamente a él. Los datos se copian en la página de usuario deseada en HighMem.
  • WritebackTmp: memoria utilizada por el sistema de archivos en el espacio de usuario (FUSE) para buffers temporales de reescritura.
  • CommitLimit: la cantidad total de memoria actualmente disponible para ser asignada en el sistema.
  • Committed_AS: la cantidad de memoria estimada para satisfacer todas las demandas actuales. Si un programa solicita algo de RAM, la solicitud se registra, pero la RAM solo se asigna una vez que el programa comienza a usarla. También solo se asigna según sea necesario, hasta la cantidad máxima que el programa reservó. Se puede “asignar” más memoria de la que se puede entregar realmente. Si todos los programas intentan cobrar sus chips de RAM a la vez, el casino de memoria podría ir a la quiebra (y tener que ir de la mano a los financieros del espacio de intercambio).
  • VmallocTotal:  tamaño total del área de memoria de vmalloc.
  • VmallocUsed: Cantidad de área de vmalloc utilizada. Desde Linux 4.4, este campo ya no se calcula, está codificado.
  • VmallocChunk: El bloque contiguo más grande del área libre de vmalloc.

  • HardwareCorrupted: Cantidad de memoria etiquetada como que tiene problemas de corrupción de memoria física. No será asignado.
  • LazyFree:  cantidad de memoria en estado MADV_FREE. Cuando una aplicación establece el indicador MADV_FREE en un rango de páginas, esto indica que ya no las requiere, y ahora son candidatos de reclamo. La recuperación real podría retrasarse hasta que haya suficiente demanda de memoria. Si la aplicación comienza a escribir en páginas, la reclamación puede cancelarse.
  • AnonHugePages: páginas enormes sin respaldo de archivo asignadas en tablas de páginas de espacio de usuario. Las páginas sin respaldo de archivo no provienen de un archivo de disco duro.
  • ShmemHugePages:  cantidad de memoria utilizada por la memoria compartida (shmem) y los sistemas de pseudoarchivos (tmpfs) asignados con páginas grandes.
  • ShmemPmdMapped:  cantidad de memoria compartida asignada al espacio de usuario con páginas enormes.
  • CmaTotal:  Cantidad de páginas CMA (Asignación de memoria contigua). Estos son utilizados por dispositivos que solo pueden comunicarse con regiones contiguas de memoria.
  • CmaFree:  Cantidad de páginas libres de CMA (Asignación de memoria contigua).
  • HugePages_Total:  tamaño de grupo de páginas Huge.
  • HugePages_Free:  Número de páginas grandes no asignadas en el grupo.
  • HugePages_Rsvd:  Número de grandes páginas reservadas. Se ha hecho el compromiso de asignar, pero la asignación aún no ha ocurrido.
  • HugePages_Surp:  Número de páginas grandes en el grupo por encima del valor del sistema definido.
  •  Hugepagesize: tamaño de páginas enormes.
  • DirectMap4k: número de bytes de RAM asignados a páginas de 4 kB.
  • DirectMap4M: Número de bytes de RAM asignados a páginas de 4 MB.
  • DirectMap2M: Número de bytes de RAM asignados a páginas de 2 MB.
  • DirectMap1G: Número de bytes de RAM asignados a páginas de 2 GB.

Conclusión

Como es habitual con Linux, hay más de una forma de obtener una visión general rápida, y siempre al menos una forma de profundizar en los detalles.

Probablemente usarás freetopvmstate regularmente, y reserves /proc/meminfo para cuando necesites hacer una inmersión profunda para investigar un problema en particular.