>_ Sistemi operativi e Linux

Memoria e swap su Linux: leggere free e capire l'OOM killer

Come Linux usa la RAM: cache, memoria disponibile e swap, come leggere free, creare un file di swap, regolare swappiness e capire l'OOM killer.

«Linux mi sta mangiando tutta la RAM» è una delle frasi che sento più spesso da chi passa da Windows. Si apre un monitor di sistema, si vede la memoria quasi piena e si pensa a un problema. Nella grande maggioranza dei casi è il contrario: il sistema sta usando la memoria libera nel modo più utile possibile. Per distinguere una situazione normale da una vera carenza bisogna sapere leggere i numeri giusti.

La RAM inutilizzata è RAM sprecata

Linux tiene in memoria una copia dei file letti di recente, la page cache. Se riapri un documento o rilanci un programma, i dati sono già in RAM e non serve rileggerli dal disco. Quando un'applicazione ha bisogno di memoria, il kernel libera la cache all'istante. Quella memoria, quindi, è occupata ma disponibile.

Leggere free

Il comando di riferimento è:

free -h

L'output ha queste colonne:

Colonna Significato
total RAM installata utilizzabile
used memoria usata dai programmi
free memoria del tutto inutilizzata
buff/cache cache dei file e buffer del kernel
available stima di quanta memoria i programmi possono ancora ottenere

Il numero che conta è available, non free. Un sistema con 16 GB, 300 MB «free» e 9 GB «available» sta benissimo. Il segnale d'allarme è un valore available che si avvicina a zero mentre lo swap si riempie.

Per vedere chi usa la memoria, top o htop ordinati per colonna RES mostrano la memoria fisica di ciascun processo. Nei browser moderni ogni scheda è spesso un processo separato, quindi conviene guardare la somma.

Che cos'è lo swap

Lo swap è uno spazio su disco in cui il kernel sposta pagine di memoria usate raramente, per lasciare la RAM a ciò che serve davvero. Non è una RAM aggiuntiva: il disco, anche un SSD veloce, è molto più lento della memoria. Il suo compito è dare respiro nei picchi ed evitare che i programmi vengano chiusi d'improvviso.

Per vedere lo swap attivo:

swapon --show

Può essere una partizione dedicata o un file. Il file è più flessibile, perché si può creare, ingrandire o eliminare senza toccare le partizioni.

Creare un file di swap

Su ext4, per un file da 4 GB:

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

Il chmod 600 è necessario: lo swap può contenere frammenti di memoria con dati riservati, e nessun altro utente deve poterlo leggere. Per renderlo permanente si aggiunge a /etc/fstab:

/swapfile  none  swap  sw  0  0

Su Btrfs la procedura è diversa, perché il file deve essere escluso dal copy-on-write; le versioni recenti degli strumenti offrono il comando btrfs filesystem mkswapfile che se ne occupa.

Quanto swap serve

Non esiste una regola valida per tutti. Qualche criterio pratico:

  • un desktop con molta RAM può lavorare con pochi GB di swap, che fanno comunque da cuscinetto;
  • per usare l'ibernazione, che salva tutta la memoria su disco, lo swap deve essere almeno pari alla RAM occupata al momento;
  • su un piccolo server con poca memoria, un po' di swap evita che un picco faccia chiudere il database.

swappiness

Il parametro vm.swappiness indica quanto il kernel sia propenso a spostare pagine nello swap invece di liberare cache. Il valore predefinito su molte distribuzioni è 60.

cat /proc/sys/vm/swappiness
sudo sysctl vm.swappiness=10

Un valore più basso fa preferire lo svuotamento della cache. Per renderlo permanente si crea un file in /etc/sysctl.d/, per esempio 99-swappiness.conf, con la riga vm.swappiness=10. Vale la pena cambiarlo solo se si osserva un problema concreto, come un desktop che diventa lento dopo essere rimasto inattivo.

zram: swap compresso in memoria

Diverse distribuzioni, tra cui Fedora, usano per impostazione predefinita zram: un dispositivo di swap che sta nella RAM stessa, in forma compressa. Sembra un paradosso, ma funziona: comprimere pagine poco usate costa meno che scriverle su disco. Su computer con poca memoria, o con storage lento come le schede SD, è spesso la soluzione migliore. zramctl mostra quanto spazio occupa e con quale rapporto di compressione.

Quando la memoria finisce: l'OOM killer

Se RAM e swap sono esauriti, il kernel deve scegliere: bloccarsi o sacrificare un processo. Interviene l'OOM killer (Out Of Memory), che sceglie un processo in base a un punteggio legato soprattutto alla memoria che occupa, e lo termina. Nei registri compare una riga come:

Out of memory: Killed process 2314 (java)

Si trova con journalctl -k | grep -i oom. Nel mio lavoro, quando un servizio «muore senza motivo», questa è una delle prime verifiche. La soluzione non è disattivare l'OOM killer, ma capire perché la memoria finisce: un limite mal impostato, una perdita di memoria nell'applicazione o semplicemente una macchina troppo piccola per il carico. Alcune distribuzioni aggiungono systemd-oomd, che interviene prima, quando il sistema comincia a rallentare per mancanza di memoria.

In sintesi

  • La memoria occupata dalla cache è disponibile: il valore da guardare in free -h è available.
  • Lo swap non è RAM in più, ma un cuscinetto per i picchi e per le pagine poco usate.
  • Un file di swap si crea in pochi comandi e va protetto con chmod 600.
  • vm.swappiness e zram permettono di adattare il comportamento a hardware e uso.
  • Quando un processo sparisce, cercare nei log del kernel le righe dell'OOM killer.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica e in psicologia, unisce l'analisi tecnica alla comprensione del fattore umano.

Leggi anche