Fedora 33 pravděpodobně bude "největší" verzí Fedory, která kdy vyšla. Alespoň tedy co se nahlášených změn týká. Jedna z důležitých změn se týká také odkládacího oddílu neboli swapu, který se přesune do paměti díky změně Swap on ZRAM, na které pracuje Chris Murphy.
Swap
Swap v systému pomáhá v situacích, kdy není dostatek operační paměti -- aktuálně nepoužívané stránky paměti jsou "odloženy" do swapu (odtud také časté pojmenování odkládací oddíl), odkud se v případě potřeby nahrají zpět do paměti. Hlavním problémem swapu je, že bývá obvykle umístěn na disku, který je (ve srovnání s pamětí) velice pomalý a to i při použití SSD disku. Pokud systém potřebuje jen o něco více paměti a do swapu jsou odloženy stránky, které skutečně nejsou potřeba, není to obvykle problém a systém se výrazně zpomalí jen v případě, kdy se rozhodneme znovu použít aplikaci, která má svá data aktuálně odložena ve swapu.
Mnohem větší problém nastane v případě, kdy nějaký proces najednou začne vyžadovat větší množství paměti a rychle zaplní jak operační paměť, tak swap. V takovém případě obvykle skončíme s nepoužitelným systémem, kterému pomůže jen restartování počítače. Tento problém již částečně řeší služba EarlyOOM, která je ve Fedoře zapnutá od verze 32 a která má za úkol takové "nenažrané" procesy včas ukončit. EarlyOOM tedy zabraňuje extrémním případům přetížení systému, ale neřeší původní problém swapu na disku: jeho pomalost. Tu řeší až Swap on ZRAM přesunutím swapu na nejrychlejší dostupné zařízení: do paměti.
ZRAM
Jak již název změny napovídá, pro swap se nově budou používat speciální bloková zařízení ZRAM. ZRAM samotný nemá vlastně se swapem nic společného. Jedná se jaderný modul, který slouží pro vytváření blokových zařízeních v operační paměti. Největší výhodou ZRAM je, že data uložená na zařízení /dev/zram
automaticky komprimuje. Získáme tak velmi rychlé blokové zařízení, které ale nezabírá v paměti tolik místa jako například podobně fungující tmpfs. Komprese také vysvětluje, proč je ZRAM vhodný pro swap. Prosté umístění swapu do paměti by nedávalo smysl, ale komprese v ZRAM dokáže "ušetřit" až 50 % místa a 4 GiB velký swap tak v paměti ve skutečnosti zabere jen 2 GiB.
Pokud byste si chtěli vyzkoušet, jak se ZRAM pracuje, stačí vám k tomu běžná instalace Fedory -- ZRAM modul je již k dispozici v distribučním jádře a stačí ho jen načíst:
modprobe zram num_devices=4
Nepovinný parametr num_devices
specifikuje, kolik ZRAM zařízení má být vytvořeno (výchozí hodnota je jedno). V tomto případě jsme tedy vytvořili čtyři ZRAM zařízení, která mají (zatím) velikost 0 bajtů.
lsblk -a /dev/zram* NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT zram0 252:0 0 0 disk zram1 252:1 0 0 disk zram2 252:2 0 0 disk zram3 252:3 0 0 disk
Takto vytvořeným zařízením můžeme nastavit počet kompresních streamů (výchozí nastavení odpovídá počtu procesorových jader), použitý kompresní algoritmus a především velikost. Veškeré nastavování probíhá přes sysfs, tedy zápisem do souborů max_comp_streams
, comp_algorithm
a disksize
ve složce /sys/block/zram0
(pro první z námi čtyř vytvořených ZRAM zařízení).
# počet kompresních streamů cat /sys/block/zram0/max_comp_streams 4 # kompresní algoritmus (zvolený je v hranatých závorkách) cat /sys/block/zram0/comp_algorithm lzo [lzo-rle] lz4 lz4hc 842 zstd # nastavení velikosti echo 512M > /sys/block/zram0/disksize
Po nastavení velikosti tak získáme 512 MiB velké blokové zařízení zram0
:
lsblk /dev/zram0 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT zram0 252:0 0 512M 0 disk
které je možné použít jako jakékoli jiné blokové zařízení a vytvořit na něm například souborový systém ext4 nebo právě swap, jako v případě Swap on ZRAM.
Swap on ZRAM
Pokud vás výše popsaný způsob práce se ZRAM vyděsil, tak vězte, že se není čeho bát -- o nastavení ZRAM se ve Fedoře 33 postará již instalátor Anaconda, který do systému nainstaluje službu zram-generator, která se postará o vytvoření swapu na ZRAM při každém startu, bez potřeby jakéhokoli dalšího zásahu ze strany uživatele. Mimochodem Anaconda používá ZRAM v průběhu instalace již několik let. Stejně tak ZRAM používají ARM instalace a to již od Fedory 29.
Ve výchozí instalaci Fedory bude vytvořen swap pouze na ZRAM, ale stále bude možné vytvořit "klasický" swap na logickém nebo diskovém oddíle při ručním rozdělení disků. V takovém případě budou vytvořeny dva odkládací oddíly -- jak swap na ZRAM, tak klasický (swap na ZRAM má v tomto případě nastavenou vyšší prioritu).
Klasický odkládací oddíl budete chtít vytvořit hlavně v případě, že používáte uspávání na disk (hibernaci). Ta totiž logicky se ZRAM nefunguje.
Pokud si chcete ZRAM vyzkoušet na starších verzích Fedory, stačí nainstalovat si balíčky zram-generator
(který obsahuje samotnou službu pro vytvoření ZRAM při startu systému) a zram-generator-defaults
(který obsahuje výchozí nastavení pro Fedoru 33). Pokud naopak swap na ZRAM nebudete chtít používat, stačí balíček zram-generator-defaults
po instalaci systému odstranit. Swap na ZRAM budete mít automaticky povolen i v případě přechodu z Fedory 32 na Fedoru 33.
A jak vypadá swap na ZRAM v praxi? Ve virtuálním stroji s 2 GiB operační paměti Fedora vytvoří 1 GiB velký swap (obecně bude mít swap na ZRAM velikost poloviny operační paměti, ale maximálně 4 GiB). Když spustíme pár aplikací, aby se nám trochu zaplnila paměť, dostaneme se do následující situace, kdy jsou operační paměť i swap zaplněny na přibližně 70 %. Systém je přitom stále bez problémů použitelný a hlavně rychlý, což by se swapem na disku nebylo tak samozřejmé.
Zajímavé jsou také statistiky, které nám poskytuje ZRAM modul. Ty je možné zjistit ze /sys/block/zram0/mm_stat
:
cat /sys/block/zram0/mm_stat 731660288 259284313 286236672 0 295493632 9839 1255 11998
První tři čísla udávají celkovou velikost dat uložených na dané ZRAM zařízení, velikost těchto dat po kompresi a místo, které ZRAM zabírá v paměti (zde se kromě velikosti zapsaných dat bere v potaz i velikost metadat samotného ZRAM). Vidíme tak, že i když je celková velikost uložených dat je 697 MiB (nebo-li 731 MB jak ukazuje GNOME Usage), tak po kompresi v paměti zabírají jen 247 MiB. Celkově zabírá ZRAM zařízení v paměti jen 273 MiB. Díky kompresi jsme tedy ušetřili dokonce více, než slibovaných 50 %.
4. 9. 2020 at 21:45
A řeší to nějak hibernaci?
7. 9. 2020 at 11:16
Aby fungovala hibernace, je třeba mít i „normální“ swap na disku. Při běhu systému se použije ten na ZRAM (resp. bude mít vyšší prioritu, kdyby se vyčerpal i swap ve ZRAM, začně se používat i ten na disku) a pro hibernaci se použije ten na disku (je potřeba mít na boot cmdline nastavený parametr „resume“ aby systém věděl odkud má systém obnovit, ale o to se postará instalátor).
3. 1. 2021 at 13:55
Nedá se komprimovat celá RAM? Mohlo by to být užitečné pro PC s malým množstvím RAM.. 🙂