====== Swap pe Linux ====== Swap-ul este o componentă fundamentală a gestionării memoriei pe Linux, prezentă pe aproape orice instalare, de la un Raspberry Pi cu 512MB RAM până la un server cu zeci de gigabyți. Înțelegerea modului în care funcționează și cum îl configurezi corect face diferența între un sistem care răspunde fluid și unul care se blochează periodic fără un motiv aparent. ===== Ce este swap-ul ===== Atunci când un program rulează, kernelul îi alocă pagini de memorie RAM - blocuri de obicei de 4KB - pentru cod, date și stivă. La un moment dat, suma tuturor paginilor alocate poate depăși RAM-ul fizic disponibil. Swap-ul este soluția kernelului pentru această situație: mută paginile de memorie mai puțin folosite pe un dispozitiv de stocare (HDD, SSD, partiție dedicată sau fișier), eliberând RAM pentru paginile active. Procesul are două direcții: **swapping out** înseamnă mutarea paginilor din RAM pe disc, iar **swapping in** înseamnă aducerea lor înapoi când sunt necesare. Fiecare operație de swapping in provoacă o mică întârziere - procesul trebuie să aștepte ca datele să fie citite de pe disc înainte de a putea continua, ceea ce pe un HDD clasic poate fi semnificativ. Un detaliu important: swap-ul nu este o soluție pentru lipsa de RAM, ci o plasă de siguranță. Un sistem care folosește swap intensiv este un sistem care are nevoie de mai multă memorie fizică. Swap-ul previne crash-urile, dar nu înlocuiește RAM-ul. ===== Tipuri de swap ===== Pe Linux există două modalități de a crea spațiu de swap, cu avantaje și dezavantaje diferite. ==== Partiție swap ==== O partiție swap este o partiție dedicată pe disc, creată de obicei în timpul instalării sistemului de operare. Avantajul principal este performanța ușor superioară față de un fișier swap, deoarece kernelul poate accesa direct blocurile de pe disc fără overhead-ul sistemului de fișiere. Dezavantajul este inflexibilitatea - dimensiunea este fixă și nu o poți redimensiona ușor fără să repartiționezi discul. La instalarea majorității distribuțiilor Linux, programul de instalare creează automat o partiție swap. Poți identifica partițiile swap existente cu: swapon --show sau cat /proc/swaps ==== Fișier swap ==== Un fișier swap este un fișier obișnuit pe sistemul de fișiere care funcționează ca spațiu de swap. Avantajele sunt flexibilitatea - îl poți crea, șterge și redimensiona oricând, fără să modifici schema de partiționare - și portabilitatea, putând fi mutat dacă e nevoie de spațiu pe altă partiție. Performanța este practic identică cu o partiție swap pe sistemele de fișiere moderne, diferența măsurabilă existând doar în scenarii foarte specifice. Pe distribuții moderne (Ubuntu, Fedora, Arch) instalările recente folosesc implicit un fișier swap în loc de o partiție dedicată, tocmai datorită flexibilității. ===== Crearea swap-ului ===== ==== Creare partiție swap ==== Dacă vrei să creezi o partiție swap pe un disc sau pe spațiu nealocat, folosești un instrument de partiționare precum ''fdisk'' sau ''gdisk''. Partiția trebuie să aibă tipul **82** (Linux swap) în cazul MBR sau **8200** pentru GPT. După creare, formatezi partiția ca swap: mkswap /dev/sdXN unde ''/dev/sdXN'' este partiția creată. Activezi swap-ul imediat: swapon /dev/sdXN Pentru activare automată la pornire, adaugi în ''/etc/fstab'': /dev/sdXN none swap sw 0 0 ==== Creare fișier swap ==== Crearea unui fișier swap este mai simplă și nu necesită modificarea partițiilor. Pașii de mai jos creează un fișier swap de 2GB: Creezi fișierul cu ''fallocate'' (rapid) sau ''dd'' (mai compatibil): fallocate -l 2G /swapfile Dacă ''fallocate'' nu funcționează pe sistemul tău de fișiere (de exemplu pe Btrfs), folosești ''dd'': dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress Setezi permisiunile corecte - fișierul trebuie să fie citibil și editabil doar de root: chmod 600 /swapfile Formatezi fișierul ca swap: mkswap /swapfile Activezi swap-ul: swapon /swapfile Verifici că e activ: swapon --show Pentru activare automată la pornire, adaugi în ''/etc/fstab'': /swapfile none swap sw 0 0 ==== Swap pe Btrfs ==== Btrfs necesită pași suplimentari pentru fișierul swap. Fișierul trebuie să fie pe un subvolum dedicat, fără compresie și fără Copy-on-Write activat: btrfs subvolume create /swap btrfs filesystem mkswapfile --size 2G /swap/swapfile swapon /swap/swapfile ===== Dezactivarea și ștergerea swap-ului ===== Dezactivezi swap-ul temporar cu: swapoff /swapfile sau pentru tot swap-ul simultan: swapoff -a Când dezactivezi swap-ul, kernelul mută toate paginile înapoi în RAM. Dacă nu există suficient RAM disponibil, comanda va eșua sau sistemul va deveni foarte lent. Reactivezi cu: swapon -a Această pereche de comenzi (''swapoff -a && swapon -a'') este utilă pentru a goli swap-ul acumulat fără a reporni sistemul. Pentru a șterge complet un fișier swap, îl dezactivezi mai întâi, apoi îl ștergi: swapoff /swapfile rm /swapfile Nu uita să elimini și linia corespunzătoare din ''/etc/fstab''. ===== Dimensiunea recomandată ===== Nu există o regulă universală, dar există câteva ghiduri practice: ^ RAM fizic ^ Swap recomandat (fără hibernare) ^ Swap recomandat (cu hibernare) ^ | Sub 2GB | Egal cu RAM-ul | De două ori RAM-ul | | 2GB - 8GB | Jumătate din RAM | Egal cu RAM-ul | | 8GB - 64GB | Minim 4GB | Egal cu RAM-ul | | Peste 64GB | 4-8GB | Depinde de utilizare | Hibernarea (suspend to disk) necesită ca swap-ul să fie cel puțin egal cu RAM-ul fizic, deoarece întregul conținut al RAM-ului este scris pe disc la hibernare. Pe un server fără hibernare și cu RAM suficient, 1-2GB de swap este de obicei suficient ca plasă de siguranță. Pe un desktop cu puțin RAM, swap-ul generos poate face diferența între un sistem utilizabil și unul care blochează. ===== Priorități swap ===== Poți avea mai multe spații de swap active simultan - de exemplu o partiție și un fișier - și poți controla ordinea în care kernelul le folosește prin priorități. Valoarea implicită este -2 pentru fișierele din fstab. Setezi prioritatea la activare: swapon --priority 10 /swapfile sau în ''/etc/fstab'': /swapfile none swap sw,pri=10 0 0 Kernelul folosește mai întâi swap-ul cu prioritatea cea mai mare. Spațiile cu aceeași prioritate sunt folosite în paralel (round-robin), ceea ce poate îmbunătăți performanța dacă sunt pe discuri fizice diferite. ===== swappiness ===== ''vm.swappiness'' controlează cât de agresiv kernelul mută pagini în swap față de eliberarea cache-ului de pagini. Valoarea implicită este 60 pe majoritatea distribuțiilor. ^ Valoare ^ Comportament ^ | 0 | Kernelul evită swap-ul, preferă să elibereze cache | | 10-20 | Recomandat pentru desktop și servere cu RAM suficient | | 60 | Valoarea implicită, echilibrat | | 100+ | Paginare agresivă în swap | Verifici valoarea curentă: cat /proc/sys/vm/swappiness Modifici temporar: sysctl vm.swappiness=10 Modifici permanent în ''/etc/sysctl.conf'' sau ''/etc/sysctl.d/99-swap.conf'': vm.swappiness=10 Aplici fără repornire: sysctl -p Pe un **desktop** o valoare de 10-20 face sistemul mai responsiv, deoarece kernelul va prefera să elibereze cache (care poate fi reconstruit oricând) în loc să pagineze procese active. Pe un **server** cu baze de date, unii administratori setează 1-10 pentru a menține datele bazei în RAM cât mai mult posibil. ===== Citirea corectă a memoriei ===== Una dintre cele mai frecvente surse de confuzie pe Linux este interpretarea greșită a consumului de memorie. Comanda ''free -h'' arată ceva de genul: total used free shared buff/cache available Mem: 7.7Gi 3.2Gi 1.1Gi 312Mi 3.4Gi 3.9Gi Swap: 2.0Gi 128Mi 1.9Gi Coloana **used** include memoria ocupată de procese plus o parte din buff/cache, ceea ce poate părea alarmant. Coloana cu adevărat relevantă este **available** - aceasta reprezintă memoria care poate fi pusă la dispoziția proceselor fără a folosi swap, incluzând cache-ul care poate fi eliberat imediat. **buff/cache** nu este memorie pierdută - kernelul folosește RAM-ul liber pentru a cache-ui date de pe disc, accelerând citirile ulterioare. Dacă un proces are nevoie de memorie, kernelul eliberează automat o parte din cache. O regulă simplă: dacă **available** este aproape de zero și swap-ul crește continuu, sistemul are nevoie de mai mult RAM sau trebuie să închizi procese. Dacă **available** este rezonabil (câteva sute de MB sau mai mult), sistemul funcționează normal chiar dacă **used** pare mare. Pentru detalii complete despre consumul de memorie: cat /proc/meminfo Pentru a vedea ce procese consumă 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 ===== Monitorizare ===== Urmărești evoluția swap-ului în timp real cu ''vmstat'': vmstat 2 Coloanele relevante sunt **si** (swap in - pagini aduse din swap în RAM) și **so** (swap out - pagini mutate din RAM în swap). Valori constant diferite de zero indică un sistem sub presiune de memorie. ''htop'' afișează swap-ul în bara din partea de sus. Dacă preferi o comandă rapidă: watch -n 2 free -h ===== Golirea swap-ului ===== Swap-ul nu se eliberează automat după ce presiunea pe memorie scade - paginile rămân pe disc până când procesele au nevoie de ele. Dacă vrei să eliberezi swap-ul manual și ai suficient RAM disponibil: swapoff -a && swapon -a Această operație mută toate paginile din swap înapoi în RAM și resetează spațiul de swap. E utilă după ce ai oprit procese mari care consumaseră mult RAM și vrei să recuperezi swap-ul fără repornire. ===== Swap pe desktop vs server ===== Pe un **desktop**, swap-ul generos și swappiness scăzut (10-20) oferă cel mai bun echilibru - sistemul rămâne responsiv, iar aplicațiile inactive pot fi paginate fără a afecta experiența utilizatorului. Pe un **server**, abordarea depinde de serviciile rulate. Un server de baze de date preferă să țină cât mai multe date în RAM și beneficiază de swappiness foarte scăzut (1-10). Un server cu multe servicii mici poate funcționa bine cu swappiness 10-20 și un swap de 1-2GB ca plasă de siguranță. Pe sisteme cu **puțin RAM** (Raspberry Pi, VPS-uri mici), swap-ul poate fi diferența dintre un sistem funcțional și unul care termină forțat procese prin OOM Killer. Pe aceste sisteme merită explorat și [[zram_si_zswap|zram și zswap]], care oferă compresie în RAM și sunt mai rapide decât swap-ul clasic pe disc. {{tag>linux swap memorie kernel desktop server}}