Cómo usar el comando free en Linux

Introducción 

El comando free de Linux muestra la cantidad de memoria de tu computadora en uso y la cantidad que aún está disponible para que los programas la usen. Su salida puede ser confusa para los no entendidos, pero te mostraremos cómo entenderla.

Comando free

El comando free imprime un resumen rápido del uso de memoria en una ventana de la terminal. Este no tiene muchas opciones o trucos bajo la manga, y no se necesita mucho tiempo y esfuerzo para aprender a usarlo. Sin embargo, aprender a interpretar correctamente la información que proporciona es otra historia. Es muy fácil confundirse con lo que free te está diciendo.

En parte, esto se debe a la terminología, como la diferencia entre “free (libre)” y “available (disponible)”. También en parte se debe al funcionamiento interno de la memoria y las rutinas de administración del sistema de archivos del kernel de Linux. Si tienes memoria adicional que el kernel puede hacer un buen uso, la tomará prestada para sus propios fines. Hasta que la necesites de nuevo.

Vamos a sumergirnos en los mecanismos subyacentes y las rutinas de datos para que puedas apreciar lo que sucede en segundo plano. Aprenderás cómo afecta todo esto al uso de tu memoria de acceso aleatorio (RAM).

Columnas “free”

Iniciemos free sin opciones y veamos qué obtenemos:

Esto no se presenta de la mejor manera. En tu computadora, podrás ajustar la ventana de la terminal. Aquí está la salida en una tabla más ordenada:

Las cifras se muestran en kibibytes, que son 1024 bytes. En Manjaro, el comando tiene free un alias como free -m. Esto obliga free a usar mebibytes, que son 1.048.576 bytes. En otras distribuciones, el valor predeterminado es kibibytes.

La línea superior informa sobre la memoria del sistema, la línea inferior informa sobre el espacio de intercambio. Presentaremos las columnas aquí, luego las veremos con más detalle en breve. Las columnas para la línea de memoria son las siguientes:

  • Total: la cantidad total de RAM física instalada en tu computadora.
  • Used: Esto se calcula por Total – (Free+ Buffers+ Cache).
  • Free: la cantidad de memoria no utilizada. ¿Por qué no Total = Used + Free? Lo explicaremos en breve.
  • Shared: memoria utilizada por el sistema de archivos tmpfs.
  • Buff/cache: Memoria utilizada para búfer y caché.
  • Avaible: Esta es una estimación de la memoria que está disponible para atender solicitudes de memoria de aplicaciones. Asimismo, cualquier otro software que funcione dentro de tu computadora, como tu entorno de escritorio gráfico y comandos de Linux.

Para la línea de intercambio (swap), las columnas son:

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

Información ampliada

Para separar las cifras Buff/cache en sus propias columnas, debes usar la opción –w (ancho):

Este es el resultado. En lugar de una columna Buff/cache, obtenemos una columna Buffers y una columna Cache. Aquí están las cifras en una tabla:

Veamos qué representan las cifras en las columnas.

 Columna “total”

Esta es el simple. Es la cantidad de RAM que has instalado en tu motherboard. Este es el recurso precioso por el que todos los procesos en ejecución están luchando. Al menos estarían peleando si el kernel no estuviera arbitrando.

Por cierto, el lugar desde donde free recopila su información es el archivo /proc/meminfopseudo. Puedes echar un vistazo a este archivo tú mismo con el siguiente comando:

La salida es una lista única de nombres y valores.

Columna “Used”

Aquí es donde comienza a ponerse interesante.

La cifra Used representa lo que probablemente esperarías, además de un montón de otras cosas. Esta es la memoria que se asigna a los procesos, tomada por los programas de usuario y utilizada por cosas como los entornos de escritorio. Por ejemplo, GNOME o KDE. No hay sorpresas allí. Pero también incluye las cifras Buffers y Cache.

La RAM que no se usa para algo es RAM desperdiciada. El kernel utiliza RAM de reserva para almacenar cachés y memorias bufer que le permiten funcionar de manera más eficiente. Entonces, esta memoria RAM está siendo utilizada para algo por el núcleo, pero no por nada en el espacio del usuario.

Si se recibe una solicitud de memoria que solo puede ser atendida renunciando a parte de la RAM que el núcleo está utilizando para sus propios dispositivos, entonces eso es lo que sucede sin problemas. Liberar esta RAM y usarla para otras aplicaciones no afectará el funcionamiento correcto de tu sistema Linux. Nada se dañará. Pero podría afectar el rendimiento del sistema.

Por lo tanto, esta columna realmente significa “toda la RAM que está en uso por algo, incluso si puede recuperarse al instante”.

Columna “free”

Esta columna contiene la cifra de la cantidad de RAM que no está siendo utilizada por nada. La columna Used contiene las cifras de Buffers y Caché. Por lo tanto, no es raro que los sistemas Linux que funcionan perfectamente tengan muy poca RAM listada como “free”.

Eso no es necesariamente algo malo, y casi con certeza significa que tienes un sistema que funciona perfectamente y que regula el uso de RAM correctamente. Es decir, la RAM está siendo utilizada por aplicaciones y otros procesos de espacio de usuario. Asimismo, por el núcleo en sus esfuerzos por hacer que el rendimiento de tu computadora sea lo mejor posible.

Columna “shared”

La cifra en la columna Shared representa la memoria dedicada a mantener   sistemas de archivos basados ​​en RAM tmpfs. Estos son sistemas de archivos que se crean en la memoria para facilitar el funcionamiento eficiente del sistema operativo. Para ver qué sistemas de archivos tmpfs están presentes, debes utilizar el comando df.

Las opciones que estamos usando son:

  • -h (humano): utiliza unidades sensatas y de mejor ajuste.
  • –total: Muestra una línea con totales en la parte inferior de la salida.
  • –type=tmpfs: Solo informa sobre los sistemas de archivos tmpfs.

Lo primero que te impacta cuando miras esos valores es que son muchas veces más grandes que la cifra de la columna Shared. Los tamaños que se muestran aquí son los tamaños máximos de estos sistemas de archivos. En realidad, cada uno solo ocupa la memoria que necesitan. La cifra en la columna Shared es en la que se debe confiar para el uso de memoria.

¿Qué contienen estos sistemas de archivos? Aquí hay un desglose rápido:
  • /run: Esta tiene muchos archivos temporales, tales como archivos de PID, systemd diario que no tienen que ser conservados en los reinicios. Además, información relacionada con los zócalos de dominio Unix, FIFO, y la gestión de los demonios.
  • /dev/shm: Esto permite la implementación de gestión de memoria compatible con POSIX en Debian y distribuciones Linux derivadas de Debian.
  • /run/lock: contiene archivos de bloqueo. Estos se utilizan como indicadores para que el sistema sepa que un archivo u otro recurso compartido está en uso. Contienen el PID del proceso que usa ese recurso.
  • /sys/fs/cgroup: este es un elemento central del esquema que administra los grupos de control. Los procesos se organizan en grupos jerárquicos según los tipos de recursos que utilizan. Permite el uso de los recursos por parte de los procesos para ser monitoreados y limitados.
  • /run/user/121: esta es una carpeta creada por pam_systemd para almacenar archivos temporales para un usuario. En este caso, el usuario tiene un ID de 121. Ten en cuenta que el “usuario” podría ser un usuario normal, un demonio o algún otro proceso.
  • /run/user/1000: esta es una carpeta creada por pam_systemd para almacenar archivos temporales para este usuario, que tiene el ID de usuario 1000. Este es el usuario actual, el usuario Dave.

Columnas “Buffer” y “Cache”

Las columnas BufferCache solo aparecen si ha utilizado -w (ancho). Sin la opción – w, las cifras de estas dos columnas se combinan en la columna Buff/cache.

Estas dos áreas de memoria interactúan y dependen unas de otras. El área de caché contiene (principalmente) datos que se han leído del disco duro. Se conserva en caso de que necesites acceder nuevamente.

Es más rápido hacerlo extrayendo esos datos de la caché que volviéndolos a leer desde el disco duro. La caché también puede contener datos que se han modificado pero que aún no se han escrito en el disco duro. También puede contener valores que se han calculado y aún no se han guardado en un archivo.

Para realizar un seguimiento de los diversos fragmentos de archivos y depósitos de datos, el kernel crea un índice en el área de memoria caché. Esto en el área de memoria de búferes. Las memorias búfer son porciones de memoria que contienen bloque de disco y otras estructuras de información.

Estos contienen datos sobre los datos que se mantienen en el área de memoria caché. Entonces los buffers son metadatos para el caché.

Cuando se realiza una solicitud de lectura de archivo, el kernel lee los datos en las estructuras de datos del búfer buscando el archivo o fragmento de archivo que se ha solicitado. Si se encuentra, la solicitud se atiende desde el área de memoria caché señalada por las estructuras de datos del búfer. Si no está presente en la memoria caché. Además, si tampoco lo está en los metadatos del área de memoria de las memorias búfer, el archivo se lee desde el disco duro.

Las estructuras en el área de memoria búfer son:
  • Encabezados del búfer: cada búfer se describe en un bloque de datos llamado encabezado del búfer. Además, si se modifican los datos en el bloque y la página de memoria asociada se “ensucia”, el descriptor rastrea la necesidad de volver a escribir los datos en el disco duro.
  • Inodos: los inodos contienen metadatos sobre archivos y directorios. Entre estos se incluye dónde están en el disco duro (o sistema de archivos virtual), tamaño del archivo y los registros de tiempo del archivo.
  • Dentries: Un dentry (entrada de directorio) es una estructura que contiene información de listado de directorio. Piensa en esto como una lista de inodos para los archivos y directorios dentro de un directorio.

Puedes ver por qué tiene sentido condensar la memoria utilizada para las áreas de memoria búfer y memoria caché en una sola columna Buff/cache. Son como dos partes de la misma cosa. El área de la memoria caché sería inútil sin que el área de la memoria bufer proporcione un índice a su contenido.

Columna “Available”

La columna disponible (available) es la suma de la columna Free más las porciones de las columnas Buffers y Cache (o la columna Buff/cache). La columna Available es una estimación, no una cifra exacta. Es una estimación informada y precisa, pero no debe tomarse como precisa hasta el último byte.

Cambiar las unidades de visualización

Para cambiar las unidades que muestran las cifras libres, debes usar una de las siguientes opciones.

  • -b: muestra los valores en bytes.
  • -k: muestra los valores en kibibytes (que es el valor predeterminado).
  • -m: muestra los valores en mibibytes.
  • -g: muestra los valores en gibibytes.
  • -h: muestra los valores en unidades sensibles de mejor ajuste, unidades (legibles por humanos).

Por ejemplo, para usar valores legibles por humanos, tienes que utilizar la opción –h:

free utilizará la unidad más apropiada para cada valor. Como puedes ver, algunos de los valores se muestran en MiB, y algunos de ellos están en GiB.

Mostrando un total

La opción –total obliga a free a mostrar una línea total, que suma los valores de las columnas Total, Used y Free de la memoria y líneas Swap.

Opción “count”

La opción –c (cuenta) le dice a free que se ejecute un cierto número de veces, con una pausa de un segundo entre cada una. Para ejecutar free dos veces, usa este comando:

Ejecutar free continuamente

Si deseas ver el efecto que tiene una determinada aplicación en el uso de tu memoria, puede ser útil que se ejecute free continuamente. Esto te permite ejecutar free en una ventana de la terminal mientras inicias, usas y luego cierras la aplicación que estás investigando.

La opción –s (segundos) determina la duración de la pausa entre cada ejecución de free. Para tener una ejecución continua de free con una pausa de tres segundos entre cada actualización, usa este comando:

Presiona Ctrl+C para detener el proceso y regresar a la terminal.

Combinando las opciones de Cuenta y Segundos

Puedes ejecutar free con una pausa específica entre cada actualización, pero detenerse después de un cierto número de informes. Para ello debes combinar las opciones –s (segundos) y –c (recuento). Para ejecutar free cinco veces con una pausa de dos segundos entre cada actualización, debes usar este comando:

Una vez que han mostrado las cinco actualizaciones, el proceso finaliza automáticamente y regresa a la terminal.

Separar memoria baja y alta

Esto es de poca utilidad hoy en día, pero si estás ejecutando Linux en una computadora de 32 bits, podría resultar útil. Separa el uso de memoria de poca memoria y alta memoria.

En un sistema operativo basado en Linux de 32 bits, el CPU puede direccionar un máximo de 4 GB de memoria. La memoria se divide en memoria baja y memoria alta. En el caso de la memoria baja se asigna directamente a la parte del núcleo del espacio de direcciones. Por otra parte memoria alta no tiene mapeo directo del kernel. La memoria alta suele ser superior a 896 MB.

Esto significa que el núcleo en sí (incluidos sus módulos activos) solo puede hacer uso de memoria baja. Los procesos del usuario, cualquier cosa que no sea el núcleo en sí, pueden hacer uso de memoria baja y alta.

En una computadora de 64 bits no se mostrarán valores para la memoria alta:

Las están memorias hechas de esto

Un resumen rápido:

  • Total: la cantidad de RAM instalada en tu sistema.
  • Used: igual a Total – (Free+ Buffers+ Cache).
  • Free: la cantidad de memoria completamente no utilizada por nada.
  • Shared: memoria tomada por los sistemas de archivos tmpfs.
  • Buffer: las estructuras de datos que se mantienen para proporcionar un índice para todo lo almacenado Cache.
  • Cache: datos leídos del disco duro, datos modificados en espera de ser escritos de nuevo en el disco duro y otros valores calculados.
  • Available: lo que es realmente libre. Una estimación de la memoria en FreeBufferCache que podrían ser utilizados para satisfacer una petición de memoria.