OS X Mavericks a komprese paměti
Jestli ještě nemáte poslední OS X 10.9 Mavericks, pak přicházíte o skvělou novinku, kterou je komprese paměti. Inženýři z Cupertina o této funkci mluví spíše marketingově, takže většinou ukazují nic neříkající srovnání a grafy.
Co to ale vlastně znamená a jaký je přínos? Jak to funguje? Je to vůbec k něčemu? Nebude vlastní proces komprese a dekomprese pomalejší, než když se paměť jednoduše odswapuje na disk?
Autorem článku je Kuba Břečka. @kubabrecka bloguje na svém blogu iOSák o iOS, Xcode, Objective-C, Cocoa Touch, mobilním vývoji, Applu a bezpečnosti. To vše je proloženo fotkami koťátek.
Podívejme se na to, jak vypadá vytížení paměti na mém obstarožním MacBooku se 4 GB RAM. Nejprve ve stavu, kdy nemám spuštěný prakticky žádný program, a pak ve stavu, kdy spustím hromadu paměťově náročných aplikací.
Už tady je vidět spousta zajímavých údajů: Memory Used mi hlásí, že je zaplněno 3,99 GB ze 4 GB prakticky pořád, tj. systém nemá naprosto žádnou volnou paměť, i když nemám nic spuštěno. Pokud vás tento fakt šokuje nebo si říkáte “ten OS X jsou ale hloupý systém”, pak je mi líto, ale dál nečtěte, nepochopili jste základní principy správy paměti v moderním OS.
Ale nejste v tom sami, ani na Windows, ani na Mac OS X, ani na Linuxu. Numerologové na to mají různé rady, co s tím. Osobně jsem viděl i experty, kteří se podívají ve Windows do Task Manageru, uvidí v kolonce “Free memory” nulu a řeknou “nojo, musíš si koupit víc RAMky”.
Pojďme dále, můj systém v klidovém stavu vůbec nepoužívá swap. Tak by to mělo být. Ale že systém nepoužívá vůbec žádný swap, i když mám spuštěno 20 paměťově náročných aplikací? Tak to vypadá opravdu slušně! Tohle je oproti předchozím OS X velký rozdíl, minimálně na mém stroji by starý OS X v této situaci používal alespoň gigo nebo dvě swapu.
Černá magie?
V době klidu ukazovala hodnota App Memory hodnotu 1,68 GB, což bych tak nějak očekával – na pozadí běží řada procesů, kernel a drivery taky něco sežerou. Když jsem ale spustil těch 20 aplikací, App Memory ukazuje 2,13 GB – to je nějak podezřele málo! Hergot, vždyť jenom ten Photoshop sám si určitě ukrojí půl giga. Odpověď je ale samozřejmě nasnadě: Většina paměti náročných aplikací je zkomprimována a tedy se nachází v kolonce Compressed. Dohromady (půl giga navíc v App Memory a 600 MB v Compressed) to dává, že můj systém na těchto 20 aplikací potřeboval jenom něco málo přes 1 GB paměti! Což ukazuje na účinnost komprese, protože bez ní by aplikace zabraly určitě přes 3 GB.
Nabízí se otázka, kde systém vzal ten gigabajt paměti, když už předtím žádnou volnou paměť neměl. Odpovědí je File Cache, tj. paměť, která slouží především pro optimalizaci čtení z disku. Data, která byla v poslední době přečtena z disku, se při příštím přístupu nebudou načítat znovu, ale jsou nakešována. Pokud systém potřebuje další paměť, stačí některá data z keše vyhodit. Pokud jste někdy použili příkaz purge, pak vězte, že ten nedělá nic jiného, než že odstraní všechna data z této keše. Modří již vědí, že spouštět tento příkaz je zbytečné ba dokonce kontraproduktivní – výkon systému to jenom zhorší.
Nejvíc nejasností panuje o tzv. Wired Memory (zadrátovaná), tedy paměti, která nemůže být odswapována ani zkomprimována. Dokumentace poměrně přesně popisuje, jaká paměť je zadrátovaná, a kde se bere: Jedná se o struktury kernelu, ke kterým je potřeba přistupovat, aniž by mohlo dojít k výpadku stránky. Takže třeba stránkovací tabulky, údaje o procesech a vláknech, kód a data ovladačů a kernelových rozšíření. Už je ale problém zjistit, co přesně zabírá kolik místa v paměti, protože systém tyto údaje prostě neposkytuje. Respektive umí je zpřístupnit debug verze kernelu, takže jestli se vám chce si překompilovat kernel s flagem MACH_VM_DEBUG, získáte možnost přes syscall mach_vm_region_info zjistit, která přesně paměť je zadrátovaná.
Ale zpět ke kompresi – co to vlastně je za černou magii, která umí ze tří gigabajtů udělat jeden? Která umí udržet v paměti 20 náročných aplikací, aniž by cokoliv odswapovala na disk? A když je to tak šikovné, proč moderní OS nemají kompresi paměti jako běžnou funkci?
Zázračná komprese
Apple vydává řadu svého softwaru jako open-source a již dokonce zveřejnil zdrojáky od svého kernelu xnu ve verzi 2422.1.72, který je právě použit v OS X Mavericks. Kód zodpovědný za kompresi a dekompresi lze najít v souborech WKdmCompress_new.s a WKdmDecompress_new.s a jedná se o upravenou implementaci algoritmu WKdm, pojmenovaný podle tvůrců Paula Wilsona a Scotta Kaplana (“dm” znamená direct-mapped, protože algoritmus používá přímo mapovaný slovník).
Ačkoliv běžné kompresní algoritmy jsou optimalizované na co největší úsporu místa, WKdm má za prioritu co nejrychlejší (de)kompresi. To je pochopitelné, protože pokud by byl algoritmus pomalý, nic bychom oproti swapování nezískali, a ještě by to spotřebovalo více energie. Přesto je ale WKdm v kompresi velice úspěšný! Využívá totiž toho, že se velice často v paměti opakují některé vzory, nebo že stránky v paměti často obsahují samé nuly. Autoři analyzovali právě takového vzory a výsledkem je algoritmus, který je až překvapivě jednoduchý:
- Algoritmus čte po slovech (32 bitů, a to i na 64bitových strojích) a snaží se komprimovat vždy jednu stránku (4 kB)
- Má slovník o 16 slovech
- Každé slovo ze stránky je potom zařazeno do jedné ze čtyř kategorií:
- je nulové – je zkomprimováno do dvou bitů 00 (ze 32 bitů zbydou 2)
- celé slovo je ve slovníku – je zkomprimováno do bitů 11 následováno čtyřbitovým indexem do slovníku (úspora 26 bitů)
- vrchních 22 bitů slova je shodných se slovem ve slovníku – je zkomprimováno do bitů 01 následováno čtyřbitovým indexem do slovníku a zbylými deseti bity (úspora 16 bitů)
- ani jedno z předchozích – na výstup jdou bity 10 a celé aktuální slovo (o 2 bity větší než původně)
Takový je princip, implementace je samozřejmě o něco složitější (zejména vytváření slovníku), navíc ji Apple ručně zoptimalizoval v assembleru. Výše zmíněné zdrojáky však mají v úvodu hezky popsaný celý algoritmus. Je zřejmé, že dekomprese je triviální úkol.
Asi není třeba rozebírat, že na jiné úlohy by tento algoritmus byl naprosto nevhodný. Co myslíte, jak by si poradil s běžným textovým dokumentem?
Cílem není zrychlení
No a proč takhle paměť nekomprimují ostatní OS? Především celá myšlenka komprese je pořád dost kontroverzní – není vůbec zřejmé, že zrovna vašemu systému přinese nějaké zrychlení, klidně se může stát, že bude na škodu. Dalším problémem je volba algoritmu a vhodného kompromisu mezi zátěží CPU a kvalitou komprese. Kromě toho, implementace takovéto fičury do jádra obnáší enormní úsilí – přecijenom správa paměti a swapování je něco, co se obvykle moc nemění. V neposlední řadě něco takového mohlo přijít až v době, když máme všichni dostatečně výkonná CPU, aby nebyla znát lehce zvýšená zátěž procesoru.
Článek původně vyšel na blogu iOSák.cz, odkud byl převzat se svolením autora. Redakčně upraveno. Pro tento článek neplatí licence CC BY-NC-ND 3.0 CZ, pod kterou publikuje SuperApple.cz, ale zůstává zachována licence původního článku.
Super, hezky napsané.
Mozem sa opytat co znamená ta virtual memory? Uvazujem o kupe 8 GB ram (teraz mam 4gb) a taktiez o upgrade na Mavericks.. je dostacujucich tych 4GB na beznu pracu v Mavericks? :) Dakujem za odpoved :)
Neodpovím ti na technické věci, spíš jenom z uživatelského hlediska. Od podzimu Mavericks, 8GB na MB white unibody (2009) a úplně v pohodě na náročné aplikace, na iMacu (2007) se 4GB je to lepší než OS ML, ale kapku už se zadýchává, čemuž také rozhodně nepřidává stáří hardwaru. Jinak s Mavericks celková spokojenost, 4GB na sledování videa, kancelářské práce a poslech hudby postačí. Investice do ram ale není žádná tragedie a rozdíl určitě pocítíš, především při práci s většími knihovnami (iPhoto, iTunes…) a v odezvě systému.
Ďakujem. Ešte asi počkám na update 10.9.2 a tak urobím clean install… Ram som chcel upgrade-nut už dávno, avšak posledný rok sa ich cena zvýšila na dvojnásobok. Momentálne mám 13″ MBP early so SL. Celkovo je podľa teba Mavericks už dostatočne stabilný?
Taky jsem byl do cca loňského dubna na SL, pak jsem přešel kvůli synchronizaci na ML, po 3-4 týdnech došlo na iMacu k velkému zpomalení (pravda, pak mi za 3 měsíce odešel disk, pravděpodobně to bylo tím). Používám Maverics od vydání a žádný zásadní zádrhel jsem nezpozoroval.
Ahoj, já vím, že můj problém ASI není problem paměti apod. ale dřív jsem měl ML a hned po vydání Mav jsem přešel na něj v domění, že ušetřim na baterii, spousta novych funcí atd …. ale co se nestalo. Od ty doby co ho mam nainstalovanej, tak se mi neustále seká safari, kdyz pripojim disk tak se to taky sekne … a u par aplikací mi to taky dělá. Už mě to fakt s.ere …. čekal jsem od toho víc. Navíc na baterku dám mín než předtím, což mě s.ere ještě víc. Když jsem měl ML tak se mi to za celou dobu užívání ani jednou neseklo, na baterku jsem jel klidne 9 hodin (MacBook Pro 2012 mid). Pomůže mi clean instal Mav?
Já tedy nevím, ale co jsem přešel na Mavericks mám neustálé potíže a viním za to právě kompresi paměti. Prodal jsem iMaca a koupil nového. Udělal jsem na něm čistou instalaci 10.9.1 a potíže přetrvávají. Zatrhávání Safari a duhové kolečko, problémy s vypínáním. Problémy ostatních činností když něco kopíruji, (například EyeTV zmrzne po celou dobu kopírování do iTunes a to mám 16GB paměti. Takže mi řekněte, jestli se dá vyloučit, že to není kompresí paměti. Navíc mám kamaráda, který má stejného iMaca a je to totéž. Nedá se to sakra vypnout? A k dovršení všeho moje instalace na MacBooku se chová normálně.
Taky mám od přechodu na Mavericks problémy s pamětí. Udělal jsem i čistou instalaci a nepomohlo, předtím bez problémů. Tahle vychytávka by podle mě udělala nejelepší službu, kdyby šla vypnout…
Děcka, já tam hodil čistou instalaci ted tak uvidíme … budu referovat. ZATÍM to vypadá slibně.
U me uz asi dobry po cisty instalaci. Zatim vsechno slape.
Macbook Air 2011 4GB RAM proveden klasický upgrade přes ML a vše je v pohodě. Barevné kolečko se občas ukáže, ale ne častěji než v ML. Safari bez problémů.
Ja mam macbook pro 13″ mid 2009 a po upgrade na Mavericks som doplnil pamat na max moznych 8 giga, bola draha ale co uz, dalej dal 512gb ssd a ide to fakt svizne, az som prekvapeny, plus tam mam win7 cez parallels. Az na obcasne zblbutie mac mail, alebo dlhsie zapinanie macbook ked je tyzden ci dva mac zapnuty, inak super.