Uvedl váš dodavatel softwaru, že můžete virtualizovat jeho aplikaci, ale pouze pokud jí vyhradíte jedno nebo více jader CPU? Není vám jasné, co se stane, když přiřadíte CPU k virtuálnímu počítači? Zdaleka nejste sami.
Poznámka: Tento článek byl původně publikován v únoru 2014. Byl plně aktualizován, aby byl relevantní od listopadu 2019.
Stejně jako všechny ostatní „hardware“ virtuálních strojů neexistují ani virtuální CPU. Hypervizor využívá skutečné procesory fyzického hostitele k vytváření virtuálních konstrukcí, které lze prezentovat virtuálním strojům. Hypervizor řídí přístup ke skutečným CPU, stejně jako řídí přístup ke všemu ostatnímu hardwaru.
Před pokračováním se ujistěte, že rozumíte této části. Přiřazení 2 vCPU systému neznamená, že Hyper-V odebere dvě jádra z fyzického fondu a trvale je připojí k vašemu virtuálnímu počítači. Fyzické jádro nelze virtuálnímu počítači přiřadit vůbec. Takže to znamená, že prostě nemůžete splnit požadavek dodavatele na věnování jádra nebo dvou? No, ne přesně. O tom více ke konci.
Začněme tím, že se podíváme na to, jak se procesory používají v běžných Windows. Zde je snímek obrazovky mého Správce úloh:
Správce úloh
Nic přepychového, že? Vypadá to povědomě, že?
Nyní, když se počítače nikdy nebo téměř nikdy nedodávaly jako vícejádrové boxy s více CPU, jsme všichni věděli, že počítače ve skutečnosti multitasking neumí. Měly jeden CPU a jedno jádro, takže existovalo pouze jedno možné aktivní vlákno provádění. Ale kromě efektních grafických aktualizací vypadal Správce úloh nyní skoro jako Správce úloh. Měli jste dlouhý seznam běžících procesů, každý s metrikou udávající, jaké procento času CPU využíval.
Poté, stejně jako nyní, každá řádková položka, kterou vidíte, představuje proces (nebo, nově v posledních verzích Správce úloh, skupinu procesů). Proces se skládá z jednoho nebo více vláken. Vlákno není nic jiného než sekvence instrukcí CPU (klíčové slovo: sekvence).
Co se stane, je, že (ve Windows to začalo v 95 a NT) operační systém zastaví běžící vlákno, zachová jeho stav a pak spustí další vlákno. Po chvíli tyto operace zopakuje pro další vlákno. Říkáme tomu preemptivní, což znamená, že operační systém rozhodne, kdy pozastavit aktuální vlákno a přepnout na jiné. Můžete nastavit priority, které ovlivňují rychlost procesu, ale plánování vláken má na starosti operační systém.
V současné době mají téměř všechny počítače více jader, takže systém Windows může skutečně provádět více úloh najednou.
Díky své roli správce vláken lze systém Windows nazvat „supervizorem“ (velmi stará terminologie, kterou už opravdu nikdy neuvidíte): systém, který řídí procesy které se skládají z vláken. Hyper-V je hypervizor: systém, který spravuje supervizory, které řídí procesy, které se skládají z vláken.
Správce úloh nefunguje stejným způsobem pro Hyper-V, ale děje se to samé. Existuje seznam oddílů a uvnitř těchto oddílů jsou procesy a vlákna. Plánovač vláken funguje v podstatě stejným způsobem, asi takto:
Plánování vláken hypervisoru
Samozřejmě, skutečný systém bude mít vždy spuštěno více než devět vláken. Plánovač vláken je všechny zařadí do fronty.
Pravděpodobně víte, že můžete sjednotit vlákna ve Windows tak, aby vždy běžela na konkrétním jádru nebo sadě jader. V Hyper-V to udělat nemůžete. Pokud tak učiníme, mělo by to každopádně pochybnou hodnotu; věnování vlákna jádru není totéž jako věnování jádra vláknu, o což se mnoho lidí opravdu chce pokusit. Nemůžete zabránit jádru ve spouštění jiných vláken ve světě Windows nebo Hyper-V.
Nejjednodušší odpovědí je, že Hyper-V rozhoduje na úrovni hypervizoru. Ve skutečnosti to hostům neumožňuje žádný vstup. Hostující operační systémy plánují vlákna z procesů, které vlastní. Když si vyberou vlákno ke spuštění, pošlou ho do virtuálního CPU. Hyper-V to bere odtamtud.
Obrázek, který jsem uvedl výše, je nutně přílišné zjednodušení, protože není jednoduché „první dovnitř, první ven. Roli hraje například NUMA. Skutečné pochopení tohoto tématu vyžaduje poměrně hluboký ponor do některých složitých myšlenek. Jen málo administrátorů vyžaduje takovou úroveň hloubky a její prozkoumání zde by tento článek posunulo daleko.
První věc, na které záleží: afinita stranou, nikdy nevíte, kde se které vlákno spustí. Vlákno, které bylo pozastaveno, aby poskytlo čas CPU jinému vláknu, může být velmi dobře přiřazeno jinému jádru, když je obnoveno. Přemýšleli jste někdy nad tím, proč aplikace spotřebovává právě 50 % dvoujádrového systému a každé jádro vypadá, že běží na 50 % využití? Toto chování označuje aplikaci s jedním vláknem. Pokaždé, když to plánovač spustí, spotřebuje 100 % jádra, na kterém přistane. Při příštím spuštění zůstane na stejném jádru nebo přejde na jiné jádro. Ať už to plánovač přiřadí kterému jádru, spotřebuje 100 %. Když Správce úloh agreguje svůj výkon pro zobrazení, je to dokonce 50% využití – aplikace využívá 100 % z 50 % kapacity systému. Vzhledem k tomu, že jádro, na kterém aplikace neběží, zůstává většinou nečinné, zatímco druhé jádro se vypíná, kumulativně dosahují 50% využití za měřené časové období. Díky možnostem novějších verzí Správce úloh mu nyní můžete dát pokyn, aby jednotlivá jádra zobrazoval jednotlivě, díky čemuž je toto chování mnohem zjevnější.
Nyní se můžeme podívat na počet vCPU přiřazených k systému a prioritu.
Nejprve byste si měli všimnout, že virtuálnímu počítači nemůžete přiřadit více vCPU, než kolik máte logických procesorů ve svém hostiteli.
Neplatný počet CPU
Počet vCPU virtuálního počítače tedy znamená toto: maximální počet vláken, která může virtuální počítač v daném okamžiku spustit. Nemohu nastavit virtuální počítač ze snímku obrazovky tak, aby měl více než dva vCPU, protože hostitel má pouze dva logické procesory. Proto není nikde naplánováno třetí vlákno. Ale pokud bych měl 24jádrový systém a nechal tento VM na 2 vCPU, pak by do Hyper-V vždy poslal maximálně dvě vlákna pro plánování. Plánovač vláken virtuálního počítače (správce) bude držet svá ostatní vlákna ve frontě a čekat, až na ně přijde řada.
Ano, celkový počet vCPU na všech virtuálních počítačích může překročit počet fyzických jader v hostiteli. Nic se neliší od skutečnosti, že na mém dvoujádrovém notebooku právě teď „běží“ 40+ procesů. Mohu spustit pouze dvě vlákna najednou, ale vždy naplánuji mnohem více než dvě vlákna. Windows to dělá už velmi dlouho a Windows je v tom (obvykle) tak dobrý, že většina lidí nikdy nevidí potřebu přemýšlet nad tím, co se děje. Na vašich virtuálních počítačích (supervizorech) se vytvoří podprocesy ke spuštění a Hyper-V (hypervizor) je naplánuje způsobem (většinou), jakým je plánoval systém Windows od doby, kdy přerostl kooperativní plánování ve Windows 3.x.
To je otázka, která má na mysli každého. Řeknu vám to přímo: v obecném smyslu tato otázka nemá odpověď.
Jistě, když lidé říkali 1:1. Někteří lidé to říkají dodnes. A víš, dokážeš to. Je to zbytečné, ale můžete to udělat. Mohl bych provozovat svou současnou konfiguraci desktopu na čtyřjádrovém serveru se čtyřmi 16 jádry a nikdy bych neměl žádný spor. Ale asi bych neviděl velký rozdíl ve výkonu. Proč? Protože téměř všechna moje vlákna jsou téměř po celou dobu nečinná. Pokud něco potřebuje 0 % CPU času, co udělá to, že tomu dá vlastní jádro? Nic, to je ono.
Později byla odpověď upgradována na 8 vCPU na 1 fyzické jádro. Dobře, jistě, dobře.
Pak bylo 12.
A pak doporučení zmizela.
Odešli, protože ve skutečnosti nikdo nic netuší. Plánovač rovnoměrně rozdělí vlákna mezi dostupná jádra. Množství potřebných fyzických CPU tedy nezávisí na počtu virtuálních CPU. Záleží zcela na tom, co operační vlákna potřebují. A i když máte v chodu spoustu těžkých vláken, neznamená to, že jejich systémy zemřou, protože je budou zabraňovat jiným těžkým vláknům. Potřebný poměr vCPU/pCPU zcela závisí na profilu zatížení CPU a vaší toleranci latence. Vícenásobná těžká zatížení vyžadují nízký poměr. Několik těžkých zátěží funguje dobře se středním poměrem. Lehké zatížení může běžet na systému s vysokým poměrem.
Chystám se vám prozradit malé špinavé tajemství o CPU: Pokaždé, když vlákno běží, bez ohledu na to, co to je, pohání CPU na 100 % (snižování výkonu mění rychlost hodin, ne zátěž nasycení). CPU je binární zařízení; buď se to zpracovává, nebo není. Když vám vaše nástroje pro metriky výkonu ukážou, že 100 % nebo 20 % nebo 50 % nebo jakékoli číslo, vypočítají to z měření času. Pokud vidíte 100 %, znamená to, že CPU zpracovávalo po celou měřenou dobu. 20 % znamená, že proces běžel 1/5 času a 4/5 času byl nečinný. To znamená, že jedno vlákno nespotřebovává 100 % CPU, protože Windows/Hyper-V ho předběžně vyřadí, když chce spustit další vlákno. Na stejném systému můžete mít několik „100%“ procesorových vláken. I tak může systém reagovat, pouze když má nějakou dobu nečinnosti, což znamená, že většina vláken jednoduše nechá svůj časový úsek plynout. To umožňuje ostatním vláknům rychlejší přístup k jádrům. Když máte více vláken vždy ve frontě na aktivní čas CPU, celý systém bude méně reagovat, protože vlákna musí čekat. Použití dalších jader tento problém vyřeší, protože rozloží pracovní zátěž.
Výsledek: pokud chcete vědět, kolik fyzických jader potřebujete, musíte znát výkonnostní profil vaší skutečné pracovní zátěže. Pokud nevíte, začněte s dřívějšími doporučeními 8:1 nebo 12:1.
[thrive_leads id=’17165′]
Nedoporučuji vám vrtat se v nastavení CPU, pokud nemáte problém vyřešit spor s CPU. Nechte plánovač vláken dělat svou práci. Stejně jako nastavení priorit CPU ve vláknech ve Windows může způsobit více problémů, než vyřeší, pohrávání si s nastavením vCPU hypervisoru může vše zhoršit.
Podívejme se na konfigurační obrazovku:
Nastavení vCPU
První skupina polí je rezerva. První pole představuje procento povoleného počtu vCPU, které má být vyčleněno. Jeho skutečný význam závisí na počtu vCPU přiřazených k virtuálnímu počítači. Druhé pole, zašedlé, ukazuje celkové procento zdrojů hostitele, které Hyper-V vyčlení pro tento virtuální počítač. V tomto případě mám systém 2 vCPU na dvoujádrovém hostiteli, takže obě krabice budou stejné. Pokud nastavím 10procentní rezervu, je to 10 procent z celkových fyzických zdrojů. Pokud snížím alokaci na 1 vCPU, pak se z 10procentní rezervy stane 5 procent fyzických. Druhé pole bude automaticky vypočítáno, když upravíte první pole.
Rezerva je tvrdé minimum… tak nějak. Pokud součet všech nastavení rezervy všech virtuálních strojů na daném hostiteli překročí 100 %, pak se alespoň jeden virtuální stroj nespustí. Ale pokud je rezerva virtuálního počítače 0 %, pak se to do 100 % vůbec nepočítá (zdá se to docela zřejmé, ale nikdy nevíte). Ale pokud je VM s 20% rezervou nečinný, pak mohou ostatní procesy využívat až 100 % dostupného výkonu procesoru... dokud se VM s rezervou nespustí. Poté, jakmile bude k dispozici kapacita CPU, bude rezervovaný VM schopen dominovat až 20 % celkového výpočetního výkonu. Protože jsou časové úseky tak krátké, ve skutečnosti to vypadá, jako by měl vždy k dispozici 20 %, ale musí čekat jako všichni ostatní.
Takže ten dodavatel, který chce dedikovaný CPU? Pokud opravdu chcete splnit jejich přání, udělejte to takto. Do horního pole zadáte jakékoli číslo, díky kterému bude druhé pole ukazovat ekvivalentní výkon procesoru libovolného počtu pCPU/jader, o kterých si dodavatel myslí, že je potřebuje. Pokud chtějí jeden celý CPU a vy máte čtyřjádrového hostitele, tak u druhého políčka ukažte 25 %. Opravdu musíte? no, nevím. Jejich software pravděpodobně nepotřebuje takovou sílu, ale pokud vás mohou nakopnout k podpoře, že je neposloucháte, no... nenechte mě do toho. Skutečným důvodem, proč hustota virtualizace nikdy nenarazí na to, co výrobci hypervizorů říkají, že mohou udělat, jsou arbitrární pravidla dodavatelů softwaru, ale to je řeč na jiný den.
Další dvě políčka představují limit. Nyní, když rozumíte rezervě, můžete pochopit limit. Je to omezení zdrojů. Udržuje ruce chamtivé VM mimo sklenici sušenek. Tyto dvě krabice spolupracují stejným způsobem jako rezervní krabice.
Poslední pole je prioritní váha. Jak bylo uvedeno, je to relativní. Každý virtuální počítač nastavený na 100 (výchozí) má stejný pull s plánovačem, ale všechny jsou pod všemi virtuálními počítači, které mají 200, a nad všemi virtuálními počítači, které mají 50, a tak dále. Pokud se chystáte šťourat, váha je bezpečnější, než si pohrávat s rezervami, protože nikdy nemůžete zabránit spuštění virtuálního počítače změnou relativních vah. Váha znamená, že když spousta virtuálních počítačů předloží vlákna plánovači vláken hypervisoru najednou, na prvním místě jsou virtuální počítače s vyšší váhou.
Hyper-Threading umožňuje jednomu jádru provozovat dvě vlákna najednou – tak nějak. Jádro může současně aktivně spouštět pouze jedno z vláken, ale pokud se toto vlákno zasekne během čekání na externí zdroj, jádro provozuje druhé vlákno. Podrobnější vysvětlení si můžete přečíst níže v sekci komentářů od přispěvatele Jordana. AMD nedávno přidalo podobnou technologii.
Abychom zabili jednu zásadní mylnou představu: Hyper-Threading nezdvojnásobuje výkon jádra. Syntetické benchmarky ukazují 25% zlepšení. Realističtější měření ukazují zvýšení blíže k 10 %. 8jádrový systém Hyper-Threaded nefunguje tak dobře jako 16jádrový systém bez Hyper-Threaded. Může fungovat téměř stejně dobře jako 9jádrový systém.
S takzvaným „klasickým“ plánovačem umístí Hyper-V vlákna na další dostupné jádro, jak je popsáno výše. Díky základnímu plánovači, který byl představen v Hyper-V 2016, Hyper-V nyní zabraňuje vláknům vlastněným různými virtuálními stroji běžet vedle sebe na stejném jádru. Bude však i nadále předjímat vlákna jednoho virtuálního stroje ve prospěch jiných. Máme článek, který se zabývá základním plánovačem.
Vím, že je to spousta informací. Většina lidí sem přichází, aby věděla, kolik vCPU přiřadit virtuálnímu počítači nebo kolik celkem vCPU spustit na jednom systému.
Osobně každému virtuálnímu počítači přiřazuji pro začátek 2 vCPU. To mu dává alespoň dvě místa pro spouštění vláken, což mu dává odezvu. Na dvouprocesorovém systému také zajišťuje, že virtuální počítač je automaticky přítomen na obou uzlech NUMA. Nepřiřazuji více vCPU virtuálnímu počítači, dokud nevím, že to potřebuje (nebo to požaduje dodavatel aplikace).
Pokud jde o poměr vCPU k pCPU, funguje to většinou stejným způsobem. Neexistuje žádný vzorec nebo magické znalosti, které byste mohli jednoduše aplikovat. Pokud plánujete virtualizovat stávající pracovní zátěže, změřte jejich aktuální využití CPU a sečtěte je; který vám řekne, co potřebujete vědět. Pomoci vám může sada nástrojů pro hodnocení a plánování společnosti Microsoft. V opačném případě jednoduše přidáte zdroje a sledujete využití. Pokud váš hardware nezvládá vaši pracovní zátěž, musíte jej škálovat.
PREV: Použití OAuth 2.0 pro aplikace Server to Server | Google Identity
NEXT: Ověření pomocí backend serveru | Přihlášení Google pro webové stránky