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

$ 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
Anuncios

SSH activado por defecto en tu Raspberry con Raspbian

La entrada de hoy es rápida pero muy útil, hace poco vengo haciendo varias pruebas con mi Raspberry, por lo que he reinstalado Raspbian en numerosas ocasiones.

La imagen que utilizo es la que se puede descargar desde la pagina oficial https://www.raspberrypi.org/downloads/raspbian/:

Una vez descargada la imagen, para grabarla en la SD utilizo Windows y el software Balena Etcher, que se puede descargar desde aquí: https://www.balena.io/etcher/

El grabar la imagen es tan sencillo como los pasos que se ven la imagen superior.

Activando ssh por defecto

Cuando tengamos la imagen grabada en nuestra SD, antes de insertarla a la Raspberry lo único que debemos hacer para que SSH que activado por defecto, es acceder a la partición boot y crear una archivo denominado: ssh

Sin extensión ni nada, ni ningún contenido. Esto hará que al arrancarse la imagen, el servicio SSH quede activado y podamos acceder a nuestra Raspberry sin tener que conectarle ninguna pantalla ni teclado para tener que configurarla. Easy AF.

Esta opción esta disponible desde 2016, por lo que no se vosotros, pero yo llego bastante tarde. Se puede leer en las release notes de Raspbian:

Message Of The Day (MOTD) personalizado para Raspberry

Imagen 1. MOTD personalizado

El famoso MOTD es un mensaje personalizado, o no, que se muestra al iniciar sesión en la terminal de Linux, si iniciamos sesión por SSH podemos ver dos mensajes más: Una advertencia de SSH y la información de la última conexión realizada. Estos mensajes son en parte algo informativos, pero con los siguientes pasos conseguiremos tener algo mucho más útil y verdaderamente informativo.

Si queremos mostrar información en texto plano, es decir, que no haya interpretación de comandos, podemos hacerlo fácilmente editando el fichero /etc/motd, pero si en cambio queremos algo más completo, como en la portada de esta entrada debemos realizar los siguientes pasos:

Continuar leyendo “Message Of The Day (MOTD) personalizado para Raspberry”

Airbnb y su Password Length Restriction que no tenía nada de restrictive

Imagen 1. Airbnb logo.

Por fin me han dado full disclosure en este fallo y ahora puedo publicarlo.

Un fallo en la restricción de longitud de contraseña de Airbnb podía provocar que con un numero de peticiones concretas se pudiese tirar uno de sus servidores abajo, mejor dicho, que pudieses hacer un Denial of Service de toda la vida.

Como bien sabemos un DoS teniendo los medios para hacerlo puede llegar a resultar bastante sencillo y esto era lo que ocurría con Airbnb. Ellos tenían un sistema de restricción de longitud de contraseña, que tenia un máximo 128 caracteres, este sistema funcionaba correctamente en el proceso de creación de una cuenta y en el de cambio de contraseña, si te pasabas de los 128 caracteres el propio formulario te indicaba que no se podían insertar más.

Continuar leyendo “Airbnb y su Password Length Restriction que no tenía nada de restrictive”

Script para envío de comandos en paralelo a hosts remotos – Linux

Imagen 1. En paralelo

He estado un poco alejado del blog por que he estado trabajando en un pequeño proyecto que me ha quitado mas del tiempo esperado.

Con lo que respecta a este script, comentar que nace de la necesidad de ejecutar varios comandos a la vez en varias maquinas remotas por SSH. Antes de tener este script, lo que estaba haciendo era conectarme a las maquinas remotas por SSH y ejecutar los comandos en serie, es decir, tenía un script con un bucle para ejecutar ‘X‘ y ‘Z‘ comando en todas la maquinas remotas, el problema de esto era que los comandos debían ser ejecutados sobre 3000 maquinas, con previsión de tener que hacerlo hasta en un total de 6000

Con este script lo que he conseguido es enviar uno o varios comandos hasta un total de 8000 dispositivos a la vez. Para ver mejor la problemática: tenia que conectarme por SSH al dispositivo, realizar unas modificaciones en ciertos ficheros del sistema y a continuación reiniciar el dispositivo, esto con 3000 dispositivos tomaba hasta 1 h 30 min el proceso era el siguiente:

Continuar leyendo “Script para envío de comandos en paralelo a hosts remotos – Linux”

La larga historia de bloquear anuncios de Youtube en Pi-hole

He estado trabajando en otros proyectos, por lo tanto no he tenido tiempo para publicar algo en el blog. Sin embargo sigo en la interminable búsqueda de bloquear los anuncios de Youtube a nivel de red usando Pi-Hole. Hasta ahora he ido actualizando el script en mi Github: https://github.com/deividgdt/ytadsblocker/blob/master/ytadsblocker.sh

Imagen 1. Youtube Ads Blocker

De momento he conseguido bloquear la mayoría de anuncios, sin embargo aún sabiendo como bloquearlos todo, no puedo modificar el script para ello, por que tras estar haciendo diversas pruebas el script acaba provocando que Youtube deje de funcionar.

Continuar leyendo “La larga historia de bloquear anuncios de Youtube en Pi-hole”