Cómo Gestionar el Uso Elevado de Buffer/Cache en la Memoria de Linux

En sistemas Linux, es común utilizar el comando free para inspeccionar el estado del uso de memoria. En un sistema RHEL 6, la salida de free se ve aproximadamente así:

             total       used       free     shared    buffers     cached
Mem:       128000     70000      58000          0      10000      40000
-/+ buffers/cache:     20000     108000

Las unidades por defecto son KB, y en servidores con 128 GB de RAM, los números son grandes. Aunque este comando es casi obligatorio para cualquier usuario de Linux, pocos comprenden su verdadero significado. La interpretación de esta salida suele darse en tres niveles:

  1. Desconocimiento total: La reacción inicial es alarmarse por los 70 GB usados, pensando que no hay programas grandes en ejecución y que Linux consume mucha memoria innecesariamente.
  2. Comprensión superficial: Se reconoce que la memoria realmente usada es solo alrededor de 20 GB, y que buffers/cache ocupan espacio pero pueden liberarse bajo demanda como memoria libre.
  3. Conocimiento profundo: Se acepta la salida sin más, y se entiende que la suficiencia de memoria depende del comportamiento específico de las aplicaciones, no solo de los números de free.

La mayoría de la documentación actual se alinea con el segundo nivel, asumiendo que buffers y cache se pueden liberar cuando hay presión de memoria. Pero ¿es esto completamente cierto? Antes de profundizar, definamos qué son buffers y cache en este contexto.

¿Qué son Buffer y Cache en Linux?

En la gestión de memoria de Linux, buffer se refiere al buffer cache, y cache al page cache. Históricamente, buffer cache se usaba para escrituras en dispositivos de E/S, mientras que page cache se usaba para lecturas. Hoy en día, la distinción es más sutil:

  • Page cache: Gestiona la caché de páginas de memoria, usada principalmente para archivos en sistemas de archivos. Opera con unidades de página (4 KB en x86). También maneja la mayoría de las operaciones con dispositivos de bloque.
  • Buffer cache: Se encarga de la caché de bloques, usada para operaciones a bajo nivel con dispositivos de bloque (por ejemplo, al formatear un sistema de archivos). Trabaja con bloques de tamaño varible según el dispositivo.

Ambos sistemas colaboran: al escribir en un archivo, el page cache se modifica, y el buffer cache registra los buffers modificados, permitiendo que el kernel solo escriba las partes alteradas al disco (writeback).

¿Se Puede Recuperar la Memoria de Cache?

Cuando la memoria se agota, el kernel inicia la liberación de páginas, priorizando buffer/cache. Como estos son principalmente cachés, es correcto pensar que pueden liberarse bajo presión de memoria. Sin embargo, esta liberación no es gratuita: el kernel debe sincronizar los datos de cache con los del disco, lo que puede aumentar la E/S del sistema.

Además de la liberación automática, existe un mecanismo manual mediante el archivo /proc/sys/vm/drop_caches:

# Sincronizar datos en buffer al disco
sync

# Liberar cache
echo 3 > /proc/sys/vm/drop_caches

Explicación de los valores:

  • echo 1: Libera page cache.
  • echo 2: Libera objetos del asignador slab (cachés de directorio e inodo).
  • echo 3: Libera page cache y objetos slab.

Para automatizar la liberación, se puede añadir un cron job o un script que ejecute estos comandos periódicamente, reduciendo el uso de caché cuando sea necesario.

Etiquetas: linux free page cache buffer cache Memory Management

Publicado el 7-12 05:59