Swap (Español)
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.
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
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.
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
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
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.
- 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 conchattr +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
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-swapAUR. 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.
- 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 configurarswapfc_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.