Windows Server 2008 R2 Dynamic Memory

Je tomu jenom několik dní nazpět, co byl vydán Service Pack 1 pro Windows Server 2008 R2 a Windows 7, který přinesl pouze několik převratných změn. Tyto změny jsou primárně směřovány do oblasti virtualizace, dalo by se říci, že jedinými podstatnými změnami je RemoteFX, který přináší nové možnosti v grafice a přesměrování USB pomocí protokolu RDP a druhou změnou je právě Dynamic Memory, které se bude věnovat tento článek.

Pokud se poohlédneme do minulosti, kdy byla uvedena serverová virtualizace pod názvem 
Hyper-V, pak se vám možná vybaví požadavky na provoz této serverové virtualizace, mezi které mimo jiné patří povolená technologie Data Execution Prevention (DEP), která zamezuje sdílení paměti mezi jednotlivými virtuálními stroji a umožňuje spouštět kód pouze v případě, kdy se v paměti nachází spustitelný kód (nastavuje se NX bit v paměti). Možná se ptáte, proč právě v úvodu zmiňuji technologii DEP. Odpověď je jednoduchá, v případě, kdy se podíváme na podobné technologie pro práci s pamětí od jiných výrobců, zjistíte, že tyto technologie umožňují sdílení paměťových stránek mezi virtuálními počítači. Díky použití technologie DEP v rámci Windows Server 2008 Hyper-V bylo nutné zvolit odlišný způsob při správě paměti virtuálních počítačů. Technologie Dynamic Memory pracuje na principu tzv. „balooningu“, kdy je ve virtuálním počítači spuštěna služba, která schraňuje nevyužívanou RAM a je ji schopna vrátit hostiteli pro přidělení ostatním virtuálním počítačům. Ve srovnání s konkurenčními technologiemi pro správu paměti je defakto nemožné, aby fyzický operační systém přestal mít dostatek RAM a začal intenzivně využívat odkládání paměťových stránek na pevný disk – virtuální počítače dostanou pouze tolik paměti, kolik je přístupno na fyzickém hostu, ale maximum může být nastaveno na 64GB, pro případ, že by se například ve vysoce dostupné konfiguraci vyskytoval hostitel s dostupným množstvím RAM. Pojďme se tedy blíže podívat na jednotlivé komponenty Dynamic Memory, funkčnost, nastavení a správu.

Architektonické komponenty Dynamic Memory

Dynamic Memory je složena z několika komponent, přičemž komponenty jsou instalovány na fyzickém hostiteli, tak i v rámci virtuálního operačního systému.

Dynamic Memory Virtual Service Consumer (VSC) – komponenta ve virtuálním stroji, která:

Dynamic Memory Virtual Service Provider (VSP) – Komponenta fyzického hostitele, jenž dostává informace od všech Dynamic Memory VSC a předává konsolidované informace Memory Balanceru.

Memory Balancer – komponenta fyzického hostitele, která:

Jak je paměť přidávána do virtuálního počítače?

Používá se různých technik pro přidání RAM. Operační systémy od verze 2003 samy o sobě obsahují memory Hot Add, nicméně tato technologie není přesně tím, co je využíváno, resp se využívá modifikovaná verze této technologie. Konkrétně je volána Plug and Play událost a trigger ACPI Hot Add. Dále je proveden tzv. Hot Add Enlightenment (pomocí zařízení Virtual Dynamic Memory device), který obchází standardní ovladač pro práci s pamětí a přímo informuje Memory Manager, že je k dispozici další RAM. Tato informace je opět předána pomocí specifického API. V minulosti bylo toto API k dispozici pouze u Enterprise a Datacenter Edice, pro použití ve virtualizovaném prostředí bylo portováno i do edic Web a Standard (není tedy možné provést Memory Hot Add v rámci fyzického serveru).

Jak je paměť odebírána z virtuálních počítačů?

Jak jsem zmínil výše, pro alokaci nepoužívané paměti je použita technologie balooning, kdy RAM, která není alokována je soustředěna pod systémovým ovladačem, tedy v takovém případě se může jevit, že virtuální operační systém nemá dostupnou žádnou volnou RAM. Na druhý pohled je vidno, že virtuální OS má tuto RAM dostupnou a ovladač v závislosti na požadavcích OS a služeb/aplikací tuto paměť uvolňuje.

clip_image001

Abychom porozuměli tomu, jak ovladač uvolňuje dostupnou fyzickou paměť virtuálnímu operačnímu systému, resp. jednotlivým aplikacím je nutné uvést termín „Guest Memory Pressure“, což je procentuální vyjádření aktuálního stavu virtuálního počítače – dostupná fyzická RAM vs. volná RAM. I v případě, kdy není použita virtualizace, je sdílena fyzická paměť a virtuální paměť, se kterými pracují aplikace, ale také vlastní operační systém.

clip_image003

32-bit operační systémy adresují pouze 4GB RAM, ve výchozím nastavení je paměť dělena na poloviny mezi user a kernel mód. Toto chování je možné modifikovat přepínači /3GB, UserVA, které umožní alokovat více RAM pro user-mód.

64-bit operační systémy mohou teoreticky adresovat 16EB paměti, kde aktuální implementace v 64-bit Windows je adresace 16TB RAM. Jak dozajista víte, využitelná RAM pro Hyper-V je 1TB. Stejně tak jako u 32-bit edice je paměť rovným dílem dělena mezi kernel a user mód a také je možné měnit přidělování RAM pomocí např. BCDEdit.

Ještě více teorie – termíny používané ve Windows

clip_image004

Reserved Memory – paměť, která je alokována konkrétnímu procesu sadou bloků paměti ve vlastním adresním prostoru. Reserved Memory není přímou reprezentací fyzické paměti (RAM nebo disk), proces tedy v této paměti nic neukládá. 
Commited Memory – paměť přímo alokovaná procesu – fyzická RAM nebo disk (odkládací swap soubor nebo jiné dočasné soubory). 
Free Memory – adresní prostor paměti, který není využíván žádným procesem. 
System Commit Limit – maximální množství paměti, které může systém garantovat procesu = RAM + Swap. 
Current System Commit Charge – celkové množství RAM aktuálně garantované procesům.

clip_image006

Zeroed Pages – vyprázdněné paměťové stránky připravené pro přidělení procesům. 
Free Pages – nevyužívané paměťové stránky, které ještě nebyly vyprázdněny, nemohou být tedy přiděleny dalším procesům. 
Modified Pages – stránky paměti, které nebyly po nějakou dobu 
použity, ale stále obsahují data, která musí být zapsána na disk ještě před uvolněním stránek. 
Standby Pages – stránky, které již byly uloženy na disk, ale ještě nebyly uvolněny. Stránky jsou neustále přiděleny původnímu procesu pro případ, kdy se proces k těmto stránkám vrátí, případně stránky mohou být uvolněny a přiděleny jinému procesu.

clip_image008

Working set – paměť, která je garantovaná procesu, se kterou se aktivně pracuje. 
Active memory – paměť využita všemi working sety.

Nazpět do reality

Pojďme se tedy podívat na to, jak Hyper-V komunikuje s virtuálními počítači a jak pozná, že je nutné přidat další RAM virtuálnímu počítači.

Jak jsem zmiňoval výše, tato potřeba je skryta pod termínem Guest Memory Pressure a jedná se o procentuální vyčíslení aktuální dostupné paměti a množstvím adresovatelné fyzické paměti virtuálního počítače.

clip_image010

Pokud se podíváme na reálný příklad:

clip_image012

Výše uvedený obrázek z virtuálního počítače má aktuálně alokováno 798MB RAM (přesně 798 264 KB). V tomto konkrétním případě systém a procesy využívají 534MB RAM (534 780KB). Pokud bychom použili výše uvedeného vzorce a dosadili hodnoty, pak aktuální zatížení tam je 67%:

clip_image014

V tomto případě je tedy volných 33% RAM, což také označováno jako Free Buffer. V reálném světě nastanou situace, kdy tato hodnota překročí 100%. V tu chvíli nastává práce pro odkládací soubor, nicméně také zásadní snížení výkonu operačního systému (přeci jenom práce v RAM je počítána v jednotkách TB, na disku v jednotkách MB).

Jak tedy hypervizor usoudí, že je nutné / možné virtuálnímu počítači přidat RAM? V rámci Dynamic Memory je uveden koncept tzv. Pressure Band. Každý virtuální stroj prezentuje aktuální využití RAM. Pro každý virtuální stroj hypervizor ukládá historii použití paměti, které se označuje jako měřítko zátěže. V tomto případě jsou zaznamenána dlouhodobá minima a maxima virtuálního stroje, jak je znázorněno na následujícím obrázku:

clip_image016

V případě, kdy je aktuální hodnota potřebné RAM mezi dlouhodobým minimem a maximem nic se neděje. Pokud poklesne využitá RAM pod dlouhodobé minimum, pak Memory Balance považuje paměť za neefektivně využívanou, odebere část fyzické RAM virtuálnímu stroji tak, aby byl zachován poměr mezi dlouhodobým minimem a maximem (pozn. Toto se neděje, pokud má fyzický stroj dostatek volné RAM). V případě, kdy dlouhodobý průměr překročí hranici hypervizor usoudí, že virtuální stroj má nedostatek RAM a Memory Balancer přidělí virtuálnímu stroji další RAM. RAM je přidělována po malých blocích a opět tak, aby se zachovala rovnováha dlouhodobě průměrných hodnot. V případech, kdy je virtuálnímu stroji neustále přidělována další RAM, Memory Balance může navýšit indikátor minima potřebné RAM v závislosti na rozdělování RAM mezi ostatní virtuální stroje.

Které parametry ovlivňují, jakým způsobem bude prováděna alokace paměti?

Jak funguje Free Buffer?

Každý virtuální počítač má v daném čase přidělené dané množství fyzické RAM. Část této paměti je použita procesy – memory load – jak jsme již popsali. Zbylá část paměti (100% využité RAM) se nazývá Free Buffer, což je část alokované paměti, která je ponechána jako rezerva pro virtuální počítač a může být kdykoliv reálně využita virtuálním počítačem.

Množství paměti přidělené virtuálnímu počítači je součet všech přidělených typů paměti – přidělená paměť (memory load) a buffer.

clip_image018

Velikost bufferu v megabajtech může být jednoduše vypočítána z hodnot, které jsou nastaveny u virtuálního počítače a předpokládané (očekávané) velikosti bufferu (v procentech) a aktuální velikosti přidělení paměti:

clip_image020

clip_image022

Abychom porozuměli této situaci, zvažte následující:

Virtuální počítač je nastavený s úvodní konfigurací paměti na 512MB a maximum na 64GB. Procentuální nastavení Free Buffer je 25% (výchozí nastavení 20%), což je čtvrtina veškeré paměti, která může být alokována virtuálnímu počítači a je rezervována pro tento počítač (16GB + 512MB). Pokud Free Buffer poklesne pod definovaných 25%, memory balancer přidá paměť virtuálnímu počítači. Nevhodné nastavení Free Buffer může způsobit, že některé virtuální stroje nemusí na serveru nastartovat, doporučuji tedy ponechat ve výchozím nastavení 20%, případně pracovat v rozsahu 10%-30%. Tento Free Buffer může být využitý například pro kešování v rámci cirtuálního stroje, tedy např. pokud bude virtuální stroj požadovat (total commited memory) 4GB RAM a buffer bude nastavený na 50%, Hyper-V zpřístupní další 2GB RAM virtuálnímu stroji, nicméně tento buffer není garantovaný pro operační systém.

Předpokládejme, že virtuální stroj má přiděleno 673MB RAM a aktuálně využívá 515MB RAM:

clip_image023

V závislosti na výše uvedeném vzorci:

clip_image025

Pak celková velikost RAM, kterou balancer poskytuje virtuálnímu počítači je:

clip_image027

Nastavení priority

Pokud nastane situace, kdy není k dispozici dostatek fyzické RAM (například v konfiguraci vysoké dostupnosti, kdy jeden z uzlů je mimo provoz a virtuální stroje musí být provozovány na nižším počtu uzlů clusteru) je nutné určit, které virtuální stroje jsou důležitější a které méně. V případě, kdy některé virtuální stroje mají nastavenu vyšší prioritu (ve výchozím nastavení mají stejné nastavení 50%) a tyto méně prioritizované virtuální stroje požádají Memory Balancer o přiřazení RAM, tento požadavek je odmítnut a RAM je přidělována strojům s vyšší prioritou.

Rezervace paměti pro Parent Partition – hostitele

Nyní již přesně víme, kolik fyzické RAM můžeme přidělit jednotlivým virtuálním strojům, ale je také nutné myslet na fyzický operační systém – hostitele – Parent Partition. S tímto objemem RAM není kalkulováno a nijak pracováno v rámci Memory Balanceru.

V případě, kdy je v rámci Parent Partition provozován například nástroj pro správu virtualizační platformy, může být vhodné (ne nezbytně nutné) zvýšit rezervu pro fyzický operační systém. To je možné provést vytvořením klíče v registry HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization, vytvořte hodnotu MemoryReserve typu DWORD a nastavte např. na 2048, pokud chcete rezervovat 2GB pro operační systém.

Odkládací soubor a Dynamic Memory

Při práci s dynamickou pamětí je nutné myslet také na odkládací soubor – page file. Situace je o něco jednodušší nežli u ostatních virtualizačních platforem, kde virtuálním počítačům není přiděleno více RAM, nežli je opravdu přítomno ve fyzickém operačním systému a tedy Parent Partition není tolik stresována. Co nastat může je případ, kdy je nastaveno více RAM ve virtuálním stroji, nežli je schopný přidat fyzický server a obvykle velikost page file je polovinou dostupné RAM. V takovém případě může page file v rámci virtuálního stroje narůst na nežádoucí velikost. Stejně tak je nutné počítat s potřebou fyzického disku hostitele, kde je ukládán snapshot RAM (z důvodu možnosti uložení stavu počítače), kde velikost RAM = velikost souboru, tedy pokud nastavíte virtuálnímu OS 64GB RAM, bude na fyzickém disku vytvořený soubor o stejné velikosti.

Dynamická paměť a aplikace pracující s transakcemi

Dle zkušeností z ostatních virtualizačních platforem je důležité zmínit jednu podstatnou informaci. Jakákoliv technologie pracující s pamětí není vhodná pro aplikace, které alokují celou RAM a následně v této RAM pracují – typicky aplikace zpracovávající velké množství transakcí – SQL Server, Exchange a podobné aplikace. Pokud máte zkušenosti s takovými aplikacemi, pak víte, že tyto aplikace alokují téměř celou dostupnou RAM a už ji „nikdy nevrátí“, tedy až do chvíle restartu služby či celého serveru. Představme si situaci, kdy virtuálnímu počítači přiřadíte 64GB RAM (byť fyzický systém tuto RAM nemá), virtuální OS a aplikace se budou snažit tuto RAM alokovat a obdrží maximální množství fyzicky dostupné RAM. Pokud byste chtěli spustit další virtuální stroj, nepovede se tento stroj spustit, poněvadž RAM je držena aplikací, nikoliv virtuálním ovladačem.

Z toho důvodu je doporučeno pro takový typ aplikací používat statickou velikost RAM, která je přidělována virtuálnímu stroji, případně omezit maximální použitou RAM přímo v aplikaci (pokud to umožňuje).

Monitorování Dynamic Memory

Monitorování je možné provádět pomocí výkonnostních čítačů (Performace Counter) a to na dvou místech:

Čítač součástí skupiny Hyper-V Dynamic Memory Balancer.

Performance Counter

Popis

Added Memory

Celkové množství paměti přidané do virtuálních počítačů.

Available Memory

Množství paměti ponechané volné na hostiteli.

Average Pressure

Průměrná pressure v rámci memory balanceru.

Memory Add Operations

Celkový počet operací přidání paměti.

Memory Remove Operations

Celkový počet operací odebrání paměti.

Removed Memory

Celkové množství paměti odebrané z virtuálních počítačů.

Čítače součástí skupiny Hyper-V Dynamic Memory VM.

Performance Counter

Popis

Added Memory

Celkové množství paměti přidané do virtuálního počítače.

Average Pressure

Průměrná pressure ve virtuálním počítači.

Current Pressure

Aktuální pressure ve virtuálním počítači.

Guest Visible Physical Memory

Množství paměti viditelné ve virtuálním počítači.

Maximum Pressure

Maximální pressure band ve virtuálním počítači.

Memory Add Operations

Celkový počet operací přidání paměti do virtuálního počítače.

Memory Remove Operations

Celkový počet operací odebrání paměti do virtuálního počítače.

Minimum Pressure

Minimální pressure band ve virtuálním počítači.

Physical Memory

Aktuální paměť přidělená virtuálnímu počítači.

Removed Memory

Celkové množství odebrané paměti z virtuálního počítače.

Již je také v přípravě Management Pack pro Systém Center Operations Manager, který bude umožňovat toto monitorování centerálně.

Konfigurace parametrů virtuálního stroje a ladění

Pro konfiguraci, změnu nastavení RAM je nutné provést vypnutí hosta, následně je možné volit mezi statickou velikostí RAM nebo dynamickou velikostí. Konfigurace pomocí rozhraní Hyper-V případně Systém Center Virtual Machine Manager je vcelku přímočará, nicméně je možné provést některé kroky, které mohou pomoci při případných problémech s dynamickou pamětí.

Pro případ, kdy je z virtuálního operačního systému odebíráno příliš velké množství paměti, je možné navýšit počáteční velikost RAM a tím tak modifikovat jednotlivé parametry chování Memory Balanceru. Díky této změně snížíte množství RAM, která může být odebrána z virtuálního počítače, ve chvíli, kdy počítače s vyšší prioritou požadují paměť.

Dalším příkladem může být situace, kdy výkon virtuálního počítače je špatný. V takové chvíli je možné navýšit Memory Buffer, který umožní Hyper-V alokovat více paměti pro virtuální počítač. Obecně by se dá říci, že více paměti, která je alokovaná například pro souborové keše může pozitivně ovlivnit aplikace, které intenzivně pracují s IO operacemi. Na druhou stranu konfigurace Memory Buffer příliš vysoko může způsobit neefektivní rozdělování sdílené paměti jednotlivým virtuálním počítačům.

Další možností je také zvětšení velikosti odkládacího souboru v parent partition, což umožní alokovat větším množství RAM virtuálním strojům, nicméně tuto změnu provádějte s rozmyslem.

Podporované operační systémy pro Dynamic Memory

V tuto chvíli jsou podporovány, resp. spolupracují pouze Windows Operační systémy, podpora systémů Linux bude součástí dalších verzí integračních komponent.

Na závěr

Dynamic Memory je dozajista dobrým počinem a jako u spousty dalších technologií lze říci, že se jedná o dobrého sluhu, ale zlého pána. Je pravdou, že díky Dynamic Memory se podstatně sníží nároky na plánování virtualizace pomocí Hyper-V, také využitelnost vysoké dostupnosti značně stoupne. Ale při plánování nasazení a ladění konkrétních parametrů mějte vždy na paměti, co a jak modifikujete, chybným nastavením můžete snížit výkon hostitele a tím tak omezit jednotlivé hosty, v případě vysoké dostupnosti znemožnit běh virtuálních strojů při migraci na menší počet hostitelů.