Liberando la memoria Cache

Introducción

Hace ya un tiempo que Miquel Mayol, comentó sobre lo que sucedía con la memoria RAM y la memoria Caché. Y es que efectivamente, y tal y como él comentaba, en mi máquina tras un par de días de uso continuado, he llegado a la siguiente situación:

0140_atareao@zorita: -home-atareao

Y es que conforme va pasando el tiempo, se va “ocupando” toda la memoria RAM, y no se vacía, y la máquina, poco a poco se va ralentizando. Miquel Mayol proponía vaciar la memoria.

Liberando la memoria CACHE

En el directorio /proc/sys/vm/ hay un archivo, drop_caches, donde se define lo que tiene que hacer el kernel qué hacer con la información “cacheada” en la memoria RAM. Para modificar la actuación del kernel de Linix, respecto a la memoria RAM podemos modificar este valor, teniendo en cuenta las posibles opciones:

  • 0: No libera nada
  • 1: Libera la pagecache
  • 2: Libera inodos y dentries
  • 3: Libera pagecache, inodos y dentries

Antes de utilizar cualquiera de las opciones, es importante utilizar “sync”, para, de esta manera, estar seguros, de que todos los objetos que están cacheado están liberados, de otra forma podría haber problemas.

Para hacer estas operaciones tenemos que ser administrador. Con todo ello la sistemática sería algo así como lo que se indica a continuación:

sudo su
sync
echo 3 > /proc/sys/vm/drop_caches
exit

Una alternativa más interesante a ésta es utilizando los siguientes comandos, que finalemnte son los que yo he utilizado en el script:

sbin/sysctl vm.drop_caches=3

El resultado es el siguiente:

0061_atareao@zorita: -home-atareao

Sin embargo, y después de leer Racker Hacker, sobre este asunto, me quedé incluso más confundido. En este punto se comenta de una posibilidad para corregir este problema mucho más segura, y es modificar la variable /proc/sys/vm/vfs_cache_pressure, para indicar al kernel la prioridad que tiene que tener en referencia a la liberación de cache. En LinuxInsight, explican el rango de valores. Pero lo podemos resumir como que a mayor valor de este parámetro menos caché se tendrá almacenada. El valor por defecto es 100, valores por encima de este valor, lo que indica al kernel es que quieres liberar mas memoria caché.

He estado probando con un valor de 10000, tal y como indica en Racker Hacker, pero aún así seguía aumentando el uso de la memoria cache conforme pasaban las horas. Para modificar este parámetro, simplemente ejecutaremos los siguientes comandos en la terminal:

sudo su
echo 10000 > /proc/sys/vm/vfs_cache_pressure
exit

El script

Con todo esto, he implementado un sencillo script, para probar su comportamiento, y que lo que hace es comprobar cada 10 segundos, el porcentaje de memoria usada y de memoria cache, de forma que si la suma de memoria usada y memoria cache son superiores al 90% siempre que la memoria cache sea superior al 15%, o cuando la memoria usada sea superior al 95% o cuando la memoria cache sea superior al 30%, se realicen una liberación de memoria.

Lo he estado probando durante días, y siempre se me ha dado cuando la memoria era superior al 95%, no en el resto de casos. Ahora lo probaré habiendo modificado el parámetro /proc/sys/vm/vfs_cache_pressure, a ver como se comporta.

Puedes descargar el script y probarlo desde aquí:

[wpfilebase tag=file id=96]

Conclusión

Hasta que no lo comentó Miquel Mayol, no había observado este comportamiento, desde entonces lo he estado siguiendo, y con este sencillo script funciona razonablemente bien, manteniendo el uso de la memoria cache, en valores razonablemente bajos. No se como se comportará solo con /proc/sys/vm/vfs_cache_pressure, es cuestión de seguir su comportamiento, a ver si llegamos a alguna conclusión razonable.

Vía | mitcoes, Scott Klarr Jr.
Más información | LinuxInsight, Racker Hacker