Hay numerosas formas de obtener información sobre la memoria instalada en los sistemas Linux y ver cuánta de esa memoria está siendo utilizada. Algunos comandos proporcionan una cantidad abrumadora de detalles, mientras que otros proporcionan respuestas sucintas, aunque no necesariamente fáciles de digerir. En este post, veremos algunas de las herramientas más útiles para comprobar la memoria y su uso.
Antes de entrar en detalles, sin embargo, vamos a revisar algunos aspectos básicos. La memoria física y la memoria virtual no son lo mismo. Esta última incluye el espacio de disco configurado para ser utilizado como swap. La swap puede incluir particiones reservadas para este uso o archivos que se crean para añadir al espacio de swap disponible cuando crear una nueva partición no es práctico. Algunos comandos de Linux proporcionan información sobre ambos.
Swap amplía la memoria proporcionando espacio en disco que puede utilizarse para albergar páginas inactivas que se mueven al disco cuando la memoria física se llena.
Un archivo que desempeña un papel en la gestión de la memoria es /proc/kcore. Este archivo parece un archivo normal (aunque extremadamente grande), pero no ocupa espacio en el disco en absoluto. En su lugar, es un archivo virtual como todos los archivos de /proc.
$ ls -l /proc/kcore-r--------. 1 root root 140737477881856 Jan 28 12:59 /proc/kcore
Interesantemente, los dos sistemas consultados a continuación no tienen la misma cantidad de memoria instalada, sin embargo, el tamaño de /proc/kcore es el mismo en ambos. El primero de estos dos sistemas tiene 4 GB de memoria instalada; el segundo tiene 6 GB.
system1$ ls -l /proc/kcore-r--------. 1 root root 140737477881856 Jan 28 12:59 /proc/kcoresystem2$ ls -l /proc/kcore-r-------- 1 root root 140737477881856 Feb 5 13:00 /proc/kcore
Las explicaciones que afirman que el tamaño de este archivo representa la cantidad de memoria virtual disponible (quizás más 4K) no tienen mucho peso. ¡Este número sugeriría que la memoria virtual en estos sistemas es de 128 terabytes! Ese número parece representar más bien la cantidad de memoria que un sistema de 64 bits podría ser capaz de direccionar, no la cantidad disponible en el sistema. Los cálculos de lo que serían 128 terabytes y ese número, más 4K son bastante fáciles de hacer en la línea de comandos:
$ expr 1024 \* 1024 \* 1024 \* 1024 \* 128140737488355328$ expr 1024 \* 1024 \* 1024 \* 1024 \* 128 + 4096140737488359424
Otro comando más amigable para examinar la memoria es el comando free. Te da un informe fácil de entender sobre la memoria.
$ free total used free shared buff/cache availableMem: 6102476 812244 4090752 13112 1199480 4984140Swap: 2097148 0 2097148
Con la opción -g, free informa de los valores en gigabytes.
$ free -g total used free shared buff/cache availableMem: 5 0 3 0 1 4Swap: 1 0 1
Con la opción -t, free muestra los mismos valores que sin opciones (¡no confundas -t con terabytes!) pero añadiendo una línea de total en la parte inferior de su salida.
$ free -t total used free shared buff/cache availableMem: 6102476 812408 4090612 13112 1199456 4983984Swap: 2097148 0 2097148Total: 8199624 812408 6187760
Y, por supuesto, puedes elegir usar ambas opciones.
$ free -tg total used free shared buff/cache availableMem: 5 0 3 0 1 4Swap: 1 0 1Total: 7 0 5
Puede que este informe te decepcione si intentas responder a la pregunta «¿Cuánta RAM hay instalada en este sistema?» Este es el mismo sistema que se muestra en el ejemplo anterior que se describió como con 6GB de RAM. Eso no significa que este informe sea erróneo, sino que es la visión del sistema sobre la memoria que tiene a su disposición.
El comando free también proporciona una opción para actualizar la pantalla cada X segundos (10 en el ejemplo de abajo).
$ free -s 10 total used free shared buff/cache availableMem: 6102476 812280 4090704 13112 1199492 4984108Swap: 2097148 0 2097148 total used free shared buff/cache availableMem: 6102476 812260 4090712 13112 1199504 4984120Swap: 2097148 0 2097148
Con -l, el comando free proporciona el uso de memoria alto y bajo.
$ free -l total used free shared buff/cache availableMem: 6102476 812376 4090588 13112 1199512 4984000Low: 6102476 2011888 4090588High: 0 0 0Swap: 2097148 0 2097148
Otra opción para ver la memoria es el archivo /proc/meminfo. Al igual que /proc/kcore, este es un archivo virtual y uno que da un informe útil que muestra cuánta memoria está instalada, libre y disponible. Claramente, libre y disponible no representan lo mismo. MemFree parece representar la RAM no utilizada. MemAvailable es una estimación de cuánta memoria está disponible para iniciar nuevas aplicaciones.
$ head -3 /proc/meminfoMemTotal: 6102476 kBMemFree: 4090596 kBMemAvailable: 4984040 kB
Si sólo quieres ver la memoria total, puedes usar uno de estos comandos:
$ awk '/MemTotal/ {print $2}' /proc/meminfo6102476$ grep MemTotal /proc/meminfoMemTotal: 6102476 kB
Las entradas de DirectMap dividen la información sobre la memoria en categorías.
$ grep DirectMap /proc/meminfoDirectMap4k: 213568 kBDirectMap2M: 6076416 kB
DirectMap4k representa la cantidad de memoria que se asigna a las páginas estándar de 4k, mientras que DirectMap2M muestra la cantidad de memoria que se asigna a las páginas de 2MB.
El comando getconf es uno que proporcionará bastante más información de la que la mayoría de nosotros quiere contemplar.
$ getconf -a | moreLINK_MAX 65000_POSIX_LINK_MAX 65000MAX_CANON 255_POSIX_MAX_CANON 255MAX_INPUT 255_POSIX_MAX_INPUT 255NAME_MAX 255_POSIX_NAME_MAX 255PATH_MAX 4096_POSIX_PATH_MAX 4096PIPE_BUF 4096_POSIX_PIPE_BUF 4096SOCK_MAXBUF_POSIX_ASYNC_IO_POSIX_CHOWN_RESTRICTED 1_POSIX_NO_TRUNC 1_POSIX_PRIO_IO_POSIX_SYNC_IO_POSIX_VDISABLE 0ARG_MAX 2097152ATEXIT_MAX 2147483647CHAR_BIT 8CHAR_MAX 127--More--
Agrandar esa salida a algo específico con un comando como el que se muestra a continuación, y obtendrá el mismo tipo de información proporcionada por algunos de los comandos anteriores.
$ getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024" kB"}'6102476 kB
Ese comando calcula la memoria multiplicando los valores de la primera y última línea de salida así:
PAGESIZE 4096 <==_AVPHYS_PAGES 1022511_PHYS_PAGES 1525619 <==
Calculando eso de forma independiente, podemos ver cómo se deriva ese valor.
$ expr 4096 \* 1525619 / 10246102476
¡Está claro que es uno de esos comandos que merece ser convertido en un alias!
Otro comando con una salida muy digerible es top. En las primeras cinco líneas de la salida de top, verás algunos números que muestran cómo se está utilizando la memoria.
$ toptop - 15:36:38 up 8 days, 2:37, 2 users, load average: 0.00, 0.00, 0.00Tasks: 266 total, 1 running, 265 sleeping, 0 stopped, 0 zombie%Cpu(s): 0.2 us, 0.4 sy, 0.0 ni, 99.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 stMiB Mem : 3244.8 total, 377.9 free, 1826.2 used, 1040.7 buff/cacheMiB Swap: 3536.0 total, 3535.7 free, 0.3 used. 1126.1 avail Mem
Y finalmente un comando que responderá a la pregunta «Entonces, ¿cuánta RAM está instalada en este sistema?» de una manera sucinta:
$ sudo dmidecode -t 17 | grep "Size.*MB" | awk '{s+=$2} END {print s / 1024 "GB"}'6GB
Dependiendo de cuántos detalles quiera ver, los sistemas Linux proporcionan un montón de opciones para ver cuánta memoria está instalada en sus sistemas y cuánta se usa y está disponible.