Una versión anterior de este tutorial fue escrita por Justin Ellingwood
- Introducción
- ¿Qué es Swap?
- Paso 1 – Comprobación del sistema para la información de intercambio
- Paso 2 – Comprobación del espacio disponible en la partición del disco duro
- Paso 3 – Crear un archivo de swap
- Paso 4 – Habilitar el archivo de intercambio
- Paso 5 – Hacer permanente el archivo de intercambio
- Paso 6 – Ajustar su configuración de Swap
- Ajustar la propiedad de Swappiness
- Ajuste de la configuración de la presión de la caché
- Conclusión
Introducción
Una de las formas más sencillas de protegerse contra errores de falta de memoria en las aplicaciones es añadir algo de espacio de intercambio a su servidor. En esta guía, cubriremos cómo agregar un archivo de intercambio a un servidor Ubuntu 18.04.
Atención: Aunque el swap se recomienda generalmente para los sistemas que utilizan discos duros giratorios tradicionales, el uso de swap con SSDs puede causar problemas con la degradación del hardware con el tiempo. Debido a esta consideración, no recomendamos habilitar el intercambio en DigitalOcean o cualquier otro proveedor que utilice almacenamiento SSD. Hacerlo puede afectar a la fiabilidad del hardware subyacente para usted y sus vecinos. Esta guía se proporciona como referencia para los usuarios que pueden tener sistemas de disco giratorio en otros lugares.
Si necesita mejorar el rendimiento de su servidor en DigitalOcean, recomendamos actualizar su Droplet. Esto conducirá a mejores resultados en general y disminuirá la probabilidad de contribuir a los problemas de hardware que pueden afectar a su servicio.
¿Qué es Swap?
Swap es un área en un disco duro que ha sido designado como un lugar donde el sistema operativo puede almacenar temporalmente los datos que ya no puede mantener en la memoria RAM. Básicamente, esto le da la capacidad de aumentar la cantidad de información que su servidor puede mantener en su «memoria» de trabajo, con algunas advertencias. El espacio de intercambio en el disco duro se utilizará principalmente cuando ya no haya suficiente espacio en la RAM para mantener los datos de la aplicación en uso.
La información escrita en el disco será significativamente más lenta que la información mantenida en la RAM, pero el sistema operativo preferirá mantener los datos de la aplicación en ejecución en la memoria y utilizar el intercambio para los datos más antiguos. En general, tener espacio de intercambio como reserva para cuando la RAM de su sistema se agota puede ser una buena red de seguridad contra las excepciones de falta de memoria en los sistemas con almacenamiento no SSD disponible.
Paso 1 – Comprobación del sistema para la información de intercambio
Antes de empezar, podemos comprobar si el sistema ya tiene algún espacio de intercambio disponible. Es posible tener varios archivos de intercambio o particiones de intercambio, pero generalmente uno debería ser suficiente.
Podemos ver si el sistema tiene algún intercambio configurado escribiendo:
- sudo swapon --show
Si no obtiene ninguna salida, esto significa que su sistema no tiene espacio de intercambio disponible actualmente.
Puede verificar que no hay ningún swap activo utilizando la utilidad free
:
- free -h
Output total used free shared buff/cache availableMem: 985M 84M 222M 680K 678M 721MSwap: 0B 0B 0B
Como puede ver en la fila Swap de la salida, no hay ningún swap activo en el sistema.
Paso 2 – Comprobación del espacio disponible en la partición del disco duro
Antes de crear nuestro archivo swap, comprobaremos el uso actual del disco para asegurarnos de que tenemos suficiente espacio. Para ello, introduzca:
- df -h
OutputFilesystem Size Used Avail Use% Mounted onudev 481M 0 481M 0% /devtmpfs 99M 656K 98M 1% /run/dev/vda1 25G 1.4G 23G 6% /tmpfs 493M 0 493M 0% /dev/shmtmpfs 5.0M 0 5.0M 0% /run/locktmpfs 493M 0 493M 0% /sys/fs/cgroup/dev/vda15 105M 3.4M 102M 4% /boot/efitmpfs 99M 0 99M 0% /run/user/1000
El dispositivo con /
en la columna Mounted on
es nuestro disco en este caso. Tenemos mucho espacio disponible en este ejemplo (sólo 1,4G utilizado). Su uso probablemente será diferente.
Aunque hay muchas opiniones sobre el tamaño apropiado de un espacio de intercambio, realmente depende de sus preferencias personales y de los requisitos de su aplicación. Generalmente, una cantidad igual o el doble de la cantidad de RAM en su sistema es un buen punto de partida. Otra buena regla general es que todo lo que supere los 4G de swap es probablemente innecesario si sólo lo utiliza como reserva de RAM.
Paso 3 – Crear un archivo de swap
Ahora que conocemos el espacio disponible en el disco duro, podemos crear un archivo de swap en nuestro sistema de archivos. Asignaremos un archivo del tamaño de swap que queremos llamado swapfile
en nuestro directorio raíz (/).
La mejor manera de crear un archivo de swap es con el programa fallocate
. Este comando crea instantáneamente un archivo del tamaño especificado.
Como el servidor de nuestro ejemplo tiene 1G de RAM, crearemos un archivo de 1G en esta guía. Ajuste esto para satisfacer las necesidades de su propio servidor:
- sudo fallocate -l 1G /swapfile
Podemos verificar que se reservó la cantidad correcta de espacio escribiendo:
- ls -lh /swapfile
- -rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile
Nuestro archivo se ha creado con la cantidad correcta de espacio reservado.
Paso 4 – Habilitar el archivo de intercambio
Ahora que tenemos un archivo del tamaño correcto disponible, tenemos que convertirlo realmente en espacio de intercambio.
Primero, tenemos que bloquear los permisos del archivo para que sólo los usuarios con privilegios de root puedan leer el contenido. Esto evita que los usuarios normales puedan acceder al archivo, lo que tendría importantes implicaciones de seguridad.
Haz que el archivo sólo sea accesible para root escribiendo:
- sudo chmod 600 /swapfile
Verifica el cambio de permisos escribiendo:
- ls -lh /swapfile
Output -rw------- 1 root root 1.0G Apr 25 11:14 /swapfile
Como puedes ver, sólo el usuario root tiene las banderas de lectura y escritura habilitadas.
Ahora podemos marcar el archivo como espacio de intercambio escribiendo:
- sudo mkswap /swapfile
OutputSetting up swapspace version 1, size = 1024 MiB (1073737728 bytes)no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf
Después de marcar el archivo, podemos habilitar el archivo de intercambio, permitiendo que nuestro sistema comience a utilizarlo:
- sudo swapon /swapfile
Verifica que el intercambio está disponible escribiendo:
- sudo swapon --show
OutputNAME TYPE SIZE USED PRIO/swapfile file 1024M 0B -2
Podemos comprobar de nuevo la salida de la utilidad free
para corroborar nuestros resultados:
- free -h
Output total used free shared buff/cache availableMem: 985M 84M 220M 680K 680M 722MSwap: 1.0G 0B 1.0G
Nuestro swap ha sido configurado con éxito y nuestro sistema operativo comenzará a utilizarlo cuando sea necesario.
Paso 5 – Hacer permanente el archivo de intercambio
Nuestros cambios recientes han habilitado el archivo de intercambio para la sesión actual. Sin embargo, si reiniciamos, el servidor no conservará la configuración de intercambio automáticamente. Podemos cambiar esto añadiendo el archivo de swap a nuestro archivo /etc/fstab
.
Haz una copia de seguridad del archivo /etc/fstab
por si algo va mal:
- sudo cp /etc/fstab /etc/fstab.bak
Añade la información del archivo de swap al final de tu archivo /etc/fstab
escribiendo:
- echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
A continuación revisaremos algunas configuraciones que podemos actualizar para afinar nuestro espacio de swap.
Paso 6 – Ajustar su configuración de Swap
Hay algunas opciones que puede configurar que tendrán un impacto en el rendimiento de su sistema cuando se trata de swap.
Ajustar la propiedad de Swappiness
El parámetro swappiness
configura la frecuencia con la que su sistema intercambia datos fuera de la RAM al espacio de intercambio. Este es un valor entre 0 y 100 que representa un porcentaje.
Con valores cercanos a cero, el kernel no intercambiará datos al disco a menos que sea absolutamente necesario. Recuerde, las interacciones con el archivo de intercambio son «costosas» en el sentido de que toman mucho más tiempo que las interacciones con la RAM y pueden causar una reducción significativa del rendimiento. Decirle al sistema que no dependa mucho de la swap generalmente hará que su sistema sea más rápido.
Los valores que están más cerca de 100 tratarán de poner más datos en la swap en un esfuerzo por mantener más espacio de RAM libre. Dependiendo del perfil de memoria de sus aplicaciones o para lo que esté utilizando su servidor, esto podría ser mejor en algunos casos.
Podemos ver el valor actual de swappiness escribiendo:
- cat /proc/sys/vm/swappiness
Output60
Para un Escritorio, una configuración de swappiness de 60 no es un mal valor. Para un servidor, es posible que desee moverlo más cerca de 0.
Podemos establecer el swappiness a un valor diferente mediante el comando sysctl
.
Por ejemplo, para establecer el swappiness a 10, podríamos escribir:
- sudo sysctl vm.swappiness=10
Outputvm.swappiness = 10
Esta configuración se mantendrá hasta el próximo reinicio. Podemos establecer este valor automáticamente en el reinicio añadiendo la línea a nuestro archivo /etc/sysctl.conf
:
- sudo nano /etc/sysctl.conf
En la parte inferior, puede añadir:
vm.swappiness=10
Guardar y cerrar el archivo cuando haya terminado.
Ajuste de la configuración de la presión de la caché
Otro valor relacionado que puede querer modificar es el vfs_cache_pressure
. Este ajuste configura cuánto elegirá el sistema para almacenar en caché la información de inodo y dentry sobre otros datos.
Básicamente, se trata de datos de acceso sobre el sistema de archivos. Esto es generalmente muy costoso de buscar y se solicita con mucha frecuencia, por lo que es una cosa excelente para su sistema para almacenar en caché. Puede ver el valor actual consultando de nuevo el sistema de ficheros proc
:
- cat /proc/sys/vm/vfs_cache_pressure
Output100
Como está configurado actualmente, nuestro sistema elimina la información de los inodos de la caché demasiado rápido. Podemos establecer una configuración más conservadora como 50 escribiendo:
- sudo sysctl vm.vfs_cache_pressure=50
Outputvm.vfs_cache_pressure = 50
De nuevo, esto sólo es válido para nuestra sesión actual. Podemos cambiar esto añadiéndolo a nuestro archivo de configuración como hicimos con nuestro ajuste de intercambio:
- sudo nano /etc/sysctl.conf
Al final, añade la línea que especifica tu nuevo valor:
vm.vfs_cache_pressure=50
Guarde y cierre el archivo cuando haya terminado.
Conclusión
Seguir los pasos de esta guía le dará un poco de respiro en casos que, de otro modo, conducirían a excepciones de falta de memoria. El espacio de intercambio puede ser increíblemente útil para evitar algunos de estos problemas comunes.
Si se encuentra con errores OOM (out of memory), o si encuentra que su sistema es incapaz de utilizar las aplicaciones que necesita, la mejor solución es optimizar las configuraciones de sus aplicaciones o actualizar su servidor.