Table of Contents

Optimización / Liberación de memoria RAM en GNU/Linux

Enlace a la documentación oficial del Kernel: https://www.kernel.org/doc/Documentation/sysctl/vm.txt

Conceptos básicos sobre la memoria RAM / Paginación / Procesos: nociones_basicas_sobre_la_memoria

Optimización

Swappiness

Swappiness es una propiedad del Núcleo Linux que permite, a grandes rasgos, establecer un balance entre el uso del espacio de intercambio (swap en inglés) y la Memoria de acceso aleatorio (RAM). Se utiliza para equilibrar la presión de la liberación de páginas anónimas frente a las páginas de la caché de archivos. El swappiness puede tomar valores desde el 0 hasta el 100. Si se establece 0 el núcleo intentará no hacer intercambio, mientras que si se establece 100 el sistema intentará mantener la Memoria de acceso aleatorio lo más libre posible haciendo intercambio. Es algo que en la actualidad raramente tiene demasiado sentido optimizar ya que no suele ser utilizada gracias al tamaño de las memorias RAM actuales. El valor a fecha de este artículo que usan casi todos los kernels de las distribuciones más populares es de 60.

Configuración del Swappiness

Se puede establecer el valor del swappiness modificando el valor del archivo /proc/sys/vm/swappiness. Si por ejemplo, se quisiera establecer su valor a 30, se puede lograr como administrador con la siguiente orden.

Si queremos hacer inmediato el cambio ejecutamos

sysctl -w vm.swappiness=30
#echo 30 > /proc/sys/vm/swappiness
sync
swapoff -a
swapon -a

Este efecto dura mientras es sistema esté activo. Para que el cambio sea permanente, se establece el valor de la variable vm.swappiness en el archivo /etc/sysctl.conf (Obsoleto en algunas distribuciones) o bien /etc/sysctl.d/99-sysctl.conf (Actualmente).

vm.swappiness=30

watermark_scale_factor

La memoria en Linux está dividida en zonas, típicamente ZONE_NORMAL y ZONE_DMA (Acceso Directo a Memoria). Cada zona tiene una marca de agua que indica la “presión de uso” de la memoria y que es responsable del comportamiento del demonio pageout en la zona. Las marcas de agua son pages_low, pages_min y pages_high. Cuando la marca de agua de la zona está en pages_low, kswapd se activa y comienza a liberar páginas hasta que se alcanza la marca de agua pages_high, y entonces vuelve a su estado de inactividad.

Kswapd no solo se encarga de la paginación a la memoria de intercambio, también puede, entre otras cosas, reducir el tamaño de del buffer y cache y descartar ciertas páginas. Cuando no se usa swap en el sistema, el demonio puede aparecer para que los procesos puedan acceder a sus datos mapeados en disco, normalmente ficheros ejecutables. Cuando kswap consume mucha CPU suele deberse a una memoria física insuficiente ya que se está obligando a usar demasiada swap, lo cual tiene un coste en rendimiento (operaciones de entrada y salida).

La variable vm.watermark_scale_factor determina cuando se activa el demonio Kswapd. De esta forma la memoria RAM no se llenará del todo o al menos dejará algo más disponible para el buen funcionamiento del sistema. El valor por defecto es 10 (0,1%) y el máximo 1000 (10%). No es algo que pueda ayudar demasiado a mejorar el rendimiento del equipo, pero puede ser beneficioso configurarla en algunos casos. Por ejemplo en equipos con poca memoria que se cuelguen frecuentemente debido a requerimientos de uso de memoria agresivos.

Cambiando el valor de la variable 10 a 300 por ejemplo, se obliga a que el proceso de paginación se inicie antes. Si el valor es 300, al quedar un 3% de RAM disponible se iniciará Kswapd para paginar datos de la memoria RAM al disco duro. Con el valor predeterminado de 10, la paginación se iniciará cuando un 0,1% de la memoria RAM esté libre. En algunos casos, en equipos con poca memoria RAM, si el margen es muy pequeño, el kernel puede no tener tiempo de eliminar procesos y por tanto se pueden colgar aplicaciones o el sistema.

El valor debe estipularse en base a la cantidad de memoria RAM instalada en el equipo o VM.

vm.watermark_scale_factor = 300

Cache pressure

La variable del kernel vfs_cache_pressure controla la tendencia del kernel a introducir en memoria RAM bloques de datos) frente a la llamada pagecache o cache de disco (Inodos y dentries), algo mucho más importante para el funcionamiento del sistema. El valor por defecto es 100, indicando que da mucha más prioridad a esta última, cosa razonable debido a su importancia. Ahora bien, para un uso de escritorio donde se requiera trabajar con ficheros grandes (Vídeos full/ultra-HD, imágenes ISO, imágenes a gran resolución, etc) y se tiene una cantidad de RAM razonable (> 8Gb) se puede modificar ese valor para mejorar la carga de dichos ficheros. Un valor de 65 es muy razonable, dará la misma prioridad a los dos tipos de cache y se notará que los vídeos cargan antes, las descompresiones son más rápidas, etc.

Configuración del Cache pressure

Para ejecutar el cambio con efecto inmediato.

sysctl -w vm.vfs_cache_pressure=65

Si queremos hacer inmediato el cambio ejecutamos el siguiente comando.

vm.vfs_cache_pressure=65
#echo 65 > /proc/sys/vm/vfs_cache_pressure

Limpiar / vaciar memoria RAM en Linux

Liberar la memoria ram puede ser útil en determinados casos el manejo de la memoria por parte del kernel no es la más satisfactoria. Por ejemplo, cuando hay muy poca memoria y se necesita liberar espacio, eso se hace por medio de la variable vm.drop_caches.

Valores que puede tomar vm.drop_caches:

Liberar paginas de cache de disco.

sysctl vm.drop_caches=1

Liberar dentries e inodos.

sysctl vm.drop_caches=2

Liberar páginas de cache + dentries e inodos.

sysctl vm.drop_caches=3

Liberar memoria Swap. (Simplemente hay que desactivar y activar el espacio de intercambio)

swapoff -a
swapon -a

NOTA: Lo recomendable es utilizar el comando sync para forzar la grabación de los datos del buffer cache a disco duro, entre el comando sync y la liberación de memoria se recomienda esperar algo de tiempo. Al ejecutar cualquiera de los comandos anteriores y liberar espacio, el valor vuelve a ser 0. Si se quiere utilizar asiduamente puede crearse una tarea cron.

free -m
             total       used       free     shared    buffers     cached
Mem:          7679       2046       5632         86         29       1360
-/+ buffers/cache:        656       7023
Swap:         2311          0       2311
 
sync;sleep 5;sysctl vm.drop_caches=3
free -m
             total       used       free     shared    buffers     cached
Mem:          7679        818       6861         86          0        174
-/+ buffers/cache:        643       7035
Swap:         2311          0       2311

Herramientas para optimizar uso de la memoria / Swap: Zswap / zRAM / Preload (Recomendado para entorno de escritorio).

Enlace de interes: listar_los_procesos_que_usan_memoria_swap