Hogyan használd ki jobban a RAM-ot Linuxon: Úgy érzed, a géped alig használ belőle valamit?
Van egy visszatérő félreértés a Linux memóriakezelésével kapcsolatban. Az ember ránéz a free -h kimenetére, meglátja, hogy a gépben van például 64, 96 vagy 128 GB RAM, mégis csak néhány gigabájtot lát „used” állapotban, és az első gondolata az, hogy a rendszer valamit rosszul csinál. Innen szokott jönni a következő kérdés: hogyan lehet rávenni a Linuxot arra, hogy végre használja is a memóriát?
A válasz röviden az, hogy a Linux eleve használja. Csak nem feltétlenül úgy, ahogy azt első ránézésre sokan elképzelik.
A gyári beállítás nem hiba
Ezt érdemes az elején tisztázni. A Linux memóriakezelése alaphelyzetben nem rossz, nem hibás, és nem „spórolja el” a RAM-ot. A rendszer célja nem az, hogy mindenáron teleírja a memóriát, hanem az, hogy a rendelkezésre álló erőforrásokat úgy használja, hogy a rendszer gyors, stabil és kiszámítható maradjon.
A klasszikus félreértés abból ered, hogy sokan csak a free oszlopot nézik. Ez önmagában kevés.
Egy tipikus példa:
free -h
Kimenet:
total used free shared buff/cache available
Mem: 125Gi 34Gi 16Gi 2.2Gi 77Gi 91Gi
Swap: 0B 0B 0B
Első ránézésre valaki azt mondja: „csak 34 GB-ot használ a 125-ből”. Valójában ez félrevezető olvasat. A buff/cache oszlopban látható 77 GB is memóriahasználat, csak nem ugyanabban az értelemben, mint a folyamatok által közvetlenül lefoglalt RAM.
A Linux a szabad memóriát szívesen használja fájlcache-re, bufferekre, metadata gyorsítótárra. Ez nem pazarlás, hanem gyorsítás. Ha kell a memória másnak, a kernel ezeket elengedi. Emiatt sokszor az available oszlop a fontosabb adat, nem a sima free.
Mi a különbség a used, free, buff/cache és available között?
Röviden:
- used: amit a rendszer és a futó folyamatok aktívan használnak
- free: teljesen üres, érintetlen memória
- buff/cache: gyorsítótárazásra használt RAM
- available: ennyi memória adható oda új terhelésnek komolyabb gond nélkül
A Linux szemében az üres RAM nem érték. A hasznos RAM az érték. Csak az sem mindegy, hogyan van használva.
Miért tűnhet úgy, hogy a rendszer „alig használ RAM-ot”?
Ennek több oka lehet.
Az első és legegyszerűbb, hogy a gépen nincs akkora terhelés. Ha nincs elindítva virtualizáció, nagy adatbázis, rengeteg böngészőlap, konténerhalmaz vagy memóriaigényes háttérfolyamat, akkor nem fogja a rendszer csak kedvünkért teleszívni magát.
A második ok a swap és a kernel memóriapolitikája. A Linux bizonyos beállítások mellett hajlamos lehet arra, hogy ritkán használt memórialapokat viszonylag korán swapba tegyen, miközben még sok RAM áll rendelkezésre. Ez nem feltétlenül rossz döntés, csak nem biztos, hogy megfelel annak, amit egy sok memóriás workstation vagy szerver tulajdonosa szeretne.
A harmadik ok a cache viselkedése. Sokan azt várják, hogy minden a used oszlopban jelenjen meg, miközben a kernel jelentős részt tart a buff/cache területén.
Mikor érdemes belenyúlni?
Akkor, ha sok RAM van a gépben, és azt tapasztalod, hogy:
- a swap használatba kerül úgy is, hogy még bőven lenne szabad vagy könnyen felszabadítható RAM
- a rendszer túl óvatos a memóriával
- workstationként vagy nagy memóriájú desktopként használod a gépet
- azt szeretnéd, hogy a kernel minél később nyúljon swaphoz, és inkább a RAM-ra támaszkodjon
Ilyenkor van értelme finomhangolni a memóriakezelést. Nem azért, mert a gyári beállítás hibás, hanem azért, mert a te használati módod eltér az átlagtól.
A kulcsbeállítás: vm.swappiness
A legismertebb paraméter a vm.swappiness.
Ez szabályozza, hogy a kernel mennyire könnyen kezdjen el swapot használni. Minél magasabb az érték, annál hamarabb kerülhetnek lapok swapba. Minél alacsonyabb, annál inkább RAM-ban próbál maradni minden.
Az aktuális érték lekérdezése:
cat /proc/sys/vm/swappiness
Sok rendszeren a gyári érték 60 körüli. Ez nem hibás. Általános célú desktopra, laptopra, vegyes használatra teljesen vállalható kompromisszum. De ha egy gépben nagyon sok RAM van, sokan inkább azt szeretnék, hogy a rendszer csak végső esetben swappeljen.
Erre jó például az 1-es érték.
Átmeneti beállítás:
sudo sysctl vm.swappiness=1
Tartós beállítás:
echo 'vm.swappiness=1' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system
Ez nem tiltja le a swapot. Azt mondja a kernelnek, hogy nagyon visszafogottan használja.
Swap kikapcsolása: lehet, de nem mindig érdemes
A másik út a swap teljes kikapcsolása.
Azonnal:
sudo swapoff -a
Ellenőrzés:
swapon --show
free -h
Ha tartósan akarod letiltani, akkor az /etc/fstab megfelelő sorát is ki kell venni vagy ki kell kommentelni.
Példa:
sudo nano /etc/fstab
Ilyesmit keresel:
UUID=... none swap sw 0 0
Ezt ki lehet kommentelni:
# UUID=... none swap sw 0 0
Ha swapfile van, például /swapfile, akkor azt is kezelni kell.
Viszont itt érdemes megállni egy pillanatra. A swap teljes kikapcsolása nem univerzális bölcsesség. Sok RAM mellett is lehetnek memóriaugrások, alkalmazások, amelyek váratlanul többet kérnek, vagy olyan helyzetek, amikor jobb, ha van egy utolsó védőháló. A swappiness=1 sok esetben jobb kompromisszum, mint a teljes tiltás.
A másik hasznos paraméter: vm.vfs_cache_pressure
Ha már hozzányúlunk, ezt is érdemes megemlíteni. A vm.vfs_cache_pressure azt befolyásolja, hogy a kernel milyen agresszívan dobja el a filesystem cache és metadata cache tartalmát.
Aktuális érték:
cat /proc/sys/vm/vfs_cache_pressure
Sok rendszeren ez 100. Ez alapvetően rendben van. Ha viszont azt szeretnéd, hogy a rendszer jobban ragaszkodjon a cache-hez, lehet lejjebb venni, például 50-re.
Átmenetileg:
sudo sysctl vm.vfs_cache_pressure=50
Tartósan:
echo 'vm.vfs_cache_pressure=50' | sudo tee /etc/sysctl.d/99-cache-pressure.conf
sudo sysctl --system
Ez nem swap-beállítás, de memóriaviselkedést finomhangol.
Egy józan példa nagy memóriás gépre
Ha valaki azt mondja, hogy van 128 GB RAM a gépében, mégis azt látja, hogy a rendszer „alig használja”, és szeretné azt elérni, hogy a kernel inkább a RAM-ra támaszkodjon, mint a swapra, akkor egy ilyen beállítás már reális lehet:
echo 'vm.swappiness=1' | sudo tee /etc/sysctl.d/99-memory-tuning.conf
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.d/99-memory-tuning.conf
sudo sysctl --system
Ezzel a rendszer:
- sokkal később nyúl swaphoz
- jobban megtartja a cache-t
- továbbra is megőrzi a Linux normális memóriakezelési logikáját
Fontos: attól még nem lesz „tele” a RAM
Ez az a pont, ahol sokan rossz elvárással indulnak neki a finomhangolásnak. Attól, hogy lejjebb veszed a swappiness értékét, a free oszlop nem feltétlenül fog drámaian eltűnni. A Linux nem azért használja jól a memóriát, mert minden bájtot látványosan lefoglal, hanem azért, mert azt tartja RAM-ban, aminek ott van értelme.
A helyes kérdés nem az, hogy „miért nem tele a RAM?”, hanem az, hogy:
- van-e indokolatlan swap-használat
- jó-e a rendszer reakcióideje
- marad-e elég available memória
- van-e valós lassulás vagy csak esztétikai problémát látunk egy parancs kimenetében
Mire figyelj még?
Nem minden swap ugyanaz. Lehet klasszikus swap partíció, swapfile, sőt zram is. Ubuntu és Kubuntu világban előfordulhat, hogy nem csak az fstab-ot kell megnézni, hanem azt is, nincs-e valamilyen zram megoldás külön engedélyezve.
Hasznos ellenőrző parancsok:
swapon --show
cat /proc/swaps
cat /proc/sys/vm/swappiness
cat /proc/sys/vm/vfs_cache_pressure
free -h
Ha zram gyanús:
lsmod | grep zram
systemctl | grep zram
A lényeg
A gyári Linux memóriakezelés nem hibás. Az, hogy a rendszer nem „esz meg” minden RAM-ot látványosan, teljesen normális. A cache memóriahasználat, az available fontosabb, mint a sima free, és a swap jelenléte önmagában nem probléma.
Viszont ha sok memóriád van, és azt látod, hogy a rendszer a vártnál korábban vagy a számodra indokolatlanul használ swapot, akkor érdemes lehet finomhangolni. Ilyenkor a vm.swappiness=1 jó kiindulópont. A teljes swap-kikapcsolás már keményebb lépés, azt csak akkor érdemes meglépni, ha pontosan érted a következményeit.
A Linuxot nem kell mindenáron átnevelni. Inkább hozzá kell igazítani ahhoz, amire ténylegesen használod.
Ha a gépedben sok RAM van, és workstationként vagy szerverként dolgozol rajta, akkor ez a pár beállítás sokkal közelebb vihet ahhoz, amit valójában szeretnél: kevesebb felesleges swapot, több érdemi RAM-használatot, és kiszámíthatóbb viselkedést.