Introducción
Una forma de evitar errores de memoria insuficiente en las aplicaciones es añadir espacio de intercambio al servidor. En esta guía, explicaremos cómo añadir un archivo de intercambio a un servidor Ubuntu 22.04.
¿Qué es Swap?
El espacio de intercambio (swap) es una porción del almacenamiento del disco duro que el sistema operativo reserva para almacenar temporalmente los datos que ya no puede almacenar en la RAM. Esto permite aumentar la cantidad de información que el servidor puede almacenar en su memoria de trabajo, con algunas salvedades. El espacio de intercambio del disco duro se utiliza principalmente cuando ya no hay suficiente espacio en la RAM para almacenar los datos de las aplicaciones en uso.
La información escrita en el disco será significativamente más lenta que la almacenada en la RAM, pero el sistema operativo preferirá mantener los datos de las aplicaciones en ejecución en memoria y usar la memoria de intercambio (swap) para los datos más antiguos. En general, tener espacio de intercambio como respaldo cuando la RAM del sistema se agote puede ser una buena protección contra excepciones de falta de memoria en sistemas con almacenamiento no SSD disponible.
Paso 1: Verificación del sistema para obtener información de intercambio
Antes de comenzar, podemos comprobar si el sistema ya tiene espacio de intercambio disponible. Es posible tener varios archivos o particiones de intercambio, pero generalmente uno debería ser suficiente.
Podemos ver si el sistema tiene algún swap configurado escribiendo:
sudo swapon --show
Si no obtiene ningún resultado, significa que su sistema no tiene espacio de intercambio disponible actualmente.
Puedes verificar que no haya ningún intercambio activo usando la free
utilidad:
free -h
Output total used free shared buff/cache available
Mem: 981Mi 122Mi 647Mi 0.0Ki 211Mi 714Mi
Swap: 0B 0B 0B
Como puede ver en la fila Swap de la salida, no hay ningún swap activo en el sistema.
Paso 2: Verificar el espacio disponible en la partición del disco duro
Antes de crear nuestro archivo de intercambio, comprobaremos el uso actual del disco para asegurarnos de que tengamos suficiente espacio. Para ello, introduzca:
df -h
OutputFilesystem Size Used Avail Use% Mounted on
udev 474M 0 474M 0% /dev
tmpfs 99M 932K 98M 1% /run
/dev/vda1 25G 1.4G 23G 7% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/vda15 105M 3.9M 101M 4% /boot/efi
/dev/loop0 55M 55M 0 100% /snap/core18/1705
/dev/loop1 69M 69M 0 100% /snap/lxd/14804
/dev/loop2 28M 28M 0 100% /snap/snapd/7264
tmpfs 99M 0 99M 0% /run/user/1000
En este caso, el dispositivo /
en la Mounted on
columna es nuestro disco. Tenemos mucho espacio disponible (solo se utilizan 1,4 GB). Tu uso probablemente será diferente.
Aunque existen diversas opiniones sobre el tamaño adecuado del espacio de intercambio, en realidad depende de tus preferencias personales y de los requisitos de tu aplicación. Generalmente, un buen punto de partida es una cantidad igual o el doble de la RAM de tu sistema. Otra regla general es que cualquier cantidad superior a 4 GB de espacio de intercambio probablemente sea innecesaria si solo la usas como RAM de reserva.
Paso 3: Creación de un archivo de intercambio
Ahora que conocemos el espacio disponible en el disco duro, podemos crear un archivo de intercambio en nuestro sistema de archivos. Asignaremos un archivo del tamaño que queramos llamar en nuestro directorio swapfile
raíz ( )./
La mejor manera de crear un archivo de intercambio es con el fallocate
programa. Este comando crea instantáneamente un archivo del tamaño especificado.
Dado que el servidor de nuestro ejemplo tiene 1 GB de RAM, crearemos un archivo de 1 GB en esta guía. Ajústelo según las necesidades de su 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 ha sido creado con la cantidad correcta de espacio reservado.
Paso 4 – Habilitación del archivo de intercambio
Ahora que tenemos disponible un archivo del tamaño correcto, necesitamos convertirlo en espacio de intercambio.
Primero, necesitamos restringir los permisos del archivo para que solo los usuarios con privilegios de root puedan leer su contenido. Esto impide que los usuarios normales accedan al archivo, lo que tendría importantes consecuencias para la seguridad.
Haga que el archivo sólo sea accesible para root escribiendo:
sudo chmod 600 /swapfile
Verifique el cambio de permisos escribiendo:
ls -lh /swapfile
Output-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile
Como puede ver, solo el usuario root tiene habilitadas las funciones de lectura y escritura.
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
Luego de marcar el archivo, podemos habilitar el archivo de intercambio, permitiendo que nuestro sistema comience a usarlo:
sudo swapon /swapfile
Verifique que el intercambio esté disponible escribiendo:
sudo swapon --show
OutputNAME TYPE SIZE USED PRIO
/swapfile file 1024M 0B -2
Podemos verificar free
nuevamente la salida de la utilidad para corroborar nuestros hallazgos:
free -h
Output total used free shared buff/cache available
Mem: 981Mi 123Mi 644Mi 0.0Ki 213Mi 714Mi
Swap: 1.0Gi 0B 1.0Gi
Nuestro intercambio se ha configurado correctamente y nuestro sistema operativo comenzará a usarlo según sea necesario.
Paso 5 – Hacer que el archivo de intercambio sea permanente
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 intercambio a nuestro /etc/fstab
archivo.
Haga una copia de seguridad del /etc/fstab
archivo en caso de que algo salga mal:
sudo cp /etc/fstab /etc/fstab.bak
Agregue la información del archivo de intercambio al final de su /etc/fstab
archivo escribiendo:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
A continuación revisaremos algunas configuraciones que podemos actualizar para ajustar nuestro espacio de intercambio.
Paso 6 – Ajuste de la configuración de intercambio
Hay algunas opciones que puedes configurar y que tendrán un impacto en el rendimiento de tu sistema al trabajar con intercambio.
Ajuste de la propiedad de swappiness
Este swappiness
parámetro configura la frecuencia con la que el sistema intercambia datos de la RAM al espacio de intercambio. Este valor, entre 0 y 100, representa un porcentaje.
Con valores cercanos a cero, el kernel no intercambiará datos con el disco a menos que sea absolutamente necesario. Recuerde que las interacciones con el archivo de intercambio son costosas, ya que tardan mucho más que las interacciones con la RAM y pueden causar una reducción significativa del rendimiento. Indicarle al sistema que no dependa demasiado del archivo de intercambio generalmente lo hará más rápido.
Los valores cercanos a 100 intentarán almacenar más datos en la memoria de intercambio para liberar más espacio de RAM. Dependiendo del perfil de memoria de sus aplicaciones o del uso que le dé al servidor, esto podría ser mejor en algunos casos.
Podemos ver el valor de swappiness actual escribiendo:
cat /proc/sys/vm/swappiness
Output60
Para una computadora de escritorio, un valor de swappiness de 60 no es un mal valor. Para un servidor, conviene acercarlo a 0.
Podemos establecer el swappiness a un valor diferente usando el sysctl
comando.
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 configurar este valor automáticamente al reiniciar añadiendo la siguiente línea a nuestro /etc/sysctl.conf
archivo:
sudo nano /etc/sysctl.conf
En la parte inferior puedes agregar: /etc/sysctl.conf
vm.swappiness=10
Guarde y cierre el archivo cuando haya terminado.
Ajuste de la configuración de presión de caché
Otro valor relacionado que podrías querer modificar es el vfs_cache_pressure
. Esta configuración configura con qué frecuencia el sistema almacenará en caché la información de inodos y entradas de entrada sobre otros datos.
Básicamente, se trata de datos de acceso al sistema de archivos. Su consulta suele ser muy costosa y se solicita con mucha frecuencia, por lo que es excelente almacenarlos en caché. Puede ver el valor actual consultando proc
de nuevo el sistema de archivos:
cat /proc/sys/vm/vfs_cache_pressure
Output100
Con la configuración actual, nuestro sistema elimina la información de inodos de la caché demasiado rápido. Podemos configurarlo con un valor más conservador, como 50, escribiendo:
sudo sysctl vm.vfs_cache_pressure=50
Outputvm.vfs_cache_pressure = 50
Nuevamente, esto solo es válido para nuestra sesión actual. Podemos cambiarlo añadiéndolo a nuestro archivo de configuración, como hicimos con la configuración de intercambio:
sudo nano /etc/sysctl.conf
En la parte inferior, agregue la línea que especifica su nuevo valor: /etc/sysctl.conf
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 respiro en casos que, de otro modo, provocarían excepciones de memoria insuficiente. El espacio de intercambio puede ser increíblemente útil para evitar algunos de estos problemas comunes.
Si se encuentra con errores OOM (sin memoria) o descubre que su sistema no puede utilizar las aplicaciones que necesita, la mejor solución es optimizar las configuraciones de sus aplicaciones o actualizar su servidor.