Vytvoření vzorce pro automatické škálování výpočetních uzlů ve fondu Batch
Azure Batch může automaticky škálovat fondy na základě vámi definovaných parametrů, což vám ušetří čas a peníze. S automatickým škálováním služba Batch dynamicky přidává uzly do fondu, protože požadavky na úkoly se zvyšují a odebírají výpočetní uzly s tím, jak se požadavky na úkoly snižují.
Pokud chcete povolit automatické škálování ve fondu výpočetních uzlů, přidružíte fond ke vzorci automatického škálování, který definujete. Služba Batch používá vzorec automatického škálování k určení, kolik uzlů je potřeba ke spuštění úlohy. Těmito uzly můžou být vyhrazené uzly nebo spotové uzly Azure. Batch pravidelně kontroluje data metrik služby a používá je k úpravě počtu uzlů ve fondu na základě vzorce a v intervalu, který definujete.
Automatické škálování můžete povolit při vytváření fondu nebo ho použít u existujícího fondu. Služba Batch umožňuje vyhodnotit vzorce před jejich přiřazením do fondů a monitorovat stav spuštění automatického škálování. Jakmile nakonfigurujete fond s automatickým škálováním, můžete později provést změny vzorce.
Důležité
Při vytváření účtu Batch můžete určit režim přidělování fondů, který určuje, jestli se fondy přidělují v předplatném služby Batch (výchozí) nebo v předplatném uživatele. Pokud jste účet Batch vytvořili s výchozí konfigurací služby Batch, je váš účet omezený na maximální počet jader, která se dají použít ke zpracování. Služba Batch škáluje výpočetní uzly pouze na tento limit jádra. Z tohoto důvodu nemusí služba Batch dosáhnout cílového počtu výpočetních uzlů určených vzorcem automatického škálování. Informace o tom, jak zobrazit a zvýšit kvóty účtu, najdete v tématu Kvóty a omezení služby Azure Batch.
Pokud jste účet vytvořili v režimu předplatného uživatele, pak sdílené složky vašeho účtu v základní kvótě předplatného. Další informace najdete v tématu Omezení virtuálních počítačů v tématu Limity, kvóty a omezení předplatného a služeb Azure.
Automatické škálování vzorců
Vzorec automatického škálování je řetězcová hodnota, kterou definujete, která obsahuje jeden nebo více příkazů. Vzorec automatického škálování je přiřazený k elementu AutoScaleFormula fondu (Batch REST) nebo Vlastnosti CloudPool.AutoScaleFormula (Batch .NET). Služba Batch používá vzorec k určení cílového počtu výpočetních uzlů ve fondu pro další interval zpracování. Řetězec vzorce nesmí překročit 8 kB, může obsahovat až 100 příkazů oddělených středníky a může obsahovat konce řádků a komentáře.
Vzorce automatického škálování si můžete představit jako jazyk automatického škálování služby Batch. Příkazy vzorců jsou výrazy ve volném formátu, které můžou obsahovat obě proměnné definované službou Service, které jsou definované službou Batch, a uživatelem definované proměnné. Vzorce můžou s těmito hodnotami provádět různé operace pomocí předdefinovaných typů, operátorů a funkcí. Například příkaz může mít následující podobu:
$myNewVariable = function($ServiceDefinedVariable, $myCustomVariable);
Vzorce obvykle obsahují více příkazů, které provádějí operace s hodnotami získanými v předchozích příkazech. Napřed získáte hodnotu pro variable1
a pak ji předejte funkci, která se má naplnit variable2
:
$variable1 = function1($ServiceDefinedVariable);
$variable2 = function2($OtherServiceDefinedVariable, $variable1);
Do vzorce automatického škálování zahrňte tyto příkazy, které dorazí na cílový počet výpočetních uzlů. Vyhrazené uzly a spotové uzly mají vlastní nastavení cíle. Vzorec automatického škálování může obsahovat cílovou hodnotu pro vyhrazené uzly, cílovou hodnotu spotových uzlů nebo obojí.
Cílový počet uzlů může být vyšší, nižší nebo stejný jako aktuální počet uzlů daného typu ve fondu. Služba Batch vyhodnocuje vzorec automatického škálování fondu v konkrétních intervalech automatického škálování. Batch upraví cílový počet každého typu uzlu ve fondu na číslo, které vzorec automatického škálování určuje v době vyhodnocení.
Ukázkové vzorce automatického škálování
Následující příklady ukazují dva vzorce automatického škálování, které je možné upravit tak, aby fungovaly ve většině scénářů. Proměnné startingNumberOfVMs
a maxNumberofVMs
v ukázkových vzorcích se dají upravit podle vašich potřeb.
Čekající úkoly
Pomocí tohoto vzorce automatického škálování se fond zpočátku vytvoří s jedním virtuálním počítačem. Metrika $PendingTasks
definuje počet spuštěných nebo zařazených úkolů do fronty. Vzorec najde průměrný počet čekajících úkolů za posledních 180 sekund a nastaví proměnnou $TargetDedicatedNodes
odpovídajícím způsobem. Vzorec zajistí, že cílový počet vyhrazených uzlů nikdy nepřekročí 25 virtuálních počítačů. Při odeslání nových úkolů se fond automaticky rozrůstá. Po dokončení úkolů se virtuální počítače uvolní a vzorec automatického škálování fond zmenší.
Tento vzorec škáluje vyhrazené uzly, ale můžete je upravit tak, aby se použily i pro škálování spotových uzlů.
startingNumberOfVMs = 1;
maxNumberofVMs = 25;
pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second);
pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second));
$TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);
$NodeDeallocationOption = taskcompletion;
Důležité
Služba Batch má v současné době omezení řešení čekajících úkolů. Když se úkol přidá do úlohy, přidá se také do interní fronty používané službou Batch pro plánování. Pokud je úloha odstraněna dříve, než je možné ji naplánovat, může úloha trvat v rámci fronty, což způsobí, že se stále počítá v $PendingTasks
. Tato odstraněná úloha se nakonec vymaže z fronty, když služba Batch získá možnost vyžádat úkoly z fronty a naplánovat tak nečinné uzly ve fondu Batch.
Předem připravené uzly
Tento příklad vytvoří fond, který začíná 25 spotovými uzly. Pokaždé, když je spotový uzel zrušený, nahradí se vyhrazeným uzlem. Stejně jako v prvním příkladu maxNumberofVMs
brání proměnná fondu překročení 25 virtuálních počítačů. Tento příklad je užitečný pro využívání spotových virtuálních počítačů a zároveň zajišťuje, že po celou dobu životnosti fondu dojde pouze k pevnému počtu preempcí.
maxNumberofVMs = 25;
$TargetDedicatedNodes = min(maxNumberofVMs, $PreemptedNodeCount.GetSample(180 * TimeInterval_Second));
$TargetLowPriorityNodes = min(maxNumberofVMs , maxNumberofVMs - $TargetDedicatedNodes);
$NodeDeallocationOption = taskcompletion;
Další informace o vytváření vzorců automatického škálování a další ukázkové vzorce automatického škálování najdete dále v tomto článku.
Proměnné
Ve vzorcích automatického škálování můžete použít proměnné definované službou i uživatelem .
Proměnné definované službou jsou integrované do služby Batch. Některé proměnné definované službou jsou pro čtení i zápis a některé jsou jen pro čtení.
Uživatelem definované proměnné jsou proměnné, které definujete. V předchozím příkladu $TargetDedicatedNodes
a $PendingTasks
jsou proměnné definované službou, zatímco startingNumberOfVMs
a maxNumberofVMs
jsou uživatelem definované proměnné.
Poznámka:
Proměnné definované službou jsou vždy před znakem dolaru ($). U uživatelem definovaných proměnných je znak dolaru volitelný.
Následující tabulky zobrazují proměnné jen pro čtení a čtení definované službou Batch.
Proměnné definované službou pro čtení i zápis
Můžete získat a nastavit hodnoty těchto proměnných definovaných službou pro správu počtu výpočetních uzlů ve fondu.
Poznámka:
Proměnnou $TargetDedicatedNodes
lze také zadat pomocí aliasu $TargetDedicated
. Podobně lze proměnnou $TargetLowPriorityNodes
zadat pomocí aliasu $TargetLowPriority
. Pokud vzorec nastaví plně pojmenovanou proměnnou i její alias, bude mít přednost hodnota přiřazená plně pojmenované proměnné.
Proměnné definované službou jen pro čtení
Můžete získat hodnotu těchto proměnných definovaných službou a provést úpravy založené na metrikách ze služby Batch.
Důležité
Úkoly uvolnění úloh nejsou aktuálně zahrnuty do proměnných, které poskytují počty úkolů, například $ActiveTasks
a $PendingTasks
. V závislosti na vzorci automatického škálování to může vést k odebrání uzlů bez uzlů, které by mohly spouštět úlohy uvolnění úloh.
Tip
Tyto proměnné definované službou jen pro čtení jsou objekty , které poskytují různé metody pro přístup k datům přidruženým k jednotlivým objektům. Další informace naleznete v části Získání ukázkových dat dále v tomto článku.
Proměnná | Popis |
---|---|
$CPUPercent | Průměrné procento využití procesoru |
$ActiveTasks | Počet úkolů, které jsou připravené ke spuštění, ale zatím se nespouštějí. To zahrnuje všechny úkoly, které jsou v aktivním stavu a jejichž závislosti byly splněny. Všechny úkoly, které jsou v aktivním stavu, ale jejichž závislosti nebyly splněny, jsou vyloučeny z počtu $ActiveTasks . Pro úlohu $ActiveTasks s více instancemi zahrnuje počet instancí nastavených pro úlohu. |
$RunningTasks | Počet úkolů ve spuštěném stavu. |
$PendingTasks | Součet a $ActiveTasks $RunningTasks . |
$SucceededTasks | Počet úkolů, které byly úspěšně dokončeny. |
$FailedTasks | Počet úkolů, které selhaly. |
$TaskSlotsPerNode | Počet slotů úloh, které lze použít ke spouštění souběžných úloh na jednom výpočetním uzlu ve fondu. |
$CurrentDedicatedNodes | Aktuální počet vyhrazených výpočetních uzlů |
$CurrentLowPriorityNodes | Aktuální počet spotovýchvýpočetních |
$UsableNodeCount | Počet využitelných výpočetních uzlů. |
$PreemptedNodeCount | Početuzlůch |
Poznámka:
Používá se $RunningTasks
při škálování na základě počtu úloh spuštěných v určitém časovém okamžiku a $ActiveTasks
při škálování na základě počtu úkolů, které jsou zařazeny do fronty ke spuštění.
Typy
Vzorce automatického škálování podporují následující typy:
- double
- doubleVec
- doubleVecList
- string
- timestamp--a složená struktura, která obsahuje následující členy:
- za rok
- měsíc (1–12)
- den (1-31)
- pracovní den (ve formátu čísla, například 1 pro pondělí)
- hodina (ve formátu čísla 24 hodin, například 13: 12:00)
- minuta (00–59)
- druhé (00–59)
- timeinterval
- TimeInterval_Zero
- TimeInterval_100ns
- TimeInterval_Microsecond
- TimeInterval_Millisecond
- TimeInterval_Second
- TimeInterval_Minute
- TimeInterval_Hour
- TimeInterval_Day
- TimeInterval_Week
- TimeInterval_Year
Operace
Tyto operace jsou povolené u typů uvedených v předchozí části.
Operace | Podporované operátory | Typ výsledku |
---|---|---|
double – operátor double | +, -, *, / | double |
double operator timeinterval | * | timeinterval |
doubleVec – operátor double | +, -, *, / | doubleVec |
doubleVec – operátor doubleVec | +, -, *, / | doubleVec |
timeinterval – operátor double | *, / | timeinterval |
timeinterval – operátor timeinterval | +, - | timeinterval |
časové razítko časového intervalu operátoru timeinterval | + | časové razítko |
timeinterval – operátor časového razítka | + | časové razítko |
časové razítko operátoru časového razítka | - | timeinterval |
operátor double | -, ! | double |
timeinterval – operátor | - | timeinterval |
double – operátor double | <, <=, ==, =, >>, != | double |
Řetězec řetězcového operátoru | <, <=, ==, =, >>, != | double |
časové razítko operátoru časového razítka | <, <=, ==, =, >>, != | double |
timeinterval – operátor timeinterval | <, <=, ==, =, >>, != | double |
double – operátor double | &&, || | double |
Testování double pomocí ternárního operátoru (double ? statement1 : statement2
), má za následek nenulovou hodnotu true a nulu jako false.
Funkce
Tyto předdefinované funkce můžete použít při definování vzorce automatického škálování.
Function | Návratový typ | Popis |
---|---|---|
avg(doubleVecList) | double | Vrátí průměrnou hodnotu pro všechny hodnoty v doubleVecList. |
ceil(double) | double | Vrátí nejmenší celočíselnou hodnotu, která není menší než hodnota double. |
ceil(doubleVecList) | doubleVec | Vrátí komponentu ceil doubleVecList. |
floor(double) | double | Vrátí největší celočíselnou hodnotu, která není větší než hodnota double. |
floor(doubleVecList) | doubleVec | Vrátí komponentu floor doubleVecList. |
len(doubleVecList) | double | Vrátí délku vektoru vytvořeného z doubleVecList. |
lg(double) | double | Vrátí základ protokolu 2 dvojité hodnoty. |
lg(doubleVecList) | doubleVec | Vrátí komponentu lg doubleVecList. |
ln(double) | double | Vrátí přirozený protokol dvojité hodnoty. |
ln(doubleVecList) | doubleVec | Vrátí komponentu ln doubleVecList. |
log(double) | double | Vrátí základ protokolu 10 dvojité hodnoty. |
log(doubleVecList) | doubleVec | Vrátí komponentu log doubleVecList. |
max(doubleVecList) | double | Vrátí maximální hodnotu v doubleVecList. |
min(doubleVecList) | double | Vrátí minimální hodnotu v doubleVecList. |
norm(doubleVecList) | double | Vrátí dvou normu vektoru vytvořeného z doubleVecList. |
percentil(doubleVec v; double p) | double | Vrátí percentilový prvek vektoru v. |
rand() | double | Vrátí náhodnou hodnotu mezi 0,0 a 1,0. |
range(doubleVecList) | double | Vrátí rozdíl mezi minimálními a maximálními hodnotami v doubleVecList. |
round(double) | double | Vrátí nejbližší celočíselnou hodnotu k dvojité hodnotě (ve formátu s plovoucí desetinou čárkou), která zaokrouhlí polovinu případů směrem od nuly. |
round(doubleVecList) | doubleVec | Vrátí komponentu round doubleVecList. |
std(doubleVecList) | double | Vrátí směrodatnou odchylku hodnot v doubleVecListu. |
stop() | Zastaví vyhodnocení výrazu automatického škálování. | |
sum(doubleVecList) | double | Vrátí součet všech součástí doubleVecList. |
time(string dateTime="") | časové razítko | Vrátí časové razítko aktuálního času, pokud nejsou předány žádné parametry, nebo časové razítko řetězce dateTime, pokud je předáno. Podporované formáty dateTime jsou W3C-DTF a RFC 1123. |
val(doubleVec v, double i) | double | Vrátí hodnotu prvku, který je na místě i ve vektoru v, s počátečním indexem nuly. |
Některé funkce popsané v předchozí tabulce můžou jako argument přijmout seznam. Seznam oddělený čárkami je libovolná kombinace dvojité a dvojitéhovecu. Příklad:
doubleVecList := ( (double | doubleVec)+(, (double | doubleVec) )* )?
Hodnota doubleVecList je před vyhodnocením převedena na jeden doubleVec . Pokud je v = [1,2,3]
například volání avg(v)
ekvivalentní volání avg(1,2,3)
. Volání avg(v, 7)
je ekvivalentní volání avg(1,2,3,7)
.
Metriky
Metriky prostředků i úkolů můžete použít při definování vzorce. Cílový počet vyhrazenýchuzlůch Další informace o jednotlivých metrikách najdete v části Proměnné.
Metrický | Popis |
---|---|
Prostředek | Metriky prostředků jsou založené na procesoru, šířce pásma, využití paměti výpočetních uzlů a počtu uzlů. Tyto proměnné definované službou jsou užitečné pro provádění úprav na základě počtu uzlů: - $TargetDedicatedNodes - $TargetLowPriorityNodes - $CurrentDedicatedNodes - $CurrentLowPriorityNodes - $PreemptedNodeCount - $UsableNodeCount Tyto proměnné definované službou jsou užitečné pro provádění úprav na základě využití prostředků uzlu: - $CPUPercent |
Úloha | Metriky úkolů jsou založeny na stavu úkolů, jako jsou aktivní, čekající a dokončené. Následující proměnné definované službou jsou užitečné pro úpravy velikosti fondu na základě metrik úloh: - $ActiveTasks - $RunningTasks - $PendingTasks - $SucceededTasks - $FailedTasks |
Získání ukázkových dat
Základním provozem vzorce automatického škálování je získání dat metrik úkolů a prostředků (ukázek) a následná úprava velikosti fondu na základě těchto dat. Proto je důležité jasně pochopit, jak vzorce automatického škálování pracují s ukázkami.
Metody
Vzorce automatického škálování fungují na vzorcích dat metrik poskytovaných službou Batch. Vzorec zvětší nebo zmenší výpočetní uzly fondu na základě hodnot, které získá. Proměnné definované službou jsou objekty, které poskytují metody pro přístup k datům přidruženým k danému objektu. Například následující výraz ukazuje požadavek na získání posledních pěti minut využití procesoru:
$CPUPercent.GetSample(TimeInterval_Minute * 5)
Následující metody lze použít k získání ukázkových dat o proměnných definovaných službou.
metoda | Popis |
---|---|
GetSample() | Metoda GetSample() vrátí vektor vzorků dat.Ukázka je 30 sekund dat metrik. Jinými slovy, vzorky se získávají každých 30 sekund. Jak je ale uvedeno níže, mezi tím, kdy se shromáždí ukázka, a kdy je pro vzorec k dispozici, je zpoždění. Proto nemusí být všechny vzorky pro dané časové období dostupné pro vyhodnocení vzorcem. - doubleVec GetSample(double count) : Určuje počet vzorků, které se mají získat z nejnovějších vzorků, které byly shromážděny. GetSample(1) vrátí poslední dostupnou ukázku. U metrik, jako je $CPUPercent ale , by se nemělo používat, protože není možné zjistit, GetSample(1) kdy se ukázka shromáždila. Může to být nedávné nebo kvůli systémovým problémům může být mnohem starší. V takovýchpřípadechch- doubleVec GetSample((timestamp or timeinterval) startTime [, double samplePercent]) : Určuje časový rámec pro shromažďování ukázkových dat. Volitelně také určuje procento vzorků, které musí být k dispozici v požadovaném časovém rámci. Pokud jsou například v historii přítomny CPUPercent všechny vzorky za posledních 10 minut, $CPUPercent.GetSample(TimeInterval_Minute * 10) vrátí se 20 vzorků. Pokud poslední minuta historie nebyla k dispozici, vrátí se pouze 18 vzorků. V takovém případě $CPUPercent.GetSample(TimeInterval_Minute * 10, 95) by selžou, protože je k dispozici pouze 90 procent vzorků, ale $CPUPercent.GetSample(TimeInterval_Minute * 10, 80) bylo by úspěšné.- doubleVec GetSample((timestamp or timeinterval) startTime, (timestamp or timeinterval) endTime [, double samplePercent]) : Určuje časový rámec pro shromažďování dat s počátečním i koncovým časem. Jak už bylo zmíněno výše, mezi shromažďováním vzorku a jeho zpřístupněním pro vzorec dochází ke zpoždění. Při použití GetSample metody zvažte toto zpoždění. Viz GetSamplePercent níže. |
GetSamplePeriod() | Vrátí období vzorků odebraných v historické sadě ukázkových dat. |
Count() | Vrátí celkový počet vzorků v historii metrik. |
HistoryBeginTime() | Vrátí časové razítko nejstaršího dostupného vzorku dat pro metriku. |
GetSamplePercent() | Vrátí procento vzorků, které jsou k dispozici pro daný časový interval. Například doubleVec GetSamplePercent( (timestamp or timeinterval) startTime [, (timestamp or timeinterval) endTime] ) . Vzhledem k tomu, že GetSample metoda selže, pokud je procento vrácených vzorků menší než samplePercent zadané, můžete metodu GetSamplePercent použít k první kontrole. Potom můžete provést alternativní akci, pokud nejsou k dispozici dostatečné vzorky, aniž byste zastavili automatické vyhodnocení škálování. |
Ukázky
Služba Batch pravidelně odebírá ukázky metrik úkolů a prostředků a zpřístupňuje je vzorcům automatického škálování. Tyto vzorky se zaznamenávají každých 30 sekund službou Batch. Mezi zaznamenáním těchto vzorků a jejich zpřístupněním (a čtením) vzorců automatického škálování ale obvykle dochází ke zpoždění. Vzorky navíc nemusí být zaznamenány pro určitý interval kvůli faktorům, jako jsou problémy se sítí nebo jinou infrastrukturou.
Procento vzorku
Když samplePercent
je metoda předána GetSample()
nebo GetSamplePercent()
je volána metoda, procento odkazuje na porovnání mezi celkovým možným počtem vzorků zaznamenaných službou Batch a počtem vzorků, které jsou k dispozici pro vzorec automatického škálování.
Podívejme se na příklad 10minutového časového rozsahu. Vzhledem k tomu, že vzorky se zaznamenávají každých 30 sekund během tohoto 10minutového časového rozsahu, bude maximální celkový počet vzorků zaznamenaných službou Batch 20 vzorků (2 za minutu). Vzhledem k vlastní latenci mechanismu generování sestav a dalším problémům v Rámci Azure ale může existovat jenom 15 ukázek, které jsou dostupné pro vzorec automatického škálování pro čtení. Například pro toto 10minutové období může být pro vzorec k dispozici pouze 75 procent celkového počtu zaznamenaných vzorků.
GetSample() a ukázkové oblasti
Vzorce automatického škálování se zvětší a zmenší fondy přidáním nebo odebráním uzlů. Vzhledem k tomu, že uzly stojí peníze, ujistěte se, že vzorce používají inteligentní metodu analýzy založenou na dostatečných datech. Ve vzorcích se doporučuje použít analýzu trendového typu. Tento typ roste a zmenšuje fondy na základě řady shromážděných vzorků.
Uděláte to tak, že použijete GetSample(interval look-back start, interval look-back end)
k vrácení vektoru vzorků:
$runningTasksSample = $RunningTasks.GetSample(1 * TimeInterval_Minute, 6 * TimeInterval_Minute);
Když služba Batch vyhodnotí výše uvedenou čáru, vrátí jako vektor hodnot oblast vzorků. Příklad:
$runningTasksSample=[1,1,1,1,1,1,1,1,1,1];
Po shromáždění vektoru vzorků pak můžete použít funkce jako min()
, max()
a avg()
odvodit smysluplné hodnoty z shromážděného rozsahu.
Pokud chcete postupovat opatrně, můžete vynutit, aby vyhodnocení vzorce selhalo, pokud je pro určité časové období k dispozici méně než určité procento vzorku. Když vynutíte, aby vyhodnocení vzorce selhalo, dá služba Batch pokyn, aby zastavila další vyhodnocení vzorce, pokud zadané procento vzorků není k dispozici. V takovém případě se velikost fondu nezmění. Chcete-li zadat požadované procento vzorků pro úspěšné vyhodnocení, zadejte ho jako třetí parametr pro GetSample()
. Tady je zadaný požadavek na 75 procent vzorků:
$runningTasksSample = $RunningTasks.GetSample(60 * TimeInterval_Second, 120 * TimeInterval_Second, 75);
Vzhledem k tomu, že u ukázkové dostupnosti může docházet ke zpoždění, měli byste vždy zadat časový rozsah s časem zahájení zpětného vyhledávání, který je starší než jedna minuta. Rozšíření vzorků v systému trvá přibližně jednu minutu, takže vzorky v rozsahu (0 * TimeInterval_Second, 60 * TimeInterval_Second)
nemusí být dostupné. Znovu můžete použít parametr procenta vynucení GetSample()
konkrétního požadavku na procento vzorku.
Důležité
Důrazně doporučujeme, abyste se nemuseli spoléhat jenom na GetSample(1)
vzorce automatického škálování. Je to proto, že GetSample(1)
v podstatě říká službě Batch: "Dejte mi poslední ukázku, kterou jste měli, bez ohledu na to, jak dlouho jste ji načetli." Vzhledem k tomu, že se jedná pouze o jediný vzorek a může se jednat o starší ukázku, nemusí představovat větší obrázek o nedávném stavu úkolu nebo zdroje. Pokud použijete GetSample(1)
, ujistěte se, že je součástí většího příkazu, a ne jediný datový bod, na který vzorec spoléhá.
Zápis vzorce automatického škálování
Vzorec automatického škálování vytvoříte tak, že vytvoříte příkazy, které používají výše uvedené komponenty, a pak tyto příkazy zkombinujete do úplného vzorce. V této části vytvoříte ukázkový vzorec automatického škálování, který může provádět rozhodnutí o skutečném škálování a provádět úpravy.
Nejprve pojďme definovat požadavky na nový vzorec automatického škálování. Vzorec by měl:
- Pokud je vysoké využití procesoru, zvyšte cílový počet vyhrazených výpočetních uzlů ve fondu.
- Snižte cílový počet vyhrazených výpočetních uzlů ve fondu, když je nízké využití procesoru.
- Vždy omezte maximální počet vyhrazených uzlů na 400.
- Při snížení počtu uzlů neodebíjejte uzly, které spouští úlohy; v případě potřeby počkejte, než se úkoly dokončí, než odeberete uzly.
První příkaz ve vzorci zvyšuje počet uzlů během vysokého využití procesoru. Definujete příkaz, který naplní uživatelsky definovanou proměnnou ($totalDedicatedNodes
) hodnotou, která je 110 procent aktuálního cílového počtu vyhrazených uzlů, ale pouze v případě, že minimální průměrné využití procesoru během posledních 10 minut překročilo 70 procent. V opačném případě použije hodnotu pro aktuální počet vyhrazených uzlů.
$totalDedicatedNodes =
(min($CPUPercent.GetSample(TimeInterval_Minute * 10)) > 0.7) ?
($CurrentDedicatedNodes * 1.1) : $CurrentDedicatedNodes;
Pokud chcete snížit počet vyhrazených uzlů během nízkého využití procesoru, další příkaz ve vzorci nastaví stejnou proměnnou $totalDedicatedNodes
na 90 procent aktuálního cílového počtu vyhrazených uzlů, pokud průměrné využití procesoru za posledních 60 minut bylo nižší než 20 procent. V opačném případě použije aktuální hodnotu vyplněnou $totalDedicatedNodes
v příkazu výše.
$totalDedicatedNodes =
(avg($CPUPercent.GetSample(TimeInterval_Minute * 60)) < 0.2) ?
($CurrentDedicatedNodes * 0.9) : $totalDedicatedNodes;
Teď omezte cílový počet vyhrazených výpočetních uzlů na maximálně 400.
$TargetDedicatedNodes = min(400, $totalDedicatedNodes);
Nakonec se ujistěte, že se uzly neodeberou, dokud jejich úkoly nedokončí.
$NodeDeallocationOption = taskcompletion;
Tady je úplný vzorec:
$totalDedicatedNodes =
(min($CPUPercent.GetSample(TimeInterval_Minute * 10)) > 0.7) ?
($CurrentDedicatedNodes * 1.1) : $CurrentDedicatedNodes;
$totalDedicatedNodes =
(avg($CPUPercent.GetSample(TimeInterval_Minute * 60)) < 0.2) ?
($CurrentDedicatedNodes * 0.9) : $totalDedicatedNodes;
$TargetDedicatedNodes = min(400, $totalDedicatedNodes);
$NodeDeallocationOption = taskcompletion;
Poznámka:
Pokud zvolíte, můžete do řetězců vzorců zahrnout komentáře i konce řádků. Mějte také na paměti, že chybějící středníky můžou vést k chybám vyhodnocení.
Interval automatického škálování
Ve výchozím nastavení služba Batch upraví velikost fondu podle vzorce automatického škálování každých 15 minut. Tento interval lze konfigurovat pomocí následujících vlastností fondu:
- CloudPool.AutoScaleEvaluationInterval (Batch .NET)
- autoScaleEvaluationInterval (REST API)
Minimální interval je pět minut a maximum je 168 hodin. Pokud je zadaný interval mimo tento rozsah, služba Batch vrátí chybu Chybný požadavek (400).
Poznámka:
Automatické škálování v současné době neodpovídá na změny za méně než minutu, ale je určené k postupné úpravě velikosti fondu při spuštění úlohy.
Vytvoření fondu s povoleným automatickým škálováním pomocí sad SDK služby Batch
Automatické škálování fondu je možné nakonfigurovat pomocí libovolné sady SDK služby Batch, rutin PowerShellu služby Batch REST API a rozhraní příkazového řádku služby Batch. V této části vidíte příklady pro .NET i Python.
.NET
Pokud chcete vytvořit fond s povoleným automatickým škálováním v .NET, postupujte takto:
- Vytvořte fond pomocí BatchClient.PoolOperations.CreatePool.
- Nastavte Vlastnost CloudPool.AutoScaleEnabled na hodnotu true.
- Nastavte vlastnost CloudPool.AutoScaleFormula vzorcem automatického škálování.
- (Volitelné) Nastavte vlastnost CloudPool.AutoScaleEvaluationInterval (výchozí hodnota je 15 minut).
- Potvrďte fond pomocí CloudPool.Commit nebo CommitAsync.
Následující příklad vytvoří fond s povoleným automatickým škálováním v .NET. Vzorec automatického škálování fondu nastaví cílový počet vyhrazených uzlů na 5 v pondělí a na 1 každý druhý den v týdnu. Interval automatického škálování je nastavený na 30 minut. V tomto a dalších fragmentech kódu jazyka C# v tomto článku myBatchClient
je správně inicializovaná instance třídy BatchClient .
CloudPool pool = myBatchClient.PoolOperations.CreatePool(
poolId: "mypool",
virtualMachineSize: "standard_d1_v2",
VirtualMachineConfiguration: new VirtualMachineConfiguration(
imageReference: new ImageReference(
publisher: "MicrosoftWindowsServer",
offer: "WindowsServer",
sku: "2019-datacenter-core",
version: "latest"),
nodeAgentSkuId: "batch.node.windows amd64");
pool.AutoScaleEnabled = true;
pool.AutoScaleFormula = "$TargetDedicatedNodes = (time().weekday == 1 ? 5:1);";
pool.AutoScaleEvaluationInterval = TimeSpan.FromMinutes(30);
await pool.CommitAsync();
Důležité
Při vytváření fondu s povoleným automatickým škálováním nezadávejte parametr targetDedicatedNodes ani parametr targetLowPriorityNodes při volání CreatePool
. Místo toho zadejte vlastnosti AutoScaleEnabled
a AutoScaleFormula
vlastnosti ve fondu. Hodnoty těchto vlastností určují cílový počet jednotlivých typů uzlů.
Pokud chcete ručně změnit velikost fondu s povoleným automatickým škálováním (například pomocí BatchClient.PoolOperations.ResizePoolAsync), musíte nejprve zakázat automatické škálování ve fondu a pak změnit jeho velikost.
Tip
Další příklady použití sady .NET SDK najdete v úložišti Rychlý start služby Batch .NET na GitHubu.
Python
Vytvoření fondu s povoleným automatickým škálováním pomocí sady Python SDK:
- Vytvořte fond a zadejte jeho konfiguraci.
- Přidejte fond do klienta služby.
- Povolte automatické škálování ve fondu pomocí vzorce, který napíšete.
Následující příklad ukazuje tyto kroky.
# Create a pool; specify configuration
new_pool = batch.models.PoolAddParameter(
id="autoscale-enabled-pool",
virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
image_reference=batchmodels.ImageReference(
publisher="Canonical",
offer="UbuntuServer",
sku="20.04-LTS",
version="latest"
),
node_agent_sku_id="batch.node.ubuntu 20.04"),
vm_size="STANDARD_D1_v2",
target_dedicated_nodes=0,
target_low_priority_nodes=0
)
batch_service_client.pool.add(new_pool) # Add the pool to the service client
formula = """$curTime = time();
$workHours = $curTime.hour >= 8 && $curTime.hour < 18;
$isWeekday = $curTime.weekday >= 1 && $curTime.weekday <= 5;
$isWorkingWeekdayHour = $workHours && $isWeekday;
$TargetDedicated = $isWorkingWeekdayHour ? 20:10;""";
# Enable autoscale; specify the formula
response = batch_service_client.pool.enable_auto_scale(pool_id, auto_scale_formula=formula,
auto_scale_evaluation_interval=datetime.timedelta(minutes=10),
pool_enable_auto_scale_options=None,
custom_headers=None, raw=False)
Tip
Další příklady použití sady Python SDK najdete v úložišti Rychlý start pro Batch Python na GitHubu.
Povolení automatického škálování ve stávajícím fondu
Každá sada Batch SDK poskytuje způsob, jak povolit automatické škálování. Příklad:
- BatchClient.PoolOperations.EnableAutoScaleAsync (Batch .NET)
- Povolení automatického škálování ve fondu (REST API)
Pokud povolíte automatické škálování ve stávajícím fondu, mějte na paměti:
- Pokud je ve fondu aktuálně zakázané automatické škálování, musíte při vydání požadavku zadat platný vzorec automatického škálování. Volitelně můžete zadat interval automatického škálování. Pokud nezadáte interval, použije se výchozí hodnota 15 minut.
- Pokud je ve fondu aktuálně povolené automatické škálování, můžete zadat nový vzorec, nový interval nebo obojí. Musíte zadat alespoň jednu z těchto vlastností.
- Pokud zadáte nový interval automatického škálování, stávající plán se zastaví a spustí se nový plán. Počáteční čas nového plánu je čas, kdy byla vydána žádost o povolení automatického škálování.
- Pokud vynecháte vzorec automatického škálování nebo interval, služba Batch bude dál používat aktuální hodnotu tohoto nastavení.
Poznámka:
Pokud jste zadali hodnoty pro targetDedicatedNodes nebo targetLowPriorityNodes parametr CreatePool
metody při vytváření fondu v .NET nebo pro srovnatelné parametry v jiném jazyce, budou tyto hodnoty ignorovány při vyhodnocení vzorce automatického škálování.
Tento příklad jazyka C# používá knihovnu Batch .NET k povolení automatického škálování ve stávajícím fondu.
// Define the autoscaling formula. This formula sets the target number of nodes
// to 5 on Mondays, and 1 on every other day of the week
string myAutoScaleFormula = "$TargetDedicatedNodes = (time().weekday == 1 ? 5:1);";
// Set the autoscale formula on the existing pool
await myBatchClient.PoolOperations.EnableAutoScaleAsync(
"myexistingpool",
autoscaleFormula: myAutoScaleFormula);
Aktualizace vzorce automatického škálování
Pokud chcete aktualizovat vzorec ve stávajícím fondu s povoleným automatickým škálováním, zavolejte operaci, aby se automatické škálování znovu povolilo pomocí nového vzorce. Pokud je například při spuštění následujícího kódu .NET povolené myexistingpool
automatické škálování, nahradí se jeho vzorec automatického myNewFormula
škálování obsahem .
await myBatchClient.PoolOperations.EnableAutoScaleAsync(
"myexistingpool",
autoscaleFormula: myNewFormula);
Aktualizace intervalu automatického škálování
Pokud chcete aktualizovat interval vyhodnocení automatického škálování existujícího fondu s povoleným automatickým škálováním, zavolejte operaci, aby se automatické škálování znovu povolilo s novým intervalem. Pokud například chcete nastavit interval vyhodnocení automatického škálování na 60 minut pro fond, který už je povolený automatické škálování v .NET:
await myBatchClient.PoolOperations.EnableAutoScaleAsync(
"myexistingpool",
autoscaleEvaluationInterval: TimeSpan.FromMinutes(60));
Vyhodnocení vzorce automatického škálování
Vzorec můžete vyhodnotit před použitím ve fondu. To vám umožní otestovat výsledky vzorce předtím, než ho vložíte do produkčního prostředí.
Než budete moct vyhodnotit vzorec automatického škálování, musíte nejprve povolit automatické škálování ve fondu pomocí platného vzorce, například jednořádkového vzorce $TargetDedicatedNodes = 0
. Pak pomocí jedné z následujících možností vyhodnoťte vzorec, který chcete testovat:
BatchClient.PoolOperations.EvaluateAutoScale nebo EvaluateAutoScaleAsync
Tyto metody Batch .NET vyžadují ID existujícího fondu a řetězec obsahující vzorec automatického škálování k vyhodnocení.
Vyhodnocení vzorce automatického škálování
V tomto požadavku REST API zadejte ID fondu v identifikátoru URI a vzorec automatického škálování v elementu autoScaleFormula textu požadavku. Odpověď operace obsahuje všechny informace o chybách, které můžou souviset se vzorcem.
Následující příklad batch .NET vyhodnotí vzorec automatického škálování. Pokud fond ještě nepoužívá automatické škálování, povolte ho nejprve.
// First obtain a reference to an existing pool
CloudPool pool = await batchClient.PoolOperations.GetPoolAsync("myExistingPool");
// If autoscaling isn't already enabled on the pool, enable it.
// You can't evaluate an autoscale formula on a non-autoscale-enabled pool.
if (pool.AutoScaleEnabled == false)
{
// You need a valid autoscale formula to enable autoscaling on the
// pool. This formula is valid, but won't resize the pool:
await pool.EnableAutoScaleAsync(
autoscaleFormula: "$TargetDedicatedNodes = $CurrentDedicatedNodes;",
autoscaleEvaluationInterval: TimeSpan.FromMinutes(5));
// Batch limits EnableAutoScaleAsync calls to once every 30 seconds.
// Because you want to apply our new autoscale formula below if it
// evaluates successfully, and you *just* enabled autoscaling on
// this pool, pause here to ensure you pass that threshold.
Thread.Sleep(TimeSpan.FromSeconds(31));
// Refresh the properties of the pool so that we've got the
// latest value for AutoScaleEnabled
await pool.RefreshAsync();
}
// You must ensure that autoscaling is enabled on the pool prior to
// evaluating a formula
if (pool.AutoScaleEnabled == true)
{
// The formula to evaluate - adjusts target number of nodes based on
// day of week and time of day
string myFormula = @"
$curTime = time();
$workHours = $curTime.hour >= 8 && $curTime.hour < 18;
$isWeekday = $curTime.weekday >= 1 && $curTime.weekday <= 5;
$isWorkingWeekdayHour = $workHours && $isWeekday;
$TargetDedicatedNodes = $isWorkingWeekdayHour ? 20:10;
";
// Perform the autoscale formula evaluation. Note that this code does not
// actually apply the formula to the pool.
AutoScaleRun eval =
await batchClient.PoolOperations.EvaluateAutoScaleAsync(pool.Id, myFormula);
if (eval.Error == null)
{
// Evaluation success - print the results of the AutoScaleRun.
// This will display the values of each variable as evaluated by the
// autoscale formula.
Console.WriteLine("AutoScaleRun.Results: " +
eval.Results.Replace("$", "\n $"));
// Apply the formula to the pool since it evaluated successfully
await batchClient.PoolOperations.EnableAutoScaleAsync(pool.Id, myFormula);
}
else
{
// Evaluation failed, output the message associated with the error
Console.WriteLine("AutoScaleRun.Error.Message: " +
eval.Error.Message);
}
}
Úspěšné vyhodnocení vzorce zobrazeného v tomto fragmentu kódu vytvoří podobné výsledky jako:
AutoScaleRun.Results:
$TargetDedicatedNodes=10;
$NodeDeallocationOption=requeue;
$curTime=2016-10-13T19:18:47.805Z;
$isWeekday=1;
$isWorkingWeekdayHour=0;
$workHours=0
Získání informací o spuštěních automatického škálování
Doporučujeme pravidelně kontrolovat vyhodnocení vzorce automatického škálování ve službě Batch. Uděláte to tak, že získáte (nebo aktualizujete) odkaz na fond a zkontrolujte vlastnosti posledního spuštění automatického škálování.
Ve službě Batch .NET má vlastnost CloudPool.AutoScaleRun několik vlastností, které poskytují informace o nejnovějším spuštění automatického škálování prováděném ve fondu:
Informace o fondu v rozhraní REST API obsahují nejnovější informace o spuštění automatického škálování ve vlastnosti autoScaleRun.
Následující příklad jazyka C# používá knihovnu Batch .NET k tisku informací o posledním spuštění automatického škálování ve fondu myPool.
await Cloud pool = myBatchClient.PoolOperations.GetPoolAsync("myPool");
Console.WriteLine("Last execution: " + pool.AutoScaleRun.Timestamp);
Console.WriteLine("Result:" + pool.AutoScaleRun.Results.Replace("$", "\n $"));
Console.WriteLine("Error: " + pool.AutoScaleRun.Error);
Ukázkový výstup z předchozího příkladu:
Last execution: 10/14/2016 18:36:43
Result:
$TargetDedicatedNodes=10;
$NodeDeallocationOption=requeue;
$curTime=2016-10-14T18:36:43.282Z;
$isWeekday=1;
$isWorkingWeekdayHour=0;
$workHours=0
Error:
Získání historie spuštění automatického škálování pomocí událostí automatického škálování fondu
Historii automatického škálování můžete také zkontrolovat dotazem PoolAutoScaleEvent. Batch tuto událost vygeneruje, aby zaznamenala každý výskyt vyhodnocení a spuštění vzorce automatického škálování, což může být užitečné při řešení potenciálních problémů.
Ukázková událost pro PoolAutoScaleEvent:
{
"id": "poolId",
"timestamp": "2020-09-21T23:41:36.750Z",
"formula": "...",
"results": "$TargetDedicatedNodes=10;$NodeDeallocationOption=requeue;$curTime=2016-10-14T18:36:43.282Z;$isWeekday=1;$isWorkingWeekdayHour=0;$workHours=0",
"error": {
"code": "",
"message": "",
"values": []
}
}
Příklady vzorců automatického škálování
Podívejme se na několik vzorců, které ukazují různé způsoby, jak upravit množství výpočetních prostředků ve fondu.
Příklad 1: Úprava založená na čase
Předpokládejme, že chcete upravit velikost fondu na základě dne v týdnu a denního času. Tento příklad ukazuje, jak odpovídajícím způsobem zvýšit nebo snížit počet uzlů ve fondu.
Vzorec nejprve získá aktuální čas. Pokud se jedná o pracovní den (1–5) a během pracovní doby (8 do 18:00 do 6:00), je velikost cílového fondu nastavená na 20 uzlů. V opačném případě je nastavená na 10 uzlů.
$curTime = time();
$workHours = $curTime.hour >= 8 && $curTime.hour < 18;
$isWeekday = $curTime.weekday >= 1 && $curTime.weekday <= 5;
$isWorkingWeekdayHour = $workHours && $isWeekday;
$TargetDedicatedNodes = $isWorkingWeekdayHour ? 20:10;
$NodeDeallocationOption = taskcompletion;
$curTime
můžete upravit tak, aby odráželo vaše místní časové pásmo přidáním time()
k produktu TimeZoneInterval_Hour
a posunu UTC. Například použijte $curTime = time() + (-6 * TimeInterval_Hour);
pro horskou letní dobu (MDT). Nezapomeňte, že posun je potřeba upravit na začátku a na konci letního času, pokud je to možné.
Příklad 2: Úprava založená na úkolech
V tomto příkladu jazyka C# se velikost fondu upraví na základě počtu úkolů ve frontě. Komentáře i konce řádků jsou součástí řetězců vzorců.
// Get pending tasks for the past 15 minutes.
$samples = $PendingTasks.GetSamplePercent(TimeInterval_Minute * 15);
// If you have fewer than 70 percent data points, use the last sample point,
// otherwise use the maximum of last sample point and the history average.
$tasks = $samples < 70 ? max(0,$PendingTasks.GetSample(1)) : max( $PendingTasks.GetSample(1), avg($PendingTasks.GetSample(TimeInterval_Minute * 15)));
// If number of pending tasks is not 0, set targetVM to pending tasks, otherwise
// half of current dedicated.
$targetVMs = $tasks > 0? $tasks:max(0, $TargetDedicatedNodes/2);
// The pool size is capped at 20, if target VM value is more than that, set it
// to 20. This value should be adjusted according to your use case.
$TargetDedicatedNodes = max(0, min($targetVMs, 20));
// Set node deallocation mode - let running tasks finish before removing a node
$NodeDeallocationOption = taskcompletion;
Příklad 3: Účtování paralelních úloh
Tento příklad jazyka C# upraví velikost fondu na základě počtu úkolů. Tento vzorec také bere v úvahu hodnotu TaskSlotsPerNode nastavenou pro fond. Tento přístup je užitečný v situacích, kdy bylo ve fondu povolené paralelní provádění úkolů.
// Determine whether 70 percent of the samples have been recorded in the past
// 15 minutes; if not, use last sample
$samples = $ActiveTasks.GetSamplePercent(TimeInterval_Minute * 15);
$tasks = $samples < 70 ? max(0,$ActiveTasks.GetSample(1)) : max( $ActiveTasks.GetSample(1),avg($ActiveTasks.GetSample(TimeInterval_Minute * 15)));
// Set the number of nodes to add to one-fourth the number of active tasks
// (the TaskSlotsPerNode property on this pool is set to 4, adjust
// this number for your use case)
$cores = $TargetDedicatedNodes * 4;
$extraVMs = (($tasks - $cores) + 3) / 4;
$targetVMs = ($TargetDedicatedNodes + $extraVMs);
// Attempt to grow the number of compute nodes to match the number of active
// tasks, with a maximum of 3
$TargetDedicatedNodes = max(0,min($targetVMs,3));
// Keep the nodes active until the tasks finish
$NodeDeallocationOption = taskcompletion;
Příklad 4: Nastavení počáteční velikosti fondu
Tento příklad ukazuje příklad jazyka C# se vzorcem automatického škálování, který nastaví velikost fondu na zadaný počet uzlů pro počáteční časové období. Potom upraví velikost fondu na základě počtu spuštěných a aktivních úloh.
Konkrétně tento vzorec dělá toto:
- Nastaví počáteční velikost fondu na čtyři uzly.
- Neupravuje velikost fondu během prvních 10 minut životního cyklu fondu.
- Po 10 minutách získá maximální hodnotu počtu spuštěných a aktivních úkolů během posledních 60 minut.
- Pokud jsou obě hodnoty 0, což znamená, že za posledních 60 minut nebyly spuštěny nebo aktivní žádné úkoly, je velikost fondu nastavená na 0.
- Pokud je hodnota větší než nula, neprovedou se žádné změny.
string now = DateTime.UtcNow.ToString("r");
string formula = string.Format(@"
$TargetDedicatedNodes = {1};
lifespan = time() - time(""{0}"");
span = TimeInterval_Minute * 60;
startup = TimeInterval_Minute * 10;
ratio = 50;
$TargetDedicatedNodes = (lifespan > startup ? (max($RunningTasks.GetSample(span, ratio), $ActiveTasks.GetSample(span, ratio)) == 0 ? 0 : $TargetDedicatedNodes) : {1});
", now, 4);
Další kroky
- Zjistěte, jak na výpočetních uzlech ve vašem fondu provádět více úloh současně. Spolu s automatickým škálováním to může pomoct snížit dobu trvání úlohy u některých úloh, což vám ušetří peníze.
- Zjistěte, jak efektivně dotazovat službu Azure Batch.