Ya he visto varios posts en esta seccion, muchos exactamente iguales, que mencionan como liberar memoria limpiando la cache. Pero muchos de ellos lo hacen de manera incorrecta y lo que intento con este post es intentar aclarar que es lo que hacemos cuando intentamos "liberar" memoria y además hacerlo de manera correcta.

Voy a empezar explicando que es y para que sirve la cache.

Los accesos a discos son muchisimos mas lentos que los accesos a memoria.Si vemos las tasas de transferencia de memoria en comparacion con las tasas de transferencia de discos se ve muy claramente. Hace unos cuantos años acceder a la memoria llevaba 120 nanosegundos mientras que acceder a disco alrededor de 30 milisegundos


Supongamos que leemos desde el disco un archivo de texto, esto supone ubicar el archivo en cuestion, traerlo desde disco, ponerlo en memoria y leerlo. Que pasa si lo leemos varias veces? Habria que hacer el mismo procedimiento varias veces, pero que tal si en vez de hacer todo de vuelta, lo dejamos en una parte especial de la memoria entonces cuando lo necesitamos nuevamente no se necesita volver a buscarlo al disco sino que lo busco en esta "parte especial". Como dije antes los accesos a memoria son mas eficientes y de esta manera ahorraria mucho tiempo.
Esa parte especial es la memoria cache y se dice que la informacion esta "cacheada".

Otra situacion:
Abrimos cualquier aplicacion, por ejemplo Firefox. La primer vez que lo ejecutamos notamos que tarda 4 segundos en ejecutarse por decir un valor arbitrario. Luego lo cerramos y en unos pocos segundos lo volvemos a ejecutar.
Pero esta vez solo tarda 2 segundos en ejecutarse .
¿Que fue lo que paso? En realidad la informacion que estaba en la memoria (informacion que corresponde a la aplicacion) ahora forma parte de la memoria cache, entonces no
es necesario volver a cargar desde disco la aplicacion.

A grandes rasgos y sin entrar en detalles esa es la funcion de la cache, ahora les voy a explicar como "vaciarla" correctamente

Para hacerlo basta con ejectuar
sudo sync && sudo sysctl vm.drop_caches=3

Y explico que hace cada comando

sudo sync: Esto escribe la informacion que se encuentra en la cache pero que no esta actualizada en el disco. Suele suceder que la informacion de la cache esta mas actualizada que la que se encuentra en el disco, entonces es NECESARIO actualizar la informacion almacenada en el disco para no perder informacion.
Esto es lo que en los otros posts falta y puede llevar a la perdida de informacion. Igualmente linux sincroniza segun he leido cada 30 segundos esta informacion automaticamente pero el sync es muy recomendado

sudo sysctl vm.drop_caches=3:
Esto modifica el valor que contiene el archivo /proc/sys/vm/drop_caches por el 3. Inicialmente tiene el valor 0

Si queremos liberar solamente las paginas cacheadas hay que reemplazar el 3 por el 1 y si queremos liberar inodos y entradas de directorio hay que hacerlo por el numero 2

Habrán notado el interrogante en el titulo, ¿En realidad estamos liberando memoria?
La memoria cache no es marcada como memoria utilizada, es memoria que en caso de ser necesario se sobreescribe entonces es erroneo afirmar que estamos "liberando memoria".
Supongamos que se necesita memoria y la memoria disponible no es suficiente, ¿Qué alternativas tiene el kernel?
Tiene 2 opciones:

Mover informacion a la memoria swap (en disco)
Sobreescribir informacion cacheada

La primera obviamente por razones que ya explique es menos eficiente que la segunda, entonces ¿Para que liberar algo que de todas formas puede ser sobreescrito?

Espero haber aclarado un poco el tema. Saludos




Post creado con PosT!NGA