Muchos de los que usamos linux, en algún momento necesitamos liberar memoria RAM, por diferentes motivos. en mi caso particular después de varios días de trabajo, con uptime realmente elevado, a pesar de cerrar las aplicaciones, apagar maquinas virtuales o cerrar los navegadores, podemos ver que nuestra memoria “No se librea en su totalidad”.
Es en estas situaciones, que podemos acudir a un par de comandos, que nos permitirán liberar memoria.
$ free -h
Este comando nos permite ver el estado de la memoria antes, el parámetro -h le indica al comando free que muestre los valores en un formato legible para los humanos.
PoC
Podemos ver que tenemos 49GB de memoria libre 😉
sudo sync && sudo sysctl -w vm.drop_caches=3
esta es la linea que hace la magia! (libera la memoria). Más adelante explico en detalles cada comando.
PoC
volvemos a ejecutar el comando free para verificar si realmente se libero memoria RAM
PoC
LISTO!!! recuperamos casi 7 Gb de memoria RAM.
Explicando algunos conceptos:
sudo sync && sudo sysctl -w vm.drop_caches=3
Esta linea esta compuesta de varios comandos que detallamos a continuación:
1: sudo: Permite ejecutar comandos, como si fuéramos super usuarios.
2: sync: Es usado para forzar el grabado de datos de la cache, muy recomendado antes de desmontar cualquier dispositivo de almacenamiento, como pendrive, cámaras, etc.
3: &&: Es simplemente un conector entre dos comandos de linux. Como bien sabemos existen varios tipos de conectores, aqui una breve explicación para saber cuando usar cada uno.
A; B # Ejecuta A y luego B, sin importar si la ejecución de A fue satisfactoria. A && B # Ejecuta B solo si la ejecución de A es satisfactoria. A || B # Ejecuta B solo si la ejecución de A falló. A & # ejecuta A en background
3: sysctl -w vm.drop_caches=3: le indica al kernel de linux que libere las pagecache, inodos y dentries.
En el directorio /proc/sys/vm/ hay un archivo, drop_caches, donde se define lo que tiene que hacer el kernel con la información “cacheada” en la memoria RAM. Para modificar el comportamiento del kernel de Linux, respecto a la información “cacheada” en la memoria RAM, podemos modificar este valor, teniendo en cuenta las posibles opciones:
0: Opción por defecto, no libera nada.
1: Libera la pagecache
2: Libera inodos y dentries
3: Libera pagecache, inodos y dentries
inodo, en su contexto es una estructura de datos que representa un archivo.
dentries, es una estructura de datos que representa un directorio.
page_cache, podría contener cualquier bloque del disco de almacenamiento asignado a la memoria, como por ejemplo ser el buffer de E/S, o cualquier cosa que el sistema operativo podría mantener en la memoria a partir de un archivo.
Nota: si por algún motivo, intentan volver drop_caches al valor por defecto, obtendrán un error, por lo que pude averiguar el valor 0 (cero) es solo un valor inicial, una ves modificado no es posible asignarle cero, a menos que se reinicie el equipo.
Probado en GNU/Linux Debian 6,7,8 y 9.-
Saludos