Comando FREE: ¿Cache, Buffers, Shared?

La salida del comando free, puede tornarse difícil de interpretar en algunas ocasiones, por ejemplo: lo ejecutamos en un server en el que corren dos procesos esenciales que no deberían de usar más del 30% del total de la memoria RAM, pero vemos que la columna “free” nos indica: 80MB, no es posible ¿donde han ido nuestros 4GB, 8GB o 10GB de memoria RAM restantes?

Vamos a intentar entenderlo.

$ free -m
              total        used        free      shared  buff/cache   available
Mem:            926         143         343          17         439         709
Swap:            99           0          99

En el recuadro superior podemos detallar una salida normal del comando, simplemente añadiendo la opción -m (–mebi) que es igual a ejecutar el comando sin opciones, pero dividendo los valores entre 1024.

TOTAL

La columna total es, como bien indica el total de memoria RAM instalada en el sistema, esta información es extraída del “fichero/proc/meminfo, la línea denominada MemTotal, como se puede en la imagen.

USED

Used, es la cantidad de memoria usada por todos los procesos del sistema. Este valor también se puede obtener del fichero /proc/meminfo. También podríamos extraer este valor ejecutando el siguiente comando:

$ ps aux | awk '{sum=sum+$6}; END {print sum/1024}'

Si ejecutamos dicho comando notaremos que su salida es muy parecida a la que nos entrega el comando free en la columna used.

FREE

Free, memoria libre, realmente libre, es decir, esto no quiere decir que tu sistema solo disponga de esta cantidad de memoria para usar por nuevos procesos, lo único que indica que es esta la cantidad de memoria que no ha sido tocada por ningún proceso, ni por el Kernel, por que al Kernel le encanta robar memoria. Enseguida me entenderás…

Este valor se extrae realizando la siguiente ecuación:

MemoriaTotal - ( Buffers + Cache + Used) = MemoriaLibre

En el recuadro del principio de esta entrada donde expongo la salida del comando free en mi Raspberry, tenemos la columna buff/cache esta es la union de buffer+cache, pero podemos separar los valores aquí sumados ejecutando free de la siguiente manera:

$ free -w
              total        used        free      shared     buffers       cache   available
Mem:         948304      154044      324852       17708       53580      415828      718460
Swap:        102396           0      102396

SHARED

Shared, es la cantidad de memoria usada por los archivos de sistemas temporales (tmpfs), estos archivos son usados principalmente por el Kernel, han sido creados para que todo el contenido que use el Kernel lo escriba en ellos y no tenga que escribir en el disco físico. Para ver los sistemas de archivos temporales en nuestro sistema podemos ejecutar:

$ df -Bk -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        29G  1.8G   26G   7% /
devtmpfs        459M     0  459M   0% /dev
tmpfs           464M  1.7M  462M   1% /dev/shm
tmpfs           464M   14M  450M   3% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           464M     0  464M   0% /sys/fs/cgroup
/dev/mmcblk0p1  253M   40M  214M  16% /boot
tmpfs            93M     0   93M   0% /run/user/999
tmpfs            93M     0   93M   0% /run/user/1000

La suma de la columna Used de los tmpfs del comando anterior es igual/parecida a la columna Shared del comando free.

Si quieres más información acerca de estos archivos puedes dirigirte a la siguiente URL: https://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt

BUFFERS

El buffer es la cantidad de datos usados en la memoria que sirven para precargar información que será utilizada por procesos o directamente por hardware. Esto se usa para acelerar los procesos de lectura/escritura.

Una analogía que me ha gustado mucho la he encontrado en la Wikipedia:

Los búferes se utilizan, a menudo, conjuntamente con E/S de hardware, tal como unidades de disco, enviar o recibir datos a/o desde una red, o reproducción de sonido en un altavoz. Una línea a una montaña rusa en un parque de atracciones comparte muchas similitudes. Las personas que viajan en la montaña llegan a un ritmo desconocido y variable, pero la montaña rusa será incapaz de cargar personas de golpe (tal como llegan se van montando). La zona de la cola actúa como un búfer: un espacio temporal donde los que deseen viajar deben esperar a que el viaje esté disponible. Los búferes utilizan generalmente un método FIFO (primero en entrar, primero en salir), es decir, la salida de datos se produce en el orden en que llegaron.

Estos datos tienen una vida realmente corta y su cantidad total nunca será muy alta. Esta columna en realidad no es importante a día de hoy.

CACHE

El funcionamiento es realmente parecido al de los buffers, la diferencia es que la cache esta pensada para escribir datos los cuales van a ser leídos varias veces, facilitando el acceso y agilizando la lectura/escritura de los mismos, a diferencia de los datos escritos en buffer, que solo se escriben una vez.

BUFF/CACHE

¿Te acuerdas que te dije que al Kernel le encanta robar memoria? Si, lo hace, pero cuando algún proceso requiere memoria este empieza a liberar memoria que esta usando con buffers/cache, y la va añadiendo a la memoria free, por lo que si normalmente nuestro Kernel hace un gran uso de la cache, la cantidad que veremos en la columna free tienda a ser bajar. Es por esto que la columna que debemos analizar si queremos saber la cantidad de memoria libre de nuestro sistema, es la columna available.

AVAILABLE

La columna que creo que más nos interesa es esta, es la que nos indica exactamente que memoria tenemos por usar en nuestros sistemas. En el ejemplo que mostraba al inicio, vemos que la columna available es de un total de 709MB, esta es la memoria que podrá ser asigna a los diferentes procesos cuando estos la requieran.

PONIENDO A PRUEBA LA HONESTIDA DEL KERNEL

Para probar que el Kernel es realmente honesto, y le devuelve a mis procesos la memoria que le roba a mi RAM y almacena en buff/cache, hice la siguiente prueba:

Teniendo simplemente arrancado Chrome, ejecuté el comando free de la siguiente forma:

# free -s 1 -c 100 -w -m 

De esa forma le indicamos que se ejecute cada segundo (-s 1)hasta un total de 100 interacciones (-c 100), que me muestre la columna buff/cache separada (-w) y que me muestre los datos en mebibytes (-m). Este es el resultado de la primera interacción de esas 100:

# free -s 1 -c 100 -w -m
              total usado libre compartido búferes caché disponible
Memoria:        3901        2620         128         177         108        1043         862
Swap:          7659          19        7640

La cantidad de memoria libre que en ese momento es de 128MB, la cantidad en buffer 108MB y la cantidad en caché de 1043MB. Tras dejar este proceso en segundo plano, ejecuté varias tareas en paralelo que sabia que iban a requerir de uso de memoria RAM, y entonces empecé a analizar lo que ocurría:

              total usado libre compartido búferes caché disponible
Memoria:        3901        2916         145         191          62         777         552
Swap:          7659          38        7621

Como podemos observar la cantidad de memoria libre incluso aumentó: de 128MB a 145MB, pero si miramos la columna caché ahora es inferior, con un total de 777MB a diferencia de los 1043MB que tenia cuando solo estaba ejecutando Chrome.

CONCLUYENDO

  • Con esto concluimos que nuestro Kernel solo pide memoria RAM prestada y cuando los procesos lo piden el la libera.
  • La memoria free, es solo la que no ha sido tocada ni por procesos ni por el kernel, no es la real.
  • La columna buff/cache puede ser omitida siempre y cuando nuestro kernel este funcionando correctamente y devuelva esa memoria que ha tomado prestada cuando sea solicitada.
  • La columna a observar es la columna available

Un comentario sobre “Comando FREE: ¿Cache, Buffers, Shared?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s