Přeskočit na obsah
Tech-Blog Chatujme.cz Chatujme.cz
Počítače

Navržené patche pro ZRAM dělí komprimační proudy na čtecí a zápisové

Správce ovladače ZRAM Sergey Senozhatsky poslal 5. října 2026 do konference linuxového jádra deset patchů, které dělí komprimační proud na zápisový a čtecí. Dosud je sdílely obě cesty, takže čtenář s vysokou prioritou čekal na zámek, který držel odstavený zapisovatel. Druhá změna přiděluje druhotnému kompresoru jediný kontext na celé zařízení místo jednoho na každé procesorové jádro.

· 49 zhlédnutí

ZRAM je blokové zařízení, které data nedrží na disku, ale komprimovaná v operační paměti. Nejčastěji slouží jako odkládací prostor: místo aby jádro poslalo stránku na disk, zmenší ji a nechá v RAM. Kompresor vybírá správce systému z několika možností – lzo, lz4, lz4hc, zstd, deflate a 842 – a jádro si pro něj drží pracovní kontext zvlášť na každém procesorovém jádru.

Dva paměťové moduly DDR4 vedle sebe na tmavé podložce
Dvojice modulů DDR4 ze sady 2×8 GB. Foto: Bretwa, Wikimedia Commons (CC BY-SA 4.0)

Právě na ty kontexty míří série deseti patchů, kterou 5. října 2026 poslal do konference linuxového jádra Sergey Senozhatsky. Ovladač ZRAM vede jako správce spolu s Minchanem Kimem a patche posílá z adresy u projektu Chromium. Úspora podle průvodního dopisu sahá od desítek po stovky kilobajtů na jeden kontext a jedno procesorové jádro. Série zatím leží k posouzení, v jádře není.

Čtenář se zasekl na zámku, který držel odstavený zapisovatel

Nejvíc práce je v devátém patchi. Do jádra 6.15 se komprese v ZRAM nedala přerušit: proud byl svázaný s procesorovým jádrem a procesor nikomu nepouštěl. Commit zram: permit preemption with active compression stream z března 2025 to změnil a přinesl s sebou nový problém.

Čtení a zápis totiž sdílely tentýž proud a tentýž zámek. Zapisovatel s nízkou prioritou si zámek vzal, začal komprimovat a procesor mu sebral čtenář s vysokou prioritou. Jenže ten se vzápětí zastavil na témž zámku a čekal, až se odstavený zapisovatel znovu dostane ke slovu. Pokud na tom jádru běželo ještě něco jiného, trvalo to dlouho. Téhle situaci se říká inverze priorit: přednostní úloha čeká na podřadnou.

Patch dělí strukturu proudu na dvě – zápisovou pro kompresi a čtecí pro dekompresi – a každou z nich drží zvlášť na každém procesorovém jádru. Obě cesty jsou na sobě nezávislé: komprese pracuje nad vlastním pomocným bufferem, dekomprese nad svým a jedna do druhé nesahá. Nápad podle patche navrhl Barry Song.

Co ukázal syntetický test

Senozhatsky přiložil měření nástrojem fio na jediném procesorovém jádru. Zstd na úrovni 12, čtyři zapisovatelé s nejnižší prioritou, jeden proces spalující procesor na běžné prioritě a jeden čtenář s nejvyšší prioritou:

mírapředpo
čtecí operace za sekundu1 27843 300
průměrná doba odbavení762,21 µs9,95 µs
99,99. percentil387 974 µs53,50 µs
nejhorší naměřená hodnota401 845 µs338 µs

Na čtyřiadvaceti jádrech, kde proti sobě stálo 48 zapisovatelů s nejnižší prioritou, 24 procesů spalujících procesor a 24 čtenářů s nejvyšší prioritou, vzrostl počet čtecích operací z 354 tisíc na 997 tisíc za sekundu. Nejhorší naměřená doba odbavení spadla ze 2 702 900 na 8 568 µs.

Zadání testu je úmyslně vyhrocené. Čtyři zapisovatelé s nejnižší možnou prioritou proti přednostnímu čtenáři na jednom jádru jsou přesně ten případ, kvůli kterému patch vznikl, a průvodní dopis sám mluví o zlepšení v syntetických testech, ne o zrychlení běžného provozu. Co z toho zbude na stolním počítači nebo na telefonu, podle nás ta čísla neříkají.

Druhotný kompresor stačí jeden na celé zařízení

Desátý patch staví na tom předchozím. ZRAM umí stránky, které delší dobu nikdo nečetl, překomprimovat silnějším a pomalejším algoritmem; má na to volitelnou funkci vícenásobné komprese. Druhotný kompresor se přitom spouští z jediného místa a to místo je zamčené zámkem zařízení, takže běží vždycky nejvýš jeden. Jádro mu přesto zakládalo kontext na každém procesorovém jádru, protože překomprimované stránky se musí dát číst souběžně – a čtení se zápisem do té doby sdílelo jednu strukturu.

Jakmile se obě cesty rozdělily, stačí pro kompresi jeden kontext na celé zařízení a dekompresní zůstanou po jádrech. Na osmijádrovém počítači se stránkou o velikosti 4 kB to podle patche ušetří:

  • zstd na výchozí úrovni 3: zhruba 700 kB,
  • zstd na úrovních 12 až 22 bez slovníku: zhruba 1,91 MB,
  • zstd na úrovních 14 až 22 se slovníkem o 110 kB: zhruba 5,33 MB,
  • deflate ve výchozím nastavení: zhruba 1,04 MB,
  • lz4hc: zhruba 1,84 MB.

Zbytek série

Zbylých osm patchů jsou drobnosti, dvě z nich se ale počítají. Třetí přestává zakládat prázdné slovníky zstd tam, kde žádný slovník nikdo nenastavil. Zstd si i na takové volání alokuje vlastní paměť – podle patche zhruba 96 kB na výchozí úrovni 3 a 160 kB na úrovni 9 a výš.

Sedmý patch nahrazuje u zstd alokaci přes kvzalloc voláním __vmalloc. Rozdíl dělá zaokrouhlování: kvzalloc zkouší nejdřív kmalloc a ten velikost zaokrouhlí nahoru na mocninu dvou v počtu stránek. Se slovníkem o 110 kB tím kompresní slovník na úrovni 12 a výš klesne z 2 048 na 1 552 kB a dekompresní kontext na každém jádru ze 128 na 96 kB.

Osmý patch opravuje chybu z úklidu zpětného zápisu: po resetu zařízení se stav zpětného zápisu přestal vracet do výchozího nastavení.

Celá série sahá na deset souborů, přidává 421 řádků a 293 jich ubírá. Jestli a v jaké podobě se dostane do jádra, rozhodne připomínkové řízení v konferenci.

Zdroje

Počítače

Linux Jádro Linuxu zstd komprese ZRAM

← zpět na výpis