Sledování Využití CPU uvnitř HYPER-V
Skoro na každém školení nebo přednášce se zmíním o tom, jak Task Manager lže nebo o tom, že nemáte sledovat využití prostředků performance countery uvnitř VM.
Proč lže task manager?
Témeř v každé verzi Windows Serveru nebo Windows klienta byl nějaký problém se zobrazováním dat v task manageru. Od 2008 do 2012 R2 vám bude uvnitř VM ukazovat vždy maximální hodnotu paměti jakou VM nafoukne během svého celého běhu. To samozřejmě mluvím o Dynamic Memory.
V Hyper-V 2016 se dokonce chystá i možnost snížení statické paměti za běhu VM. V tom případě opět task manager uvnitř VM zas nesníží paměť, kterou zobrazuje v horní části. Podobných příkladů bych našel ještě více.
A proč nemáte monitorovat VM „zevnitř“, ale použít Hyper-V performance countery?
Nejdříve trochu k architektuře. Hypervisor nad sebou spravuje dva typy partitions – root partition a child partitions. Root je specifická v tom, že spravuje fyzické zařízení, řídí podřízené child partitions, zajišťuje endpoint pro správu atd., prostě se stará o vše kromě procesorového času a přidělování paměti. To má na starost samotný hypervisor, který běží níže na ringu -1.
Child Partition reprezentuje VM. Tedy prostředí, kde běží virtuální počítač.
Root ani child partitions nekontrolují APIC (programovatelný kontroler přerušení), Power Management Timer, správu adres, atd., což znamená, že nemají žádnou reálnou představu o čase, který je jim tedy dodáván virtuálně. Ano, i root partition (tedy hlavní řídící OS nedostává skutečný čas z HW). Tomu navíc nepřidává ani to, že virtuální procesory využívají fyzické procesory přepínaným přístupem.
Teď k samotným performance counterům. Co se týče procesoru, tak asi nejvíce známý je % Processor Time. Ten detailně ukazuje celkové množství CPU využité procesem. Nepočítá čas, kdy CPU nic nedělá (je idle).
Když teda např. mrkneme uvnitř totálně zatížené VM na tenhle counter, tak uvidíme využití CPU na 100%.
Pokud se ale v tu samou chvíli podíváme na „hezčí“ counter na úrovni root partition – Hyper-V Hypervisor Guest Run Time – tak tam uvidíme číslo menší (cca 80%)!!!
Jak to? Který tedy ukazuje správnou hodnotu? Z pohledu architektury oba. Z pohledu skutečného využití prostředků vůči fyzickému hardware má pravdu ten Hyper-V counter. Proč?
Counter uvnitř VM říká toto – systém konzumuje 100% procesorového času, který mu hypervisor dal, tedy pokaždé, když hypervisor přidělil čas, tak ho systém všechen využil. To je pravda přece, ne? VM opravdu žere 100% dodaného času do virtuálního procesoru.
Jelikož ale hypervisor má ještě v rezervě nějaký čas, který tráví přepínáním a který má k dispozici i pro jiné VM, tak ukazuje číslo nižší.
Podobně zvláštně se to bude chovat i s counterem % Processor Time na úrovni root partition. Opět nebude říkat úplně správná čísla, jelikož jeho pojem o čase je také zkreslený. Je proto tedy nutné sledovat Hyper-V Hypervisor Logical Processor. Logický procesor odpovídá jednomu vláknu (pokud máte fyzické CPU s podporou HT (hyperthreading)), které zatežuje jádro.
Závěrem dodám, že pokud bychom se bavili o sledování prostředků např. Microsoft SQL Server uvnitř VM, tak nemáte jinou možnost než použít SQL performance countery uvnitř VM. Komplexní obrázek využití prostředků základních komponent (paměť, procesor, disk a síť) dostanete vždy ale jen z root partition.
- Jan Marek