Cryogenic: nový kernelový modul sníží energetickou náročnost Linuxu
Na jeho vývoji pracovala Alejandra Morales v rámci své diplomové práce na Mnichovské univerzitě. Finta nového modulu je v tom, že shlukuje I/O operace do větších celků a jednotlivé dílčí operace vykonává až v případě, že je skutečně nutné je provést či jsou zrovna prováděny jiné. Ale aby to dávalo smysl, musíme více do historie vývoje správy napájení procesorů.
Vše, co si zde povíme, se samozřejmě vztahuje z hlediska výdrže jak na notebooky, tak netbooky, tablety, smartphony, wearables věci či cokoli dalšího běžícího na Linuxu. Pro desktopy pak benefit tohoto modulu bude ve snížení spotřeby počítače, tedy v ušetřených nákladech na elektřinu.
Celé to samozřejmě začalo kdysi dávno. Ale ještě před tímto dávnem měly notebooky typicky běžné desktopové procesory. TDP bylo malé a stejně bylo potřeba maximum výkonu, takže nikdo nějaké změny frekvencí či napětí neřešil. Pak ale jak rostly energetické nároky procesorů, zjistilo se, že je kupříkladu v situacích, kdy je výkonu CPU přebytek, výhodnější provozovat CPU na nějaké snížené frekvenci se sníženým napětím a vykonávat operace tak jak přicházejí. To byly v podstatě ještě staré dobré jednoduché časy.
Jenže pak jak přicházely stále rychlejší a rychlejší procesory a měnily se jejich provozní charakteristiky, zjistilo se a prakticky ověřilo (velmi hrubě řekněme tak před 10 až 15 lety), že tento přístup již není energeticky nejvýhodnější. Novým přístupem se stal tento: nechat CPU a další prvky co nejdéle „spát“, tedy běžet v nejnižším možném energetickém stavu, který ale ještě zajišťuje rychlou odezvu na požadavky, tedy rychlé probuzení. O tom všem je ten letitý vývoj, ostatně není třeba chodit daleko, hitem SSD je režim DEVSLEEP a i procesory Haswell přišly s úspornými režimy C6/C7. Vše pro jedinou věc:
Energeticky nejvýhodnější je nechat celý systém na nejnižších možných parametrech a pouze pokud přicházejí požadavky jej probouzet, napálit frekvence na maximum, celou věc vykonat co nejrychleji a pak systém zase okamžitě hodit na nejpomalejší takty. A takto stále dokola, klidně jej takto „probouzet“ a „uspávat“ (prosím neplést se STR/STD) stokrát za vteřinu. Proto jsou schopny moderní CPU běžet na zlomcích svých taktů a i proto mají Boost/Turbo režimy - toto je aktuálně nejvýhodnější možný přístup.
Jenže minimálně v Linuxu, tedy kernelu, který řídí celý OS, je ten problém, že ono probouzení je i tak zbytečně moc časté. Apple si může dovolit ladit svůj mikrokernel přesně pro konkrétní omezenou rodinu výrobků. Proto také má nejlepší výdrž notebooků na daný akumulátor. Linux je naprosto univerzální, běží na čemkoli od hodinek až po Mezinárodní vesmírnou stanici. Jeho přístup je tedy až dosud takový, řekněme méně flexibilní. A to právě řeší kernelový modul Cryogenic.
Jeho cílem je neprobouzet CPU a další komponenty pokaždé, když si nějaká aplikace vzpomene, že chce provést nějakou I/O operaci. Naopak implementuje mechanismy - řekněme „API“ - které umožní aplikacím sdělovat kernelu něco jako „tady je moje I/O operace a proveď ji hned, jelikož nepočká“, nebo „… a klidně ji odlož, počká to až XXX (mili)sekund“. A Cryogenic modul tyto požadavky spravuje, shlukuje do větších celků a kdykoli se objeví neodkladná I/O operace, přidá k ní i všechny, které doteď čekaly, CPU/systém „probudí“, napálí maximální takty, vše provede a zase rychle „uspí“ na minimální možné provozní parametry.
Obecně lze říci, že nový přístup by měl být v nejhorších scénářích stejně efektivní jako dosavadní, v průměru měřitelně lepší a v ideálních situacích výrazně lepší. Jedinou jeho nevýhodou, která jistě bude časem vyřešena, je nutnost podpory jeho API v programech či dalších prvcích systému, právě s ohledem na nutnost definovat buď že je požadavek urgentní, nebo počká po daný časový interval (definovaný minimálním prodlením / maximálním dobou).
Modul pracuje tak, že každé zařízení má svůj soubor v /dev/cryogenic/
, přes který se komunikace prohání (pozn. pro neznalé: v Unixu je všechno soubor, zařízení jsou tedy reprezentována virtuálními soubory). Redefinuje pak sadu systémových volání: open, close, ioctl a select.
Tak se nechme překvapit, jestli a jak rychle tato zajímavá novinka probublá do hlavního (Linusova) kernelu a bude skutečně nasazena v linuxových distribucích.