Cómo gestionar el uso de swap en Linux

Es posible que hayas experimentado retrasos en el sistema, un uso excesivo de swap o problemas de memoria baja en tu sistema Linux. Un consejo habitual es “disminuir el valor de swappiness” para reducir el uso de swap. Pero, ¿qué es swappiness? ¿Y es realmente bueno ajustarlo?

Nota: no entraremos en detalle sobre la partición swap. Puedes leer todo sobre esto en nuestro artículo sobre lo que necesitas saber acerca de la partición swap en Linux.

Swappiness

Hay un valor llamado swappiness en sistemas similares a UNIX que determina cómo se manejarán las páginas en memoria. Su valor predeterminado en la mayoría de los sistemas es “60”, pero puede configurarse en cualquier valor entre 0 y 100. Si la memoria se queda baja, el núcleo puede desalojar algunas cachés de archivos para tener más RAM libre para los procesos o puede intercambiar algunas páginas de proceso de RAM a disco.

Un valor predeterminado de 60 significa que se utilizará menos swap, y es más probable que se liberen las cachés de I/O para reubicar la RAM. Desalojar cachés se considera “más barato” (menos intensivo en recursos), mientras que intercambiar páginas implica lecturas y escrituras en disco, lo que las hace más “caro”. Con un valor de ‘60’, el uso de swap será ligeramente menor que la reutilización de cachés. Si el valor de swappiness se incrementa a 100, el intercambio y el desalojo de cachés de archivos se utilizarán con igual peso. Esto significa más swap y un I/O más rápido que el predeterminado. Valores más bajos como “10” indican que el uso de swap será mucho menor, y las cachés de I/O pueden ser desalojadas mucho antes a favor de los procesos. Esto podría aumentar la interactividad pero también podría afectar la velocidad de I/O.

Disminuyendo swappiness

A menudo verás el consejo en sitios web y foros de reducir swappiness a alrededor de “10”. Se supone que esto acelerará las cosas al usar menos swap y mantener más procesos en RAM física. Esta lógica podría ser algo demasiado sencilla y puede que no sea una “solución única para todos”.

Disminuir el valor de swappiness puede ser bueno en los siguientes escenarios:

  • Para sistemas de bases de datos, o si utilizas muchas aplicaciones intensivas en bases de datos: Las bases de datos generalmente manejan el caché de archivos mucho mejor que el sistema operativo. Si reduces swappiness, limitarás el caché de archivos del sistema operativo, dando así una oportunidad a la base de datos para manejar sus propios cachés.
  • Para la interactividad: Si realizas muchas tareas al mismo tiempo pero manejas pocos archivos o no abres documentos grandes, esto podría mejorar la fluidez de tu sistema. Menos procesos se escribirán en disco, y como el acceso a la RAM es mucho más rápido, tu computadora puede sentirse más rápida. También debes tener en cuenta que esto puede reducir el rendimiento de I/O. Si tienes discos lentos o realizas operaciones intensivas en I/O, podría incluso perjudicar el rendimiento.
  • Por efecto placebo: Muchos creen que un swappiness más bajo acelerará el sistema. En serio, si crees que tu sistema es más rápido, podría tener el efecto de percibirlo así también.

Ten en cuenta que disminuir swappiness podría resultar en bloqueos y procesos siendo eliminados aleatoriamente por el sistema para liberar memoria. Disminuir swappiness será mejor si tienes suficiente RAM disponible para ejecutar tu sistema sin problemas. Pero deberías mantener el valor por encima de “10”, ya que cierto uso de swap es bueno tener.

Aumentando swappiness

Aumentar swappiness puede tener la ventaja general de acelerar I/O. Aunque no se aconseja con frecuencia, aumentar swappiness podría ser útil si:

  • Realizas algunas operaciones intensivas en I/O, y tienes HDDs antiguos y lentos. Por ejemplo: realizar copias de seguridad o editar imágenes en lote puede ser intensivo en I/O (una notable excepción son las bases de datos, que son naturalmente intensivas en I/O pero podrían beneficiarse de un valor de swappiness más bajo como se mencionó arriba).
  • Tienes poca memoria pero discos relativamente rápidos. En este improbable escenario, un valor más alto de swappiness podría ayudar a manejar la memoria de manera más eficiente (aunque establecerlo demasiado alto podría nuevamente perjudicar el rendimiento).

Cómo gestionar swappiness

Primero, debes considerar si necesitas tocar este valor en absoluto. ¿Estás experimentando problemas de rendimiento? Y más importante, ¿ya has probado otros ajustes del sistema? Si no, probablemente sea mejor mirar en otros lugares primero. Pero si tienes un escenario específico en mente, puedes querer continuar.

A continuación, ¿qué tan alto es tu uso de swap? Puedes averiguarlo con cualquier herramienta de monitoreo de rendimiento de tu elección o con el comando free. free -m te dará una instantánea del uso de memoria en megabytes. Para monitoreo continuo, puedes querer usar watch.

watch -n 1 free -m

Esto ejecutará el comando free -m cada segundo y mostrará su salida hasta que presiones “Ctrl + C”.

swappiness-free-m

Como puedes ver arriba, muy poco swap está siendo usado por el sistema sobre el que se escribió este artículo.

Ahora, si experimentas intercambio, podrías estar interesado en cuánto de esto está activo. El comando vmstat te dirá todo lo que necesitas saber sobre el uso de memoria virtual de tu sistema (swap y RAM física juntos).

vmstat 1

swappiness-vmstat

Necesitas verificar la columna swap donde si significa “swap in”, y so significa “swap out”. Si los números son altos, significa que hay mucha actividad de intercambio, lo cual es un indicador de problemas de memoria baja. Si ves uso de swap por free pero poco intercambio activo, ajustar swappiness podría ser necesario.

También es una buena idea establecer otras métricas de rendimiento como I/O de disco, promedios de carga, etc., para que cuando pruebes tus nuevos valores de swappiness, tengas algo con qué comparar.

Para probar un valor diferente de swappiness, puedes configurarlo temporalmente con el comando sysctl. Esto no necesita reiniciar, y el efecto es inmediato. De hecho, reiniciar restaurará el valor predeterminado, así que estás bastante seguro para experimentar:

sudo sysctl vm.swappiness=10

Por supuesto, puedes poner cualquier valor en lugar de “10” (entre “0” y “100”).

Una vez que hayas encontrado tu valor preferido, puedes cambiar permanentemente la configuración del sistema editando “/etc/sysctl.conf”

sudo nano /etc/sysctl.conf

y agregando las líneas

# Establecer valor de swappiness  
vm.swappiness=10

al final de este archivo, con el valor configurado a tu preferencia una vez más, por supuesto.

Conclusión

Reducir swappiness a “10” se aconseja a menudo como una solución única para todos, pero el uso real de la técnica podría ser un poco más complicado que eso. Al establecer métricas, conocer tu sistema, cómo lo usas y lo que necesitas de él, puedes ajustar tu uso de swap y lograr un aumento en el rendimiento (ya sea interactividad o I/O).