¿En qué podemos ayudarte?
En muchos casos, las instancias EC2 de AWS no están configuradas para usar memoria swap. Sin embargo, tendremos picos de trabajo puntuales que excederán la capacidad instalada. En estos casos la instancia se colgará y tendremos que reiniciarla. Una solución rápida puede ser activar el uso de memoria swap en nuestra instancia AWS EC2.
Veamos como hacerlo.
Memoria swap en instancias AWS EC2
La memoria swap es espacio en disco que el S.O. puede utilizar como parte de la RAM y de esta forma ejecutar procesos que requieren más memoria de la que se encuentra instalada físicamente en el equipo. Sin embargo, el acceso al disco duro es mucho más lento que el acceso a la memoria RAM.
En teoría una instancia bien dimensionada no necesita memoria swap, ¿es esto cierto?.
![aws-ec2-no-swap instancia aws EC2 sin memoria swap](https://www.rjcardenas.com/wp-content/uploads/2021/12/aws-ec2-no-swap.jpg)
En la imagen anterior tenemos una instancia t2.small, donde no se ha activado el uso de memoria swap. En la instancia está instalado un panel de control Hestia, con los servicios de correo, web y una instancia de NextCloud.
De los 2GB de RAM disponibles, tenemos el 50% libre. ¿Podemos estar tranquilos, ya que nuestra máquina está dimensionada correctamente y no debemos preocuparnos?
No es el caso. De vez en cuando el uso de memoria cambia drásticamente, y no queda más remedio que reiniciar la instancia.
La solución más simple es escalar a una máquina más potente con con al menos 4GB RAM, eso si, asumiendo un coste más elevado.
Pero en nuestro caso, más el 90% del tiempo la máquina funciona con normalidad y los servicios no son críticos. Por tanto, no compensa pagar un hardware que no aprovecharemos al 100 y la memoria swap es una solución aceptable.
![aws-ec2-no-swap-no-memory aws ec2 sin emoria swap y ram agotada](https://www.rjcardenas.com/wp-content/uploads/2021/12/aws-ec2-no-swap-no-memory.jpg)
Implementación de la memoria swap
Hay varias formas de implementar la swap: usando un archivo, en una partición dedicada, o mejor aún, incluso con disco exclusivo. Las dos últimas opciones ofrecen un rendimiento mejor, pero para mí eso es secundario. Si el rendimiento es prioritario aumentamos la RAM y punto. Que implementación elegir, dependerá del espacio necesario y la configuración de nuestra instancia. Yo decidí usar un archivo.
Las recomendaciones de AWS para el tamaño de la memoria swap son las siguientes:
RAM disponible | Espacio swap recomendado |
---|---|
2GB o menos | El doble de la RAM instalada, pero nunca menos de 32MB |
Más de 2 y y menos de 32 GB de RAM | 4GB + (RAM instalada -2GB) |
32GB o más | RAM instalada |
Son recomendaciones. Yo crearé un archivo de 2GB y la razón es simple: me equivoqué calculando.
Los pasos a seguir son:
- Creamos un archivo del tamaño necesario
- Lo configuramos para uso como memoria swap
- Nos aseguramos que sea una configuración permanente.
La secuencia de comandos para lograrlo es muy simple:
sudo dd if=/dev/zero of=/swapspace bs=512 count=4M
sudo mkswap /swapspace
sudo chmod 600 /swapspace
sudo swapon /swapspace
Con estos comando (adaptados a nuestra instalación) creamos el archivo "swapspace" en la raíz con el tamaño deseado, le asignamos los permisos adecuados y lo activamos como memoria swap. Para que la configuración sea definitiva agregamos al "fstab" la línea
/swapspace swap swap defaults 0 0
Todo esto nos llevará apenas 5 minutos, mas el tiempo de creación del archivo, que será mayor o menor dependiendo del tamaño asignado. Si no queremos aburrirnos minetras se ejecuta dd usaremos el comando pv para ver en pantalla el progreso. Si no lo tenemos ya instalado lo haremos con sudo apt install pv. Aquí encontraréis una explicación detallada sobre los comandos pv y dd.
He modificado el comando final para evitar un error de permisos:
sudo bash -c 'dd if=/dev/zero |pv|dd of=/swapspace bs=512 count=4M'
lo que hacemos es ejecutar el comando dentro de un shell con permisos de root. De esta manera la salida del comando pv (la parte de dd que nos crea el archivo) cuenta con los permisos necesario para escribir el archivo de destino.
En la captura de pantalla aparecen los resultados de ejecutar los 2 primeros pasos. Con esto tenemos craeda y activa la memoria swap y en mi caso iré monitorizando su uso para determinar si compensa mejorar la instancia.
![pasos-swap-aws-ec2 pasos para implementar memoria swap en AWS EC2](https://www.rjcardenas.com/wp-content/uploads/2021/12/pasos-swap-aws-ec2.jpg)
Resultados
![memoria-swap-activa-aws-ec2](https://www.rjcardenas.com/wp-content/uploads/2021/12/memoria-swap-activa-aws-ec2.jpg)
Vemos en la imagen que después de varias horas de uso vemos que el uso de la memoria swap es mínimo. Y podemos ejecutar sin problemas los procesos que antes provocaban un bloqueo del servidor.
Lógicamente, la monitorización debe mantenerse un tiempo prudencial hasta asegurarnos que todo funciona según nuestras expectativas.
Por último quiero señalar que existen comandos para gestionar "la agresividad" del uso de la swap. Dicho de otra forma podemos regular la intensidad con que el sistema vuelca la RAM en disco y viceversa.
Para ello ajustaremos el parámetro swappines, que encontraremos en un archivo del mismo nombre ubicado en /proc/sys/vm. Tambien podemos gestionarlo por consola con el comando:
sudo sysctl -w vm.swappiness=valor deseado
El valor por defecto es 60, y mientras más alto más agresivo es el comportamiento. En mi caso no he modificado el valor por defecto.
Resumiendo, podemos decir que implementar la memoria swap mejora el rendimiento del sistema y nos permite evaluar mejor cuando ha llegado el momento de aumentar la potencia de nuestro servidor.