Swap pe Linux

Aceasta e o versiune anterioară a paginii.


Swap și swappiness

Swap-ul este o zonă de stocare - fie o partiție dedicată, fie un fișier - pe care kernelul Linux o folosește ca extensie a memoriei RAM. Când RAM-ul fizic se umple sau kernelul decide că anumite pagini de memorie nu au fost accesate de mult, le mută în swap pentru a elibera RAM pentru procese mai active. Procesul invers, aducerea paginilor înapoi din swap în RAM, se numește swapping in.

De ce există swap

Pe un server care rulează multe servicii, e normal ca unele procese să fie inactive perioade lungi de timp. Fără swap, kernelul ar fi forțat să țină în RAM toate procesele indiferent dacă sunt active sau nu, sau să termine forțat procese când memoria se epuizează (OOM killer). Swap-ul oferă o plasă de siguranță - procesele inactive pot fi mutate temporar pe disc, eliberând RAM pentru cele care au nevoie.

Un aspect important de înțeles: swap-ul nu se eliberează automat. Dacă la un moment dat kernelul a mutat 500MB în swap, acele pagini rămân acolo chiar dacă RAM-ul devine ulterior disponibil. Sunt aduse înapoi doar când procesul respectiv are nevoie de ele.

swappiness

vm.swappiness este un parametru al kernelului care controlează cât de agresiv folosește sistemul swap-ul. Valoarea poate fi între 0 și 200, iar valoarea implicită pe majoritatea distribuțiilor este 60.

Valoare Comportament
0 Kernelul evită swap-ul pe cât posibil, folosindu-l doar când RAM-ul e aproape epuizat
60 Comportament echilibrat, valoarea implicită
100+ Kernelul paginează agresiv în swap, chiar dacă există RAM disponibil

Pe un server sau desktop cu RAM suficient, o valoare mai mică (10-20) este de preferat - sistemul va prefera să elibereze cache din RAM în loc să pagineze procese în swap, ceea ce înseamnă timp de răspuns mai bun când procesele au nevoie de memorie.

Verificare și configurare

Verifici valoarea curentă cu:

cat /proc/sys/vm/swappiness

Schimbi valoarea temporar (se resetează la repornire):

sysctl vm.swappiness=10

Faci modificarea permanentă adăugând în /etc/sysctl.conf:

vm.swappiness=10

Aplici imediat fără repornire:

sysctl -p

Cum vezi ce procese folosesc swap

Pentru a identifica procesele care ocupă cel mai mult swap:

for pid in /proc/[0-9]*/status; do
  awk '/^Name|^VmSwap/{printf "%s ",$2}' $pid
  echo
done | grep -v " 0 kB" | sort -k2 -rn | head -20

Dacă ai instalat smem:

smem -rs swap | head -20

Golirea swap-ului

Dacă vrei să eliberezi swap-ul manual (funcționează doar dacă există suficient RAM liber pentru a prelua paginile din swap):

swapoff -a && swapon -a

Această comandă dezactivează swap-ul (forțând kernelul să mute totul înapoi în RAM) și îl reactivează imediat. Dacă RAM-ul nu este suficient, comanda va eșua sau sistemul va deveni foarte lent în timp ce mută datele.

Swap pe un server cu multe containere Docker

Pe un VPS care rulează multiple containere Docker, swap-ul crescut este adesea cauzat de servicii care consumă mult RAM dar sunt rar folosite. Fiecare container are propriul consum, iar suma totală poate depăși RAM-ul disponibil în perioadele de vârf.

Soluții practice în această situație:

  • Setează vm.swappiness=10 pentru a reduce agresivitatea paginării
  • Oprește containerele care nu sunt folosite activ
  • Adaugă limite de memorie per container în docker-compose.yml cu mem_limit
  • Verifică periodic consumul cu docker stats –no-stream