Swap (Español)

From ArchWiki
Esta traducción de Swap fue revisada el 2022-10-07. Si existen cambios puede actualizarla o avisar al equipo de traducción.

Esta página proporciona una introducción al espacio de intercambio y paginación en GNU/Linux. Cubre la creación y activación de particiones de intercambio y archivos de intercambio.

De Todo sobre el espacio de intercambio de Linux:

Linux divide su RAM física (memoria de acceso aleatorio) en fragmentos de memoria llamados páginas. El intercambio (swapping) es el proceso mediante el cual se copia una página de memoria en el espacio preconfigurado del disco duro, llamado espacio de intercambio, para liberar esa página de memoria. Los tamaños combinados de la memoria física y el espacio de intercambio es la cantidad de memoria virtual disponible.

El kernel de Linux y las utilidades de espacio de usuario del paquete util-linux proporcionan compatibilidad con el espacio de intercambio.

Espacio de intercambio

El espacio de intercambio (swap) puede tomar la forma de una partición de disco o un archivo. Los usuarios pueden crear un espacio de intercambio durante la instalación o en cualquier momento posterior, según lo deseen. El espacio de intercambio se puede utilizar para dos propósitos, para ampliar la memoria virtual más allá de la memoria física instalada (RAM) y también para la compatibilidad con suspender en disco.

Si es beneficioso extender la memoria virtual con el espacio de intercambio depende de la cantidad de memoria física instalada. Si la cantidad de memoria física es menor que la cantidad de memoria requerida para ejecutar todos los programas deseados, "puede ser" beneficioso activar el espacio de intercambio. Esto evita las condiciones de falta de memoria, en las que el mecanismo asesino OOM del kernel de Linux intentará automáticamente liberar memoria eliminando procesos. Para aumentar la cantidad de memoria virtual a la cantidad requerida, añada la diferencia necesaria (o más) como espacio de intercambio.

El mayor inconveniente de activar el espacio de intercambio es su menor rendimiento, véase la sección #Rendimiento. Por lo tanto, activar el espacio de intercambio es una cuestión de preferencia personal: algunos prefieren eliminar los programas antes que activar el espacio de intercambio y otros prefieren activarlo y tener un sistema más lento cuando se agota la memoria física.

Nota: No hay diferencia de rendimiento entre utilizar una partición como espacio de intercambio y un archivo contiguo como espacio de intercambio.

Para comprobar el estado del espacio de intercambio, utilice:

$ swapon --show

O para mostrar la memoria física y el uso del espacio de intercambio:

$ free -h

Partición como espacio de intercambio

Se puede crear una partición como espacio de intercambio con la mayoría de las herramientas de partición de GNU/Linux. Las particiones como espacio de intercambio se designan como tipo 82 en MBR y 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F en GPT.

Para configurar una partición como área de intercambio de Linux, se utiliza la orden mkswap(8). Por ejemplo:

# mkswap /dev/sdxy
Advertencia: Se perderán todos los datos de la partición especificada.

Para activar el dispositivo para paginación:

# swapon /dev/sdxy

Para activar esta partición como espacio de intercambio en el arranque, añada una entrada a /etc/fstab:

UUID=UUID_del_dispositivo none swap defaults 0 0

donde UUID_del_dispositivo es el UUID del espacio de intercambio.

Véase fstab para la sintaxis del archivo.

Nota: La entrada fstab es opcional si la partición de intercambio está ubicada en un dispositivo que usa GPT. Véase #Activación por systemd.
Advertencia: Activar discard en configuraciones RAID usando mdadm provocará el bloqueo del sistema en el arranque y durante el tiempo de ejecución, si se utiliza swapon.

Activación por systemd

systemd activa las particiones de intercambio mediante dos mecanismos diferentes. Ambos son ejecutables en /usr/lib/systemd/system-generators. Los generadores se ejecutan en el arranque y crean unidades systemd nativas para montajes. El primero, systemd-fstab-generator, lee fstab para generar unidades, incluida una unidad para el espacio de intercambio. El segundo, systemd-gpt-auto-generator inspecciona el disco raíz para generar unidades. Funciona solo en discos GPT y puede identificar particiones de intercambio por su tipo de GUID; véase systemd (Español)#Montaje automático de particiones GPT para obtener más información.

Desactivar el espacio de intercambio

Para desactivar un espacio de intercambio específico:

# swapoff /dev/sdxy

Alternativamente, utilice -a para desactivar todo el espacio de intercambio.

Dado que systemd administra el espacio de intercambio, se activará nuevamente en el próximo inicio del sistema. Para desactivar de forma permanente la activación automática del espacio de intercambio detectado, ejecute systemctl --type swap para encontrar la unidad .swap responsable y enmascárela.

Archivo como espacio de intercambio

Como alternativa a la creación de una partición completa, un archivo de espacio de intercambio ofrece la posibilidad de variar su tamaño sobre la marcha y es más fácil eliminarlo por completo. Esto puede ser especialmente deseable si el espacio en disco es escaso (por ejemplo, un SSD de tamaño modesto).

Manualmente

Creación de archivos de intercambio

Nota: Btrfs soporta archivos como espacio de intercambio con limitaciones desde la versión 5.0 del kernel de Linux. Para este sistema de archivos, siga el procedimiento descrito en Btrfs (Español)#Archivo swap para inicializar el archivo de intercambio.

Utilice dd para crear un archivo como espacio de intercambio del tamaño que elija. Por ejemplo, creando un archivo como espacio de intercambio de 512 MiB:

# dd if=/dev/zero of=/swapfile bs=1M count=512 status=progress
Nota: Utilizar dd para asignar un archivo como espacio de intercambio es la solución más portátil, véase swapon(8) § Files with holes para obtener más detalles.

Establezca los permisos correctos (un archivo como espacio de intercambio de lectura para todos es una gran vulnerabilidad local):

# chmod 0600 /swapfile

Después de crear el archivo del tamaño correcto, formatéelo como espacio de intercambio:

# mkswap -U clear /swapfile

Active el archivo como espacio de intercambio:

# swapon /swapfile

Finalmente, modifique la configuración de fstab para añadir una entrada para el archivo como espacio de intercambio:

/etc/fstab
/swapfile none swap defaults 0 0

Para obtener información adicional, véase fstab (Español)#Utilización.

Nota:
  • El archivo como espacio de intercambio debe especificarse por su ubicación en el sistema de archivos, no por su UUID o etiqueta (LABEL).
  • Cuando utilice Btrfs, no olvide añadir el subvolumen creado a la lista también, y elimine las opciones discard,autodefrag del subvolumen que se monte primero (que controlará esta configuración para el sistema de archivos completo).
  • La compresión también debe desactivarse, pero el atributo No_COW (anteriormente establecido con chattr +C) se encarga de eso.

Eliminar archivo como espacio de intercambio

Para eliminar un archivo como espacio de intercambio, primero se debe desactivar para poder eliminarlo posteriormente:

# swapoff /swapfile
# rm -f /swapfile

Finalmente, elimine la entrada relevante de /etc/fstab.

Automáticamente

systemd-swap

Nota: El autor ahora 8F recomienda utilizar zram-generator en su lugar, debido a la baja frecuencia de confirmación y ZRAM que cubre las necesidades de la mayoría de los usuarios.

systemd-swap es un script para crear un espacio de intercambio híbrido a partir de un espacio de intercambio ZRAM, archivos como espacio de intercambio y particiones como espacio de intercambio. No está afiliado al proyecto systemd.

Instale el paquete systemd-swap. Descomente y configure swapfc_enabled=1 en la sección Swap File Chunked de /etc/systemd/swap.conf. Inicie/active el servicio systemd-swap.

Visite la página GitHub del autor para obtener más información y definir la configuración recomendada.

Nota:
  • Si el diario (journal) sigue mostrando la siguiente advertencia systemd-swap[..]: WARN: swapFC: ENOSPC y no se crea ningún archivo como espacio de intercambio, debe descomentar y configurar swapfc_force_preallocated= 1 en /etc/systemd/swap.conf.
  • El archivo de espacio de intercambio creado por systemd-swap no se puede utilizar fácilmente para hibernar. Véase systemd-swap problema 85.

Cifrado del espacio de intercambio

Véase dm-crypt (Español)/Swap encryption (Español).

Rendimiento

Las operaciones de intercambio suelen ser significativamente más lentas que acceder directamente a los datos en la RAM. Desactivar el intercambio por completo para mejorar el rendimiento a veces puede provocar una degradación, ya que disminuye la memoria disponible para las cachés del sistema de archivos virtual (VFS), lo que provoca un uso del disco más frecuente y costoso.

Los valores de intercambio se pueden ajustar para mejorar el rendimiento:

Swappiness

El parámetro swappiness sysctl representa la preferencia del kernel (o la evitación) del espacio de intercambio. La capacidad de intercambio puede tener un valor entre 0 y 200 (máximo 100 si Linux < 5.8), el valor predeterminado es 60. Un valor bajo hace que el kernel evite el intercambio, un valor alto hace que el kernel intente utilizar el espacio de intercambio y un valor de 100 significa que se supone que el costo E/S (entrada/salida) es igual. Se sabe que el uso de un valor bajo en memoria suficiente mejora la capacidad de respuesta en muchos sistemas.

Para comprobar el valor actual de swappiness:

$ sysctl vm.swappiness

Alternativamente, los archivos /sys/fs/cgroup/memory/memory.swappiness (específicos de cgroup v1) o /proc/sys/vm/swappiness se pueden leer para obtener el valor entero sin procesar.

Para establecer temporalmente el valor de swappiness:

# sysctl -w vm.swappiness=10

Para establecer el valor de intercambio de forma permanente, cree un archivo de configuración sysctl.d(5). Por ejemplo:

/etc/sysctl.d/99-swappiness.conf
vm.swappiness = 10

Para que el gestor de arranque establezca swappiness al cargar el kernel, añada un parámetro del kernel, por ejemplo sysctl.vm.swappiness=10.

Para probar (y más) sobre por qué esto puede funcionar, eche un vistazo a este artículo.

Presión de caché VFS

Otro parámetro sysctl que afecta el rendimiento del intercambio es vm.vfs_cache_pression, que controla la tendencia del kernel a reclamar la memoria que se utiliza para el almacenamiento en caché de las cachés VFS, en comparación con el caché de página y el intercambio. Aumentar este valor aumenta la velocidad a la que se recuperan las cachés de VFS[1]. Para obtener más información, véase la documentación del kernel de Linux.

Prioridad

Si tiene más de un archivo o partición como espacio de intercambio, debería considerar asignar un valor de prioridad (0 a 32767) para cada área de intercambio. El sistema utilizará áreas de intercambio de mayor prioridad antes que las de menor prioridad. Por ejemplo, si tiene un disco más rápido (/dev/sda) y otro más lento (/dev/sdb), asigne una prioridad más alta al área de intercambio ubicada en el dispositivo más rápido. Las prioridades se pueden asignar en fstab mediante el parámetro pri:

/dev/sda1 none swap defaults,pri=100 0 0
/dev/sdb2 none swap defaults,pri=10  0 0

O a través del parámetro --priority de swapon:

# swapon --priority 100 /dev/sda1

Si dos o más áreas tienen la misma prioridad, y es la prioridad más alta disponible, las páginas se asignan por turnos (round-robin) entre ellas.

Utilizar zswap o zram

Zswap es una función del kernel de Linux que proporciona una caché de reescritura comprimida para las páginas intercambiadas, ZRAM crea un bloque de intercambio comprimido virtual en la memoria como alternativa a una partición/archivo como espacio de intercambio en el disco. Ambos enfoques aumentan el rendimiento de intercambio y disminuyen las operaciones de E/S del disco.

Striping

No hay necesidad de utilizar RAID en el espacio de intercambio por motivos de rendimiento. El kernel en sí puede dividir el intercambio en varios dispositivos, si les da la misma prioridad en el archivo /etc/fstab. Véase The Software-RAID HOWTO para obtener más información.