Muntar sistemes de fitxers

La memòria swap a Linux: què és, com crear-la i com activar-la



La memòria swap (d’intercanvi) és un espai del disc que Linux fa servir com a extensió de la memòria RAM. Quan la RAM s’omple, el nucli (kernel) hi envia les pàgines de memòria que fa més temps que no es fan servir, per deixar lloc als programes que en necessiten ara. En aquest post veuràs què és exactament, com consultar-la, com crear una partició o un fitxer swap i activar-los, i com ajustar-ne l’ús.

Per a què serveix (i per a què no)

La swap no fa el sistema més ràpid: el disc, fins i tot un SSD, és molt més lent que la RAM. El que fa és:

  • Evitar que el sistema es quedi sense memòria. Sense swap, quan la RAM s’acaba, el nucli comença a matar processos (l’OOM killer). Amb swap, el sistema va més lent però continua funcionant.
  • Aprofitar millor la RAM. Les pàgines d’un programa que està obert però inactiu poden anar a la swap, i la RAM que deixen lliure es fa servir com a memòria cau de disc, que sí que accelera el sistema.
  • Hibernar. Per hibernar, el contingut de la RAM es desa a la swap, que ha de ser com a mínim tan gran com la memòria en ús.

Si un equip fa servir swap contínuament i va lent, el problema és que li falta RAM (o hi ha un procés que en gasta massa). La swap només ho dissimula.

Comprovar la swap que tens

La manera més ràpida és free -h:

$ free -h
               total        used        free      shared  buff/cache   available
Mem:           3.7Gi       1.8Gi       367Mi       404Mi       2.1Gi       1.9Gi
Swap:          2.0Gi       1.4Gi       601Mi

Per saber d’on surt aquesta swap, swapon --show:

$ swapon --show
NAME       TYPE      SIZE USED PRIO
/dev/zram0 partition   2G 1.4G  100

O cat /proc/swaps, que dona la mateixa informació directament del nucli. Aquest exemple és d’un Raspberry Pi amb Debian 13, on la swap és un dispositiu zram (en parlem més avall). Per veure si el sistema està fent servir la swap activament, mira les columnes si i so (swap in i swap out) de vmstat 1: si són sempre diferents de zero, li falta memòria.

Partició swap

La forma clàssica és una partició dedicada, que l’instal·lador de la distribució sol crear. Si n’has de preparar una a mà (per exemple /dev/sdb2, creada amb fdisk o parted amb el tipus «Linux swap»):

sudo mkswap /dev/sdb2

mkswap no crea cap fitxer: escriu a la partició la capçalera que la identifica com a àrea swap (i li assigna un UUID). Atenció: el que hi hagués a la partició es perd.

Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
no label, UUID=72356701-a998-45a5-ae0d-92d176765723

Després, s’activa amb swapon:

sudo swapon /dev/sdb2

Es poden activar diverses àrees swap alhora:

sudo swapon /dev/sdb2 /dev/sdc2

(L’article original parlava de /dev/hda3 i /dev/hdb3: és la nomenclatura dels antics discos IDE. Avui els discos SATA i USB són /dev/sdX i els NVMe, /dev/nvme0n1pX.)

Fitxer swap

Avui és més habitual fer servir un fitxer swap: no cal tocar les particions i el pots fer més gran o més petit fàcilment. Moltes instal·lacions recents d’Ubuntu, per exemple, en fan servir un en lloc d’una partició.

Amb les versions recents de mkswap (la d’util-linux 2.41 de Debian 13), hi ha una opció que ho fa tot: crea el fitxer, n’omple els blocs i li posa els permisos correctes:

sudo mkswap --file /swapfile --size 2G
sudo swapon /swapfile

El mètode clàssic, que funciona a qualsevol distribució:

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

Detalls importants:

  • Permisos 600. La swap pot contenir dades sensibles de la memòria (contrasenyes, claus). swapon avisa si altres usuaris poden llegir el fitxer.
  • Sense forats. El fitxer s’ha d’omplir de veritat. Un fitxer creat amb truncate o cp té «forats» i swapon el rebutja. fallocate funciona en alguns sistemes de fitxers però no en tots; dd funciona a tot arreu.
  • Btrfs. Cal un fitxer sense còpia en escriptura (nocow). mkswap --file ja ho fa; si no, fes servir btrfs filesystem mkswapfile.

Activar-la en arrencar: /etc/fstab

swapon activa la swap només fins al pròxim reinici. Perquè sigui permanent, afegeix una línia a /etc/fstab. Per a un fitxer:

/swapfile  none  swap  defaults  0  0

Per a una partició, millor amb el UUID que t’ha donat mkswap (o blkid):

UUID=72356701-a998-45a5-ae0d-92d176765723  none  swap  defaults  0  0

El segon camp és none perquè la swap no es munta en cap directori. Per comprovar-ho sense reiniciar, sudo swapon -a activa totes les swaps de /etc/fstab, i swapon --show t’ha de mostrar la nova.

Desactivar-la

sudo swapoff /swapfile      # una de concreta
sudo swapoff -a             # totes

En desactivar una swap, el que hi havia s’ha de tornar a portar a la RAM. Si no hi cap, swapoff falla. Per eliminar un fitxer swap: swapoff, treure la línia de /etc/fstab i esborrar el fitxer.

Prioritats

Si tens diverses swaps, el nucli fa servir primer la de prioritat més alta (columna PRIO de swapon --show). Pots fixar-la amb -p o, a /etc/fstab, amb l’opció pri=:

sudo swapon -p 10 /swapfile
/swapfile  none  swap  defaults,pri=10  0  0

Si dues swaps tenen la mateixa prioritat, el nucli les fa servir alternativament, com un RAID 0.

Swappiness: quan comença a fer servir la swap

El paràmetre vm.swappiness (de 0 a 200; per defecte, 60) indica com d’agressiu és el nucli enviant memòria a la swap en lloc de buidar la memòria cau de fitxers. Valors baixos, menys swap; valors alts, més.

$ sysctl vm.swappiness
vm.swappiness = 60

Per canviar-lo de manera immediata i permanent:

sudo sysctl vm.swappiness=10
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf

En servidors amb molta RAM i discos lents, valors com 10 són habituals. Amb zram, en canvi, s’acostumen a fer servir valors alts, perquè la «swap» és a la mateixa RAM i és ràpida.

zram: swap comprimida a la memòria

Moltes distribucions actuals fan servir zram: un dispositiu de blocs a la mateixa RAM on les pàgines es guarden comprimides. Sembla contradictori fer servir RAM com a swap de la RAM, però com que les dades es comprimeixen (sovint a un terç o menys), hi caben moltes més pàgines, i és molt més ràpid que un disc. Fedora la fa servir per defecte, i Raspberry Pi OS també. A Debian i Ubuntu la pots instal·lar amb el paquet systemd-zram-generator o zram-tools.

Per veure-la, zramctl:

$ zramctl
NAME       ALGORITHM DISKSIZE DATA  COMPR  TOTAL STREAMS MOUNTPOINT
/dev/zram0 zstd            2G   1G 298.9M 312.4M         [SWAP]

Aquí, 1 GB de dades ocupa realment uns 312 MB de RAM gràcies a la compressió amb zstd.

Quanta swap cal?

Ja no s’aplica la vella regla de «el doble de la RAM». Com a orientació:

  • Servidors i equips amb molta RAM: una swap petita (uns pocs GB) com a coixí perquè el sistema no mori de cop si la memòria s’esgota.
  • Portàtils que hibernen: com a mínim la mida de la RAM.
  • Equips petits (Raspberry Pi, VPS d’1-2 GB): zram, o un fitxer swap d’1-2 GB.

Comandes relacionades