====== 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//:
* 0 No libera nada y cede el control al Kernel
* 1 Libera pagecache.
* 2 Libera dentries y inodes.
* 3 Libera pagecache, dentries y inodes.
**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]]