Hlavní navigace

Chrome už nebude žrout paměti, sníží spotřebu o desítky procent

11. 10. 2016
Doba čtení: 4 minuty

Sdílet

Chrome (Chromium) je nejrozšířenějším prohlížečem současnosti, je o něm ovšem známo, že je to velký žrout paměti. Prosincové vydání ale přijde s řadou optimalizací snižujících spotřebu.

Prohlížeč Chrome dnes podle naměřených statistik na webech najdeme na každém druhém počítači. Jeho nejbližší soupeř Internet Explorer má poloviční zastoupení. Přes všechny přednosti má Chrome dlouhodobě velký problém s konzumací paměti a řada uživatelů jej proto nemá rádo.


NetMarketShare

Zastoupení prohlížečů září 2016

Vývojáři se nyní podívali spotřebě paměti na zoubek a připravovaná verze 55 by měla být výrazně úspornější. Podle plánů se jí dočkáme v prosinci, ale už nyní je možné ji vyzkoušet v rámci vývojářských kanálů. Optimalizace se týkají zejména javascriptového jádra V8. V průběhu několika posledních měsíců tým V8 analyzoval a významně snížil spotřebu paměti u několika stránek reprezentujících současný moderní webový vývoj, píše se na vývojářském blogu.

Mnoho testování

V případě takových optimalizací je zásadní intenzivní testování, při kterém jsou odhaleny konkrétní problémy. Vývojáři přitom používají nástroj Telemetry, který dovoluje provádět reprodukovatelné simulace práce s JavaScriptem – simuluje interakci uživatele s daným webem a zaznamenává veškeré chování serveru i prohlížeče.

V praxi se testování zpravodajských webů provádí tak, že se stránka načte, automat klikne na první odkaz, počká na kompletní načtení a vrátí se zpět. Pak klikne na další odkaz a celou tuto činnost několikrát zopakuje. V případě webu s multimediálním obsahem se spustí video, několik sekund se nechá běžet a poté automat vybere další položku ke sledování. Tato činnost se také několikrát opakuje.

Takto vytvořené benchmarky je pak možné v testovacím prostředí průběžně během vývoje opakovat a sledovat tak dopad optimalizací na různé verze prohlížeče. Vývojářský tým své testy zveřejnil, takže je může kdokoliv zopakovat.

Vývojáři do nových verzí Chrome přidali možnost velmi podrobného sledování javascriptového jádra. Prohlížeč spuštěný s parametrem --trace-gc-object-stats vypisuje do konzole podrobnosti o alokaci paměti pro jednotlivé datové struktury. Ty je pak možné vizualizovat speciálním nástrojem. Výsledek vypadá přibližně takto:

Datové struktury na haldě

Na základě alokace paměti je pak možné se vrátit do kódu a zjistit, zda se jednotlivé struktury chovají podle očekávání nebo existuje možnost optimalizace. Použili jsme tento nástroj k odhalení nízké efektivity v mnoha datových typech, píší vývojáři.

Zmenšení haldy pro JavaScript

Existuje přímá vazba mezi intenzitou použití garbage collectoru, latencí a spotřebou paměti. Využití garbage collectoru může být například sníženo tak, že aplikace dostane více paměti – není pak potřeba tak často uklízet a uživatel nepozoruje prodlevy. V případě zařízení s malým množstvím paměti (třeba levné telefony s 512 MB RAM) by ale přílišná roztahovačnost vedla k zásahu out-of-memory killeru a shazování nenasytné aplikace.

Vývojáři proto nasadili heuristiku, která se dynamicky rozhoduje, jakou strategii při použití garbage collectoru zvolí. Po ukončení úklidu se provede statistika živých objektů a podle ní se prostředí rozhodne, na kdy naplánuje další úklid. Pokud se rozhodne pamětí šetřit, začne plánovat běh collectoru častěji.

Následující graf ukazuje, jak tento postup sníží využití paměti na zařízeních s malým množstvím paměti. Průměr se pohybuje okolo 50 %, ale například v případě serveru New York Times se množství alokované paměti snížilo o 66 %.

Využití paměti v Chrome 53 a 55

Další optimalizace se týká snížení velikosti stránky na javascriptové haldě na polovinu. Místo 1MB stránek se tak v novějších verzích používají 512KB. To umožňuje menší fragmentaci, snižuje to využití paměti a dovoluje to více využívat paralelizaci nad menšími kousky paměti.

Správa paměti pro VM

Javascriptové jádro V8 také kromě haldy využívá další paměť pro interní operace s VM. Tato paměť je alokovaná v takzvaných zónách, které dovolují velmi rychlou alokaci a vyprázdnění, jakmile je zóna zase zrušena. Toho se využívá nejčastěji při parsování a kompilaci skriptů.

Ke zpracování skriptů přitom dochází v pozadí už při načítání stránky. Vývojáři pomocí vizualizace paměti zjistili, že tento proces nechává naalokovanou zónu i po skončení kompilace. Bylo přijato nové opatření, které způsobí, že je zóna zrušena okamžitě po dokončení práce kompilátoru. To vede k celkově nižší spotřebě paměti a hlavně menším špičkám.

Zároveň vývojáři zjistili, že kompilátor C++, kterým je Chrome sestavován, ne vždy dobře optimalizuje rozložení polí v paměti. Když jsou například v paměti umístěny dvě proměnné typu boolean, měly by obsadit sousední bity v jednom slově nebo využít volné bity v už používané paměti. Kompilátor se ale ne vždy chová správně, proto se vývojáři rozhodli tuto optimalizaci provádět sami. Výsledkem je opět snížení množství zbytečně alokované paměti, ale také vyšší výkon parseru a kompilátoru javascriptu.

Na následujícím grafu je vidět, jak klesla spotřeba paměti prohlížeče po úpravách správy paměti ve VM.

UX DAy - tip 2

Využití paměti v Chrome 54 a 55

Vývojáři slibují, že v této oblasti neskončili a plánují další optimalizace týkající se zón. Zaměří se při tom na zařízení, která mají mezi 512 MB a 1 GB paměti.

Dočkáme se v prosinci

Zmíněné optimalizace jsou nyní součástí vývojářského sestavení a postupně se dostanou k uživatelům. V tuto chvíli je aktuální verze 53, přibližně za týden nás čeká vydání verze 54 a podle plánu bychom se stabilního vydání 55 se zmíněnými optimalizacemi měli dočkat 6. prosince.

Byl pro vás článek přínosný?

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.