Vyvrátenie mýtov o zswap a zram

Dnes | 09:01 | redhawk1975 | redhawk1975

De facto ide o riešenie Inverzie LRU (Least Recently Used).

Čo je problém v správe pamäte, kedy sa zram (komprimovaná RAM) správa ako odkladací priestor (swap), čo vedie k neefektívnemu uvoľňovaniu stránok.

Stránky, ktoré sú najmenej používané (LRU), sa komprimujú, hoci by mali byť prvé na odsunutie, čo zhoršuje výkon systému.

Tento článok je voľne preložená časť článku od Chrisa Downa.

Na začiatok čosi o architektúre zswap a zram:

zswap sa nachádza pred diskovým swapom, komprimuje stránky v RAM a automaticky vrství studené (nepoužívané) dáta na disk.

Integruje sa priamo so správou pamäte jadra a elegantne rozdeľuje záťaž.

zram je komprimované blokové zariadenie RAM s pevným limitom kapacity. Keď naň nainštalujete swap a ten sa zaplní, nedôjde k automatickému vyradeniu a jadro má veľmi malú moc na to, aby s touto situáciou niečo urobilo.

Systém buď prestane fungovať, alebo sa vráti na swap s nižšou prioritou, čo spôsobí inverziu LRU.

RH: Inverzia LRU (Least Recently Used) je problém v správe pamäte, kedy sa zram (komprimovaná RAM) správa ako odkladací priestor (swap), čo vedie k neefektívnemu uvoľňovaniu stránok. Stránky, ktoré sú najmenej používané (LRU), sa komprimujú, hoci by mali byť prvé na odsunutie, čo zhoršuje výkon systému. 

Má to zmysel iba pre extrémne pamäťovo obmedzené vstavané systémy, bezdiskové konfigurácie alebo prípady so špecifickými bezpečnostnými požiadavkami na ochranu súkromných údajov pred perzistentným úložiskom. 

Swap na zram je tiež čoraz menej podporovaný v upstreame.

Chris radí:

Nespúšťajte zram spolu so swapom disku, kedykoľvek je to možné. V takýchto nastaveniach zram zapĺňa rýchlu RAM zastaranými stránkami, zatiaľ čo vašu aktívnu pracovnú sadu tlačí na pomalý disk, čo situáciu ešte zhoršuje, ako keby ste vôbec nemali komprimovaný swap.

Ak musíte použiť zram, spárujte ho so správcom OOM v používateľskom priestore, ako je systemd-oomd alebo earlyoom. 

Bez neho môže OOM killer v jadre nechať systém zamrznutý niekoľko minút predtým, ako zareaguje, pretože sa často spustí až po vyčerpaní mnohých cyklov agresívneho obnovenia, ktoré často nič nedokážu (viac o tom nižšie).

Na serveroch má v súčasnosti zram ďalšie významné problémy. Jedným z hlavných je, že jeho využitie pamäte je úplne oddelené od zvyšku systému, a preto nie je zaradený v žiadnej cgroup, čo porušuje sémantiku izolácie.

Je pravda, že na internete existuje veľa zmätkov a dezinformácií o tom, kedy použiť zswap verzus zram a aké sú medzi nimi kompromisy. Chris pracuje na správe pamäte jadra a swap kóde už takmer desaťročie a videl, ako sa tieto technológie vyvíjajú a aké sú niektoré bežne mylné predstavy, ktoré okolo nich vznikajú.

Stručná odpoveď pre väčšinu ľudí je: používajte zswap. 

Nepoužívajte zram bez dôkladného pochopenia rizík, ktoré môže predstavovať pre vaše pracovné zaťaženie. 

Pochopenie prečo, a pochopenie, kedy môže byť zram skutočne tou správnou voľbou, si však vyžaduje preskúmanie toho, ako každá z týchto dvoch technológií funguje v samotnom jadre.

Väčšina ľudí si predstavuje zswap a zram jednoducho ako dve rôzne varianty tej istej veci, komprimovaného swapu. 
Na povrchnej úrovni je to správne – oba komprimujú stránky, ktoré by inak skončili na disku – ale robia zásadne odlišné kroky v tom, ako by malo jadro zvládať tlak na pamäť, a výber nesprávneho swapu pre vašu situáciu môže veci aktívne zhoršiť, ako keby swap nebol vôbec žiadny.


Obr. rozdiel medzi zram a zswap pri zaplnení pamäte

Najvýznamnejší rozdiel medzi nimi spočíva v tom, kde sa nachádzajú v hierarchii úložiska jadra, a teda v tom, čo sú schopné signalizovať zvyšku jadra.

zram funguje ako komprimované blokové zariadenie, v podstate virtuálny disk v RAM. 
Keď proces potrebuje swap, jadro zaobchádza so swapom na zram rovnako ako s akýmkoľvek iným blokovým zariadením a odosiela I/O požiadavky cez blokovú vrstvu. 

Dôležité je, že akonáhle sa zram zaplní, je to len ďalšie úložné zariadenie, ktoré dosiahlo kapacitu. 

Neexistuje žiadny automatický mechanizmus na presun údajov inde, čo znamená, že odkladané stránky, ktoré boli najskôr vymenené, zostávajú uzamknuté v rýchlej RAM bez možnosti ich odstránenia. Ako si viete predstaviť, výsledok je zvyčajne veľmi zlý.

Zswap je na druhej strane viac integrovaný so subsystémom správy pamäte. Funguje ako kompresná vrstva, ktorá sa nachádza pred swapom vášho disku. 
Keď proces potrebuje swap, zswap zachytí stránku predtým, ako sa dostane na disk, rozhodne sa, či ju komprimovať, a ak áno, uloží ju do pamäťového fondu. Keď sa tento fond zaplní, zswap použije vlastnú heuristiku na presunutie najmenej používaných stránok na vaše záložné swapovacie zariadenie s cieľom udržať vaše používané dáta prítomné v komprimovanej vyrovnávacej pamäti RAM.

Inými slovami, zram poskytuje pevný limit kapacity, zatiaľ čo zswap poskytuje automatické vrstvenie medzi rýchlejším (t. j. komprimovaná RAM) a pomalším swapom (t. j. váš disk) a elegantne degraduje, keď sa zvyšuje tlak na pamäť. 

Pre väčšinu ľudí je elegantná degradácia to, čo chcete, ale pozrime sa, ako to funguje v praxi.

zram vytvára komprimované blokové zariadenie, ktoré funguje ako samostatný swap.

Typický postup nastavenia swapu na zrame je nasledovná:

Vytvorenie zariadenia zram načítaním modulu pomocou modprobe zram
Nastavenie /sys/block/zram0/comp_algorithm (kompresný algoritmus, ktorý sa má použiť) a /sys/block/zram0/disksize (kapacita virtuálneho zariadenia)

mkswap na /dev/zram0
swapon na /dev/zram0

Možno si všimnete, že to vyzerá takmer presne ako to, čo by ste urobili, keby ste nastavovali swap na oddiele, a to nie je náhoda, jadro ho vidí len ako ďalšie úložné zariadenie prostredníctvom blokovej vrstvy.

Pre porovnanie, zswap vôbec nevytvára blokové zariadenie, integruje sa priamo do subsystému správy pamäte jadra. 
Tento rozdiel je významnejší, než by sa mohlo zdať, pretože zswap je súčasťou samotného subsystému pre obnovenie pamäte, jadro v skutočnosti vie, ktoré stránky v zswap poole sú využívané a ktoré uložené. 
zram, ktorý je len ďalším blokovým zariadením, nemá takúto viditeľnosť.

Táto informovanosť je základom pre automatické vrstvenie a je hlavným dôvodom, prečo zswap degraduje výrazne lepšie ako zram, keď je pamäť pod tlakom.

Čo sa týka povolenia zswapu, skontrolujte, či je už zapnutý pomocou 

cat /sys/module/zswap/parameters/enabled

Väčšina hlavných distribúcií ho štandardne povoľuje. 

Pri výbere alokátora uprednostnite zsmalloc pred staršími alokátormi z3fold alebo zbud. zsmalloc dosahuje oveľa vyššie kompresné pomery zoskupovaním podobných objektov, zatiaľ čo staršie alokátory používajú objekty s pevnou veľkosťou, ktoré majú tendenciu plytvať miestom. z3fold a zbud (spolu so samotným rozhraním zpool) boli odstránené z jadra, takže v aktuálnom jadre to nemusíte nastavovať.

V prípade pochybností uprednostnite použitie zswap. Zram používajte iba vtedy, ak na to máte veľmi konkrétny dôvod.

Samozrejme Chris má na danej stránke rozšírenejšie vyjadrenie vrátane nastavení a odporúčaní.

Rovnako sú tam nejaké scenáre ale je to dosť dlhé.