¿Liberar "correctamente" memoria en linux?

%title%

%url%

%description%

Click aquí


¿Liberar "correctamente" memoria en linux?



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

memoriasudo 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

liberarsudo 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:

cacheMover informacion a la memoria swap (en disco)
kernelSobreescribir 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


Linux¿Liberar "correctamente" memoria en linux?memoria

liberar

cachePost creado con PosT!NGA

15 comentarios - ¿Liberar "correctamente" memoria en linux?

@joqui2108 +2
Para los usuarios de Linux! (:
@DurrutiBuenaventura
Es lo mismo, sólo que más prolijo. sysctl está hecho justamente para cambiar los parámetros del kernel en tiempo de ejecución (que sí, es solamente editar los ficheros que están bajo /proc/sys).
@Dark6914
gracias por compartir
@eltiti233
Yo uso esto ,abriendo la terminal como root y limpia bien , por lo menos hasta ahora:

echo 3 > /proc/sys/vm/drop_caches

Si sos tan amable , te consulto, cúal es la que mejor resultado tiene ???

Un abrazo y muy buen aporte.
@JUANHILLO
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?

Entonces es bueno hacerlo o no?
@lucasromerodb0
ahora entiendo para que sirve!! gran explicación
@gonzaru77
mukenio, vas derecho a los altares de linux, al lado de tobal y el gordo barbudo. je je je
@afranco
como mas puedo limpiar la cache, cuando no se cuenta con drop_caches?