¿Qué es y cómo limpiar la caché del sistema de ficheros en Linux?

Una de las cosas que suele sorprender a los novatos es que tras usar el ordenador un rato, la memoria RAM está casi llena. Da igual cuánta memoria tengas, se llena. La primera reacción de pánico es creer que se necesita más RAM. En un momento de reflexión subsiguiente se constata que el ordenador va bien y cómodo, y que lanzar un programa gordo funciona sin problemas, a pesar de tener la memoria RAM llena... aparentemente.

En los viejos tiempos, la memoria de un ordenador estaba dedicada casi por completo a los programa que estuviesen funcionando, pero los programadores de sistemas operativos se dieron cuenta de que pagar por memoria RAM desocupada es un desperdicio. Lo importante es que cuando un programa requiere usar esa memoria, esta esté disponible para él, pero mientras tanto resulta útil tener en memoria RAM información que nos permita disfrutar de un mejor rendimiento del ordenador. Por ejemplo, podría ser útil que, una vez que cerremos un programa, este permanezca en RAM mientras dicha RAM no sea necesaria y si el usuario lanza el programa de nuevo, este se puede arrancar instantáneamente sin tener que tocar el disco duro. O se podría usar la memoria RAM libre para guardar el dibujo detallado de letras y palabras utilizadas recientemente para poder ponerlas en pantalla sin tener que realizar todos los cálculos matemáticos necesarios para dibujar una frase en la pantalla con la calidad que proporciona la tipografía moderna.

Podemos hablar de dos propiedades útiles: a) dejar en memoria RAM cosas que ha costado obtener, por si acaso son necesarias de nuevo y b) en cuanto el usuario necesita esa memoria RAM para su actividad, eliminar de la caché la información que estimamos menos necesaria y entregar esa memoria, ahora libre, al usuario.

Lo dicho hasta ahora tiene un nombre en informática: Un sistema de caché. Una caché almacena datos costosos de obtener, pero si una información no está en la caché podemos calcularla o acudir a la fuente para obtenerla. Por ejemplo, una caché puede guardar las imágenes de una página web que visitamos frecuentemente para no tener que volver a descargarlas de nuevo cada vez. Ahorramos tiempo de espera y recursos de red y si nos falta alguna imagen en la caché -por ejemplo, porque la teníamos, pero la eliminamos porque necesitábamos ese espacio para otra cosa-, podemos ir a la web original y pedir esa imagen que nos falta. Esto es una caché.

En los sistemas operativos modernos la memoria RAM se usa para los programas del usuario, por supuesto, pero también se usa como caché del disco duro. Básicamente, cuando leermos algo del disco duro se guarda una copia en memoria RAM por si acaso se vuelve a necesitar más adelante. Esta información consta no solo del contenido de los archivos, sino también metadatos como listados de directorios, detalles sobre las zonas libres y ocupadas del disco duro, etc. Poder usas esa caché para evitar un acceso a disco duro ahorra mucho tiempo y la mejora de rendimiento es brutal. No es mal negocio usar memoria RAM desocupada para guardar esa información, es rendimiento gratis y transparente.

Con esta perspectiva, no es raro que en un ordenador moderno la memoria RAM parezca llena por mucha que tengamos. Lo importante es recordar dos cosas:

  1. Aunque la memoria parezca llena, si un programa necesita espacio se tirarán cosas de la caché para proporcionarle ese espacio.

  2. Naturalmente, si los programas requieren casi toda la memoria RAM del ordenador, tendremos dos problemas:

    1. Si hay poca memoria RAM libre, habrá poca memoria dedicada a la caché del sistema de ficheros. Dependiendo de lo que esté haciendo el ordenador, puede no notarse demasiado o puede tener un rendimiento penoso, con accesos constantes al disco duro, lo que es muy lento. Los detalles dependen del uso que estemos haciendo del ordenador.

    2. Obviamente, si los programas necesitan más memoria RAM de la que tiene el ordenador, tendremos un problema [1].

      [1]

      En este artículo no voy a entrar en la tecnología de Swap.

¿Cómo ver el tamaño de la caché del sistema de ficheros de Linux?

En Linux se puede usar el comando free:

root@MeteoPI:~# free
              total        used        free      shared  buff/cache   available
Mem:         491268      157932       17292       24636      316044      286720
Swap:       1001468       20480      980988

El volcado anterior se corresponde a una Raspberry PI con 512 Mbytes de memoria RAM. El sistema dice que se están usando 158 Mbytes. Esto es lo que ocupa el programa que está funcionando en esa Raspberry PI, en este caso una estación meteorológica. Sin embargo el sistema nos dice que solo quedan libres unos 17 MBytes. ¿Dónde están los más de 300 Mbytes que faltan? Esta información aparece en las siguientes columnas. La que nos interesa es la marcada como buff/cache. Aquí se ve que la Raspberry PI tiene en caché unos 316 MBytes. Ese espacio está ocupado por datos del sistema de ficheros guardados en memoria por si se utilizan en el futuro, pero se trata de memoria disponible para los programas del usuario si fuera necesario.

Veamos otra Raspberry PI:

root@raspberrypi:~# free
              total        used        free      shared  buff/cache   available
Mem:        1912388       87120       38072        9280     1787196     1714124
Swap:        102396           0      102396

En esta ocasión tenemos una Raspberry PI con 2 GB de memoria RAM actuando como NAS (compartiendo discos duros en red). Aquí vemos que los programas apenas consumen 87 MBytes de memoria y que solo hay 38 MBytes libres. El resto, 1.78 GBytes, son datos en caché listos para ser enviados por red si alguien los pide y sin tener que acceder a los discos duros conectados a esta Raspberry PI.

¿Cómo liberar el espacio utilizado por la caché del sistema de ficheros de Linux?

Como hemos dicho, un sistema operativo moderno gestiona la caché del sistema de ficheros de forma transparente y automática. No hace falta que hagamos nada especial.

En algunos pocos casos puede ser interesante actuar sobre dicha caché directamente. Por ejemplo, si queremos ver la velocidad de lectura de un disco duro, deberíamos asegurarnos de que la información que vamos a pedirle no está en la caché porque ello nos engañaría respecto al rendimiento real del disco duro.

La forma de vaciar la caché del sistema de ficheros depende del sistema operativo que estemos utilizando. En Linux, por ejemplo, la orden se envía a través del pseudofichero /proc/sys/vm/drop_caches.

Por ejemplo, en la Raspberry PI de mi estación meteorológica podemos hacer:

root@MeteoPI:~# echo 1 >/proc/sys/vm/drop_caches
root@MeteoPI:~# free
              total        used        free      shared  buff/cache   available
Mem:         491268      159524      261028       24636       70716      286476
Swap:       1001468       20480      980988

Ahora vemos que tenemos más o menos el mismo espacio disponible que antes (columna available), pero ahora está bajo la columna de free en vez de la columna de buff/cache.

Escribir un 1 en el pseudofichero /proc/sys/vm/drop_caches equivale a pedirle al sistema operativo que libere el espacio asignado en la caché al contenido de los ficheros. Cualquier lectura posterior de un fichero tendrá que ir al disco duro.

He dicho antes que la caché del sistema de ficheros almacena también metadatos. Es decir información en sí sobre los ficheros y directorios. Esa información se puede liberar escribiendo un 2 en /proc/sys/vm/drop_caches.

Si queremos liberarlo todo, podemos escribir un 3:

root@MeteoPI:~# sync; echo 3 >/proc/sys/vm/drop_caches; free
              total        used        free      shared  buff/cache   available
Mem:         491268      161384      264640       24636       65244      288124
Swap:       1001468       20480      980988

Aquí vemos dos cosas de interés:

  1. A la hora de liberar espacio, Linux solo puede eliminar de memoria RAM los datos que están en el disco duro. Es decir, si hemos escrito datos recientemente y todavía no han llegado al disco duro, ocuparán espacio en RAM. Ese es el motivo de hacer un sync primero: pedir al sistema operativo que mande todo lo pendiente al disco duro para poder liberar más espacio en la caché en la operación posterior.
  2. A pesar de que hemos pedido al sistema operativo que libere todo lo que hay en la caché del sistema de ficheros, aún quedan 65 MB ocupados. Hay datos que no se pueden liberar, como metainformación sobre los ficheros que tenemos abiertos. No pasa nada y es normal, ese espacio debería ser un porcentaje pequeño de la memoria RAM del ordenador.

Por supuesto, la propia actividad en el ordenador va alimentando la caché del sistema de ficheros. En el tiempo que he tardado en escribir los últimos tres párrafos, la Raspberry PI de mi estación meteorológica ya ha ido alimentando la caché:

root@MeteoPI:~# free
              total        used        free      shared  buff/cache   available
Mem:         491268      171260      195332       24636      124676      277968
Swap:       1001468       20480      980988