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 %.