Een automatische formule maken voor het schalen van rekenknooppunten in een Batch-pool

Azure Batch kunt pools automatisch schalen op basis van parameters die u definieert, waardoor u tijd en geld bespaart. Met automatisch schalen voegt Batch dynamisch knooppunten toe aan een pool naarmate de vraag naar taken toeneemt en worden rekenknooppunten verwijderd naarmate de vraag naar taken afneemt.

Als u automatisch schalen wilt inschakelen voor een pool met rekenknooppunten, koppelt u de pool aan een formule voor automatisch schalen die u definieert. De Batch-service gebruikt de formule voor automatisch schalen om te bepalen hoeveel knooppunten er nodig zijn om uw workload uit te voeren. Deze knooppunten kunnen toegewezen knooppunten of knooppunten met lage prioriteit zijn. Batch controleert vervolgens periodiek de metrische gegevens van de service en gebruikt deze om het aantal knooppunten in de pool aan te passen op basis van uw formule en met een interval dat u definieert.

U kunt automatisch schalen inschakelen wanneer u een pool maakt of deze toepassen op een bestaande pool. Met Batch kunt u uw formules evalueren voordat u ze toewijst aan pools en kunt u de status van automatische schalings runs controleren. Zodra u een pool met automatisch schalen hebt geconfigureerd, kunt u later wijzigingen aanbrengen in de formule.

Belangrijk

Wanneer u een Batch-account maakt, kunt u de pooltoewijzingsmodus opgeven, waarmee wordt bepaald of pools worden toegewezen in een Batch-serviceabonnement (de standaardinstelling) of in uw gebruikersabonnement. Als u uw Batch-account hebt gemaakt met de standaardconfiguratie van de Batch-service, is uw account beperkt tot een maximum aantal kernen dat kan worden gebruikt voor verwerking. De Batch-service schaalt rekenknooppunten alleen tot die kernlimiet. Daarom bereikt de Batch-service mogelijk niet het doelaantal rekenknooppunten dat is opgegeven door een formule voor automatisch schalen. Zie Quota en limieten voor de Azure Batch service voor informatie over het weergeven en verhogen van uw accountquota.

Als u uw account hebt gemaakt met de modus Gebruikersabonnement, deelt uw account het kernquotum voor het abonnement. Zie Virtual Machines limits (Limieten voor Virtuele Machines) in Azure subscription and service limits, quotas, and constraints (Azure-abonnement en servicelimieten, -quota en -beperkingen) voor meer informatie.

Formules automatisch schalen

Een formule voor automatisch schalen is een tekenreekswaarde die u definieert en die een of meer instructies bevat. De formule voor automatisch schalen wordt toegewezen aan het element autoScaleFormula van een pool (Batch REST) of de eigenschap CloudPool.AutoScaleFormula (Batch .NET). De Batch-service gebruikt uw formule om het doelaantal rekenknooppunten in de pool te bepalen voor het volgende verwerkingsinterval. De formulereeks mag niet groter zijn dan 8 kB, kan maximaal 100 instructies bevatten die worden gescheiden door puntkomma's en kan regelafbreaks en opmerkingen bevatten.

U kunt formules voor automatisch schalen zien als een 'taal' voor automatisch schalen in Batch. Formule-instructies zijn vrije expressies die zowel door de service gedefinieerde variabelen (gedefinieerd door de Batch-service) als door de gebruiker gedefinieerde variabelen kunnen bevatten. Formules kunnen verschillende bewerkingen op deze waarden uitvoeren met behulp van ingebouwde typen, operators en functies. Een instructie kan bijvoorbeeld de volgende vorm hebben:

$myNewVariable = function($ServiceDefinedVariable, $myCustomVariable);

Formules bevatten over het algemeen meerdere instructies die bewerkingen uitvoeren op waarden die zijn verkregen in eerdere instructies. We verkrijgen bijvoorbeeld eerst een waarde voor en geven deze variable1 vervolgens door aan een functie om te variable2 vullen:

$variable1 = function1($ServiceDefinedVariable);
$variable2 = function2($OtherServiceDefinedVariable, $variable1);

Neem deze instructies op in uw formule voor automatisch schalen om een doelaantal rekenknooppunten te bereiken. Toegewezen knooppunten en knooppunten met lage prioriteit hebben elk hun eigen doelinstellingen. Een formule voor automatisch schalen kan een doelwaarde voor toegewezen knooppunten, een doelwaarde voor knooppunten met lage prioriteit of beide bevatten.

Het doelaantal knooppunten kan hoger, lager of gelijk zijn aan het huidige aantal knooppunten van dat type in de pool. Batch evalueert de formule voor automatisch schalen van een pool met een specifiek automatisch schalingsinterval. Batch past het doelaantal van elk type knooppunt in de pool aan aan het getal dat uw formule voor automatisch schalen op het moment van de evaluatie aangeeft.

Voorbeelden van formules voor automatisch schalen

Hieronder vindt u voorbeelden van twee formules voor automatisch schalen, die voor de meeste scenario's kunnen worden aangepast. De variabelen startingNumberOfVMs en in de maxNumberofVMs voorbeeldformules kunnen worden aangepast aan uw behoeften.

Taken in behandeling

Met deze formule voor automatisch schalen wordt de pool in eerste instantie gemaakt met één VM. De $PendingTasks metriek definieert het aantal taken dat wordt uitgevoerd of in de wachtrij wordt geplaatst. De formule zoekt het gemiddelde aantal taken in behandeling in de afgelopen 180 seconden en stelt de $TargetDedicatedNodes variabele dienovereenkomstig in. De formule zorgt ervoor dat het doelaantal toegewezen knooppunten nooit groter is dan 25 VM's. Wanneer nieuwe taken worden verzonden, wordt de pool automatisch groter. Als de taken zijn voltooid, worden VM's gratis en wordt de pool verkleind met de formule voor automatisch schalen.

Met deze formule worden toegewezen knooppunten geschaald, maar deze kunnen ook worden aangepast om knooppunten met lage prioriteit te schalen.

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;

Verwijderde knooppunten

In dit voorbeeld wordt een pool gemaakt die begint met 25 knooppunten met lage prioriteit. Telkens als een knooppunt met lage prioriteit wordt vereend, wordt het vervangen door een toegewezen knooppunt. Net als in het eerste voorbeeld voorkomt maxNumberofVMs de variabele dat de pool 25 VM's overschrijdt. Dit voorbeeld is handig om gebruik te maken van VM's met lage prioriteit en om ervoor te zorgen dat er slechts een vast aantal toe-eigeningen optreedt voor de levensduur van de pool.

maxNumberofVMs = 25;
$TargetDedicatedNodes = min(maxNumberofVMs, $PreemptedNodeCount.GetSample(180 * TimeInterval_Second));
$TargetLowPriorityNodes = min(maxNumberofVMs , maxNumberofVMs - $TargetDedicatedNodes);
$NodeDeallocationOption = taskcompletion;

Verder in dit onderwerp leert u meer over het maken van formules voor automatisch schalen en ziet u aanvullende voorbeeldformules voor automatisch schalen.

Variabelen

U kunt zowel door de service gedefinieerde als door de gebruiker gedefinieerde variabelen gebruiken in uw formules voor automatisch schalen.

De door de service gedefinieerde variabelen zijn ingebouwd in de Batch-service. Sommige door de service gedefinieerde variabelen zijn lezen/schrijven en sommige variabelen zijn alleen-lezen.

Door de gebruiker gedefinieerde variabelen zijn variabelen die u definieert. In de bovenstaande voorbeeldformule zijn $TargetDedicatedNodes en door de service $PendingTasks gedefinieerde variabelen, terwijl startingNumberOfVMs en door de gebruiker maxNumberofVMs gedefinieerde variabelen zijn.

Notitie

Door de service gedefinieerde variabelen worden altijd voorafgegaan door een dollarteken ($). Voor door de gebruiker gedefinieerde variabelen is het dollarteken optioneel.

De volgende tabellen tonen de variabelen read-write en read-only die zijn gedefinieerd door de Batch-service.

Door de lees-schrijfservice gedefinieerde variabelen

U kunt de waarden van deze door de service gedefinieerde variabelen op halen en instellen om het aantal rekenknooppunten in een pool te beheren.

Variabele Beschrijving
$TargetDedicatedNodes Het doelaantal toegewezen rekenknooppunten voor de pool. Dit wordt opgegeven als een doel, omdat een pool mogelijk niet altijd het gewenste aantal knooppunten bereikt. Als het doelaantal toegewezen knooppunten bijvoorbeeld wordt gewijzigd door een evaluatie van automatisch schalen voordat de pool het eerste doel heeft bereikt, bereikt de pool mogelijk het doel niet.

Een pool in een account dat is gemaakt in de Batch-servicemodus bereikt mogelijk niet het doel als het doel een Batch-account-knooppunt of kernquotum overschrijdt. Een pool in een account dat is gemaakt in de modus gebruikersabonnement bereikt mogelijk niet het doel als het doel het quotum voor gedeelde kernen voor het abonnement overschrijdt.
$TargetLowPriorityNodes Het doelaantal rekenknooppunten met lage prioriteit voor de pool. Dit is opgegeven als een doel omdat een pool mogelijk niet altijd het gewenste aantal knooppunten bereikt. Als het doelaantal knooppunten met lage prioriteit bijvoorbeeld wordt gewijzigd door een evaluatie van automatisch schalen voordat de pool het eerste doel heeft bereikt, bereikt de pool mogelijk het doel niet. Een pool bereikt mogelijk ook het doel niet als het doel een Batch-account-knooppunt of kernquotum overschrijdt.

Zie VM's met lage prioriteit gebruiken met Batch voor meer informatie over rekenknooppunten met lage prioriteit.
$NodeDeallocationOption De actie die optreedt wanneer rekenknooppunten uit een pool worden verwijderd. Mogelijke waarden zijn:
  • requeue: de standaardwaarde. Taken worden onmiddellijk beëindigd en weer in de taakwachtrij geplaatst, zodat ze opnieuw worden gepland. Deze actie zorgt ervoor dat het doelaantal knooppunten zo snel mogelijk wordt bereikt. Het kan echter minder efficiënt zijn, omdat alle lopende taken worden onderbroken en vervolgens volledig opnieuw moeten worden opgestart.
  • terminate: taken worden onmiddellijk beëindigd en uit de jobwachtrij verwijderd.
  • taakcompletion: wacht tot taken die momenteel worden uitgevoerd, zijn uitgevoerd en verwijdert vervolgens het knooppunt uit de pool. Gebruik deze optie om te voorkomen dat taken worden onderbroken en opnieuw in dequequeuie worden uitgevoerd, en alle werkzaamheden die de taak heeft uitgevoerd, te verspillen.
  • retaineddata: wacht tot alle lokale, taak behouden gegevens op het knooppunt zijn opgeschoond voordat het knooppunt uit de pool wordt verwijderd.

Notitie

De $TargetDedicatedNodes variabele kan ook worden opgegeven met behulp van de alias $TargetDedicated . Op dezelfde manier kan $TargetLowPriorityNodes de variabele worden opgegeven met behulp van de alias $TargetLowPriority . Als zowel de volledig benoemde variabele als de alias zijn ingesteld door de formule, heeft de waarde die is toegewezen aan de volledig benoemde variabele voorrang.

Alleen-lezen service-gedefinieerde variabelen

U kunt de waarde van deze door de service gedefinieerde variabelen krijgen om aanpassingen aan te brengen die zijn gebaseerd op metrische gegevens van de Batch-service.

Belangrijk

Job-releasetaken zijn momenteel niet opgenomen in variabelen die taaktellingen bieden, zoals $ActiveTasks en $PendingTasks. Afhankelijk van uw formule voor automatisch schalen kan dit ertoe leiden dat knooppunten worden verwijderd zonder dat er knooppunten beschikbaar zijn om jobre releasetaken uit te voeren.

Variabele Beschrijving
$CPUPercent Het gemiddelde percentage cpu-gebruik.
$WallClockSeconds Het aantal seconden dat is verbruikt.
$MemoryBytes Het gemiddelde aantal gebruikte megabytes.
$DiskBytes Het gemiddelde aantal gigabytes dat op de lokale schijven wordt gebruikt.
$DiskReadBytes Het aantal gelezen bytes.
$DiskWriteBytes Het aantal geschreven bytes.
$DiskReadOps Het aantal uitgevoerde leesschijfbewerkingen.
$DiskWriteOps Het aantal uitgevoerde schrijfschijfbewerkingen.
$NetworkInBytes Het aantal binnenkomende bytes.
$NetworkOutBytes Het aantal uitgaande bytes.
$SampleNodeCount Het aantal rekenknooppunten.
$ActiveTasks Het aantal taken dat gereed is om te worden uitgevoerd, maar nog niet wordt uitgevoerd. Dit omvat alle taken die zich in de actieve status en waarvan de afhankelijkheden zijn voldaan. Taken die zich in de actieve status maar waarvan niet is voldaan aan de afhankelijkheden worden uitgesloten van het $ActiveTasks aantal. Voor een taak met meerdere exemplaren $ActiveTasks het aantal instanties dat voor de taak is ingesteld.
$RunningTasks Het aantal taken met de status Actief.
$PendingTasks De som van $ActiveTasks en $RunningTasks.
$SucceededTasks Het aantal taken dat is voltooid.
$FailedTasks Het aantal mislukte taken.
$TaskSlotsPerNode Het aantal taaksleuven dat kan worden gebruikt om gelijktijdige taken uit te voeren op één reken knooppunt in de pool.
$CurrentDedicatedNodes Het huidige aantal toegewezen rekenknooppunten.
$CurrentLowPriorityNodes Het huidige aantal rekenknooppunten met lage prioriteit, inclusief eventuele knooppunten die zijn vereend.
$PreemptedNodeCount Het aantal knooppunten in de pool met een vereende status.

Tip

Deze alleen-lezen service-gedefinieerde variabelen zijn objecten die verschillende methoden bieden voor toegang tot de gegevens die aan elk object zijn gekoppeld. Zie Voorbeeldgegevens verkrijgen verder in dit artikel voor meer informatie.

Notitie

Gebruik bij het schalen op basis van het aantal taken dat op een bepaald moment wordt uitgevoerd en bij het schalen op basis van het aantal taken dat in de wachtrij staat om $RunningTasks $ActiveTasks te worden uitgevoerd.

Typen

Formules voor automatisch schalen ondersteunen de volgende typen:

  • double
  • doubleVec
  • doubleVecList
  • tekenreeks
  • timestamp: een samengestelde structuur die de volgende leden bevat:
    • jaar
    • maand (1-12)
    • dag (1-31)
    • weekdag (in de notatie van getal; bijvoorbeeld 1 voor maandag)
    • uur (in getalnotatie van 24 uur; 13 betekent bijvoorbeeld 1 PM)
    • minuut (00-59)
    • seconde (00-59)
  • timeinterval
    • TimeInterval_Zero
    • TimeInterval_100ns
    • TimeInterval_Microsecond
    • TimeInterval_Millisecond
    • TimeInterval_Second
    • TimeInterval_Minute
    • TimeInterval_Hour
    • TimeInterval_Day
    • TimeInterval_Week
    • TimeInterval_Year

Operations

Deze bewerkingen zijn toegestaan voor de typen die in de vorige sectie worden vermeld.

Bewerking Ondersteunde operators Resultaattype
dubbele operator +, -, *, / double
double operator timeinterval * timeinterval
doubleVec-operator dubbel +, -, *, / doubleVec
doubleVec-operator doubleVec +, -, *, / doubleVec
timeinterval-operator dubbel *, / timeinterval
timeinterval-operator timeinterval +, - timeinterval
tijdstempel van timeinterval-operator + tijdstempel
timetamp operator timeinterval + tijdstempel
timestamp operator timestamp - timeinterval
operator double -, ! double
tijdinterval van operator - timeinterval
dubbele operator double <, <=, ==, >=, >, != double
tekenreeksoperator <, <=, ==, >=, >, != double
timestamp operator timestamp <, <=, ==, >=, >, != double
timeinterval operator timeinterval <, <=, ==, >=, >, != double
dubbele operator double &&, || double

Wanneer u een dubbel test met een ternaire operator ( double ? statement1 : statement2 ), is nonzero true en nul onwaar.

Functions

U kunt deze vooraf gedefinieerde functies gebruiken bij het definiëren van een formule voor automatisch schalen.

Functie Retourtype Beschrijving
avg(doubleVecList) double Retourneert de gemiddelde waarde voor alle waarden in de doubleVecList.
len(doubleVecList) double Retourneert de lengte van de vector die is gemaakt op de doubleVecList.
lg (dubbel) double Retourneert de logboekbasis 2 van de dubbele.
lg(doubleVecList) doubleVec Retourneert het onderdeelgemiddelde logboekbasis 2 van de doubleVecList. Een vec(double) moet expliciet worden doorgegeven voor de parameter . Anders wordt ervan uitgegaan dat de dubbele lg(double)-versie wordt gebruikt.
ln(dubbel) double Retourneert het natuurlijke logboek van de dubbele.
ln(doubleVecList) doubleVec Retourneert het natuurlijke logboek van de dubbele.
log (dubbel) double Retourneert de logboekbasis 10 van de dubbele.
log(doubleVecList) doubleVec Retourneert het onderdeelgemiddelde logboekbasis 10 van de doubleVecList. Een vec(double) moet expliciet worden doorgegeven voor de enkele dubbele parameter. Anders wordt ervan uitgegaan dat de dubbele logversie wordt aangenomen.
max(doubleVecList) double Retourneert de maximumwaarde in de doubleVecList.
min(doubleVecList) double Retourneert de minimumwaarde in de doubleVecList.
norm(doubleVecList) double Retourneert de twee-norm van de vector die is gemaakt op de doubleVecList.
percentiel (doubleVec v, double p) double Retourneert het percentielelement van de vector v.
rand() double Retourneert een willekeurige waarde tussen 0,0 en 1,0.
range(doubleVecList) double Retourneert het verschil tussen de minimum- en maximumwaarden in de doubleVecList.
std(doubleVecList) double Retourneert de standaardafwijking van het voorbeeld van de waarden in doubleVecList.
stop() Stopt de evaluatie van de expressie voor automatisch schalen.
sum(doubleVecList) double Retourneert de som van alle onderdelen van de doubleVecList.
time(string dateTime="") tijdstempel Retourneert het tijdstempel van de huidige tijd als er geen parameters zijn doorgegeven, of het tijdstempel van de datum/tijd-tekenreeks als die wordt doorgegeven. Ondersteunde datum/tijd-indelingen zijn W3C-DTF en RFC 1123.
val(doubleVec v, double i) double Retourneert de waarde van het element dat zich op de locatie i in vector v bevindt, met een beginindex van nul.

Sommige van de functies die in de vorige tabel worden beschreven, kunnen een lijst als argument accepteren. De door komma's gescheiden lijst is een combinatie van double en doubleVec. Bijvoorbeeld:

doubleVecList := ( (double | doubleVec)+(, (double | doubleVec) )* )?

De waarde doubleVecList wordt vóór de evaluatie geconverteerd naar één doubleVec. Als u bijvoorbeeld v = [1,2,3] aanroept, is aanroepen avg(v) gelijk aan het aanroepen avg(1,2,3) van . avg(v, 7)Aanroepen is gelijk aan het aanroepen van avg(1,2,3,7) .

Metrische gegevens

U kunt zowel metrische gegevens voor resources als taken gebruiken bij het definiëren van een formule. U past het doelaantal toegewezen knooppunten in de pool aan op basis van de metrische gegevens die u verkrijgt en evalueert. Zie de sectie Variabelen hierboven voor meer informatie over elk metrisch gegeven.

Metrisch Beschrijving
Resource

Metrische resourcegegevens zijn gebaseerd op de CPU, de bandbreedte, het geheugengebruik van rekenknooppunten en het aantal knooppunten.

Deze door de service gedefinieerde variabelen zijn handig voor het aanbrengen van aanpassingen op basis van het aantal knooppunt:

  • $TargetDedicatedNodes
  • $TargetLowPriorityNodes
  • $CurrentDedicatedNodes
  • $CurrentLowPriorityNodes
  • $PreemptedNodeCount
  • $SampleNodeCount

Deze door de service gedefinieerde variabelen zijn handig voor het aanbrengen van aanpassingen op basis van het resourcegebruik van knooppunt:

  • $CPUPercent
  • $WallClockSeconds
  • $MemoryBytes
  • $DiskBytes
  • $DiskReadBytes
  • $DiskWriteBytes
  • $DiskReadOps
  • $DiskWriteOps
  • $NetworkInBytes
  • $NetworkOutBytes

Taak

Metrische gegevens voor taken zijn gebaseerd op de status van taken, zoals Actief, In behandeling en Voltooid. De volgende door de service gedefinieerde variabelen zijn handig voor het aanpassen van de grootte van de pool op basis van metrische gegevens van taken:

  • $ActiveTasks
  • $RunningTasks
  • $PendingTasks
  • $SucceededTasks
  • $FailedTasks

Voorbeeldgegevens verkrijgen

De kernbewerking van een formule voor automatisch schalen is het verkrijgen van metrische gegevens van taken en resources (voorbeelden) en vervolgens de poolgrootte aanpassen op basis van die gegevens. Daarom is het belangrijk om een duidelijk inzicht te hebben in de manier waarop formules voor automatisch schalen communiceren met voorbeelden.

Methoden

Formules voor automatisch schalen worden gebruikt voor voorbeelden van metrische gegevens die worden geleverd door de Batch-service. Met een formule wordt de poolgrootte groter of kleiner op basis van de waarden die worden ontvangen. Door de service gedefinieerde variabelen zijn objecten die methoden bieden voor toegang tot gegevens die aan dat object zijn gekoppeld. De volgende expressie toont bijvoorbeeld een aanvraag om de laatste vijf minuten cpu-gebruik op te halen:

$CPUPercent.GetSample(TimeInterval_Minute * 5)

De volgende methoden kunnen worden gebruikt voor het verkrijgen van voorbeeldgegevens over door de service gedefinieerde variabelen.

Methode Beschrijving
GetSample() De GetSample() methode retourneert een vector van gegevensvoorbeelden.

Een voorbeeld is 30 seconden aan metrische gegevens. Met andere woorden, voorbeelden worden elke 30 seconden verkregen. Maar zoals hieronder wordt vermeld, is er een vertraging tussen het moment waarop een voorbeeld wordt verzameld en wanneer het beschikbaar is voor een formule. Daarom zijn niet alle voorbeelden voor een bepaalde periode beschikbaar voor evaluatie door een formule.
  • doubleVec GetSample(double count): hiermee geeft u het aantal voorbeelden op dat moet worden opgehaald uit de meest recente voorbeelden die zijn verzameld. GetSample(1) retourneert het laatst beschikbare voorbeeld. Voor metrische gegevens zoals moet echter niet worden gebruikt, omdat het onmogelijk is om te weten wanneer $CPUPercent GetSample(1) het voorbeeld is verzameld. Het kan recent zijn of, vanwege systeemproblemen, het kan veel ouder zijn. In dergelijke gevallen is het beter om een tijdsinterval te gebruiken, zoals hieronder wordt weergegeven.
  • doubleVec GetSample((timestamp or timeinterval) startTime [, double samplePercent]): Hiermee geeft u een tijdsbestek op voor het verzamelen van voorbeeldgegevens. Optioneel wordt ook het percentage voorbeelden opgegeven dat beschikbaar moet zijn binnen het aangevraagde tijdsbestek. Retourneert $CPUPercent.GetSample(TimeInterval_Minute * 10) bijvoorbeeld 20 voorbeelden als alle voorbeelden van de afgelopen 10 minuten aanwezig zijn in de CPUPercent geschiedenis. Als de laatste minuut van de geschiedenis niet beschikbaar was, zouden er slechts 18 voorbeelden worden geretourneerd. In dit geval $CPUPercent.GetSample(TimeInterval_Minute * 10, 95) mislukt omdat slechts 90 procent van de voorbeelden beschikbaar is, maar $CPUPercent.GetSample(TimeInterval_Minute * 10, 80) wel zou slagen.
  • doubleVec GetSample((timestamp or timeinterval) startTime, (timestamp or timeinterval) endTime [, double samplePercent]): Hiermee geeft u een tijdsbestek op voor het verzamelen van gegevens, met zowel een begintijd als een eindtijd. Zoals hierboven vermeld, is er een vertraging tussen het moment waarop een voorbeeld wordt verzameld en het moment waarop het beschikbaar wordt voor een formule. Houd rekening met deze vertraging wanneer u de methode GetSample gebruikt. Zie GetSamplePercent hieronder.
GetSamplePeriod() Retourneert de periode met voorbeelden die zijn genomen in een historische voorbeeldgegevensset.
Count() Retourneert het totale aantal voorbeelden in de metrische geschiedenis.
HistoryBeginTime() Retourneert het tijdstempel van het oudste beschikbare gegevensvoorbeeld voor de metrische gegevens.
GetSamplePercent() Retourneert het percentage voorbeelden dat beschikbaar is voor een bepaald tijdsinterval. Bijvoorbeeld doubleVec GetSamplePercent( (timestamp or timeinterval) startTime [, (timestamp or timeinterval) endTime] ). Omdat de methode mislukt als het percentage geretourneerde voorbeelden kleiner is dan de opgegeven, kunt u eerst GetSample de methode gebruiken om dit te samplePercent GetSamplePercent controleren. Vervolgens kunt u een alternatieve actie uitvoeren als er onvoldoende steekproeven aanwezig zijn, zonder de evaluatie van automatisch schalen te stoppen.

Voorbeelden

De Batch-service neemt regelmatig voorbeelden van metrische gegevens voor taken en resources en maakt deze beschikbaar voor uw formules voor automatisch schalen. Deze voorbeelden worden elke 30 seconden vastgelegd door de Batch-service. Er is echter meestal een vertraging tussen het moment waarop deze voorbeelden zijn vastgelegd en wanneer ze beschikbaar worden gesteld voor (en kunnen worden gelezen door) uw formules voor automatisch schalen. Bovendien kunnen voorbeelden niet worden vastgelegd voor een bepaald interval vanwege factoren zoals netwerk- of andere infrastructuurproblemen.

Voorbeeldpercentage

Wanneer wordt doorgegeven aan de methode of de methode wordt aangeroepen, verwijst percentage naar een vergelijking tussen het totale aantal voorbeelden dat door de Batch-service wordt vastgelegd en het aantal voorbeelden dat beschikbaar is voor uw formule voor automatisch samplePercent GetSample() GetSamplePercent() schalen.

Laten we eens kijken naar een periode van 10 minuten als voorbeeld. Omdat voorbeelden elke 30 seconden binnen die periode van 10 minuten worden vastgelegd, zou het maximum aantal steekproeven dat door Batch wordt vastgelegd, 20 steekproeven (2 per minuut) zijn. Vanwege de inherente latentie van het rapportagemechanisme en andere problemen binnen Azure zijn er echter mogelijk slechts 15 voorbeelden beschikbaar voor uw formule voor automatisch schalen om te lezen. Voor die periode van 10 minuten is bijvoorbeeld slechts 75% van het totale aantal vastgelegde steekproeven beschikbaar voor uw formule.

GetSample() en voorbeeldbereiken

Uw formules voor automatisch schalen worden groter en kleiner door knooppunten toe te voegen of te verwijderen. Omdat knooppunten u geld kosten, moet u ervoor zorgen dat uw formules een intelligente analysemethode gebruiken die is gebaseerd op voldoende gegevens. U wordt aangeraden een trending-type-analyse in uw formules te gebruiken. Dit type groeit en verkleint uw pools op basis van een reeks verzamelde voorbeelden.

Gebruik om dit te doen om GetSample(interval look-back start, interval look-back end) een vector van steekproeven te retourneren:

$runningTasksSample = $RunningTasks.GetSample(1 * TimeInterval_Minute, 6 * TimeInterval_Minute);

Wanneer de bovenstaande regel wordt geëvalueerd door Batch, retourneert deze een reeks voorbeelden als een vector van waarden. Bijvoorbeeld:

$runningTasksSample=[1,1,1,1,1,1,1,1,1,1];

Zodra u de vector van voorbeelden hebt verzameld, kunt u functies zoals , en gebruiken om zinvolle waarden af te leiden min() max() uit het verzamelde avg() bereik.

Voor extra beveiliging kunt u forceer dat een formule-evaluatie mislukt als er minder dan een bepaald voorbeeldpercentage beschikbaar is voor een bepaalde periode. Wanneer u een formule-evaluatie forceren mislukt, instrueert u Batch om de verdere evaluatie van de formule te stoppen als het opgegeven percentage van de voorbeelden niet beschikbaar is. In dit geval wordt er geen wijziging aangebracht in de poolgrootte. Als u een vereist percentage voorbeelden wilt opgeven om de evaluatie te laten slagen, geeft u dit op als de derde parameter voor GetSample() . Hier wordt een vereiste van 75 procent van de voorbeelden opgegeven:

$runningTasksSample = $RunningTasks.GetSample(60 * TimeInterval_Second, 120 * TimeInterval_Second, 75);

Omdat er een vertraging in de beschikbaarheid van het voorbeeld kan zijn, moet u altijd een tijdsbereik opgeven met een begintijd voor terugkijken die ouder is dan één minuut. Het duurt ongeveer één minuut voor voorbeelden zijn doorgegeven via het systeem, zodat voorbeelden in het bereik (0 * TimeInterval_Second, 60 * TimeInterval_Second) mogelijk niet beschikbaar zijn. Ook hier kunt u de parameter percentage van gebruiken om GetSample() een bepaald vereiste steekproefpercentage af te dwingen.

Belangrijk

We raden u ten zeerste aan om te voorkomen dat u alleen GetSample(1) vertrouwt op in uw formules voor automatisch schalen. Dit komt omdat in wezen tegen de Batch-service zegt: "Geef me het laatste voorbeeld dat u hebt, ongeacht hoe lang GetSample(1) geleden u het hebt opgehaald." Aangezien het slechts één voorbeeld is en het een oudere steekproef kan zijn, is het mogelijk niet representatief voor het grotere geheel van de recente taak- of resourcetoestand. Als u wel gebruikt, moet u ervoor zorgen dat deze deel uitmaakt van een grotere instructie en niet het enige gegevenspunt waar uw GetSample(1) formule van afhankelijk is.

Een formule voor automatisch schalen schrijven

U bouwt een formule voor automatisch schalen door instructies te maken die gebruikmaken van de bovenstaande onderdelen en deze instructies vervolgens combineren tot een volledige formule. In deze sectie maken we een voorbeeldformule voor automatische schaalaanpassing die beslissingen voor schaalaanpassing in de echte wereld kan uitvoeren en aanpassingen kan aanbrengen.

Eerst gaan we de vereisten voor onze nieuwe formule voor automatisch schalen definiëren. De formule moet:

  • Verhoog het doelaantal toegewezen rekenknooppunten in een pool als het CPU-gebruik hoog is.
  • Verminder het doelaantal toegewezen rekenknooppunten in een pool wanneer het CPU-gebruik laag is.
  • Beperk altijd het maximum aantal toegewezen knooppunten tot 400.
  • Wanneer u het aantal knooppunten vermindert, verwijdert u geen knooppunten waarop taken worden uitgevoerd; Wacht zo nodig totdat taken zijn voltooid voordat u knooppunten verwijdert.

De eerste instructie in onze formule verhoogt het aantal knooppunten tijdens hoog CPU-gebruik. We definiëren een instructie die een door de gebruiker gedefinieerde variabele ( ) vult met een waarde die 110 procent is van het huidige doelaantal toegewezen knooppunten, maar alleen als het minimale gemiddelde CPU-gebruik in de afgelopen 10 minuten hoger is dan $totalDedicatedNodes 70 procent. Anders wordt de waarde gebruikt voor het huidige aantal toegewezen knooppunten.

$totalDedicatedNodes =
    (min($CPUPercent.GetSample(TimeInterval_Minute * 10)) > 0.7) ?
    ($CurrentDedicatedNodes * 1.1) : $CurrentDedicatedNodes;

Om het aantal toegewezen knooppunten te verlagen tijdens een laag CPU-gebruik, stelt de volgende instructie in onze formule dezelfde variabele in op 90 procent van het huidige doelaantal toegewezen knooppunten, als het gemiddelde CPU-gebruik in de afgelopen 60 minuten lager is dan $totalDedicatedNodes 20 procent. Anders wordt de huidige waarde van gebruikt $totalDedicatedNodes die we in de bovenstaande instructie hebben ingevuld.

$totalDedicatedNodes =
    (avg($CPUPercent.GetSample(TimeInterval_Minute * 60)) < 0.2) ?
    ($CurrentDedicatedNodes * 0.9) : $totalDedicatedNodes;

Nu beperken we het doelaantal toegewezen rekenknooppunten tot maximaal 400.

$TargetDedicatedNodes = min(400, $totalDedicatedNodes)

Ten slotte zorgen we ervoor dat knooppunten pas worden verwijderd als hun taken zijn voltooid.

$NodeDeallocationOption = taskcompletion;

Dit is de volledige formule:

$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;

Notitie

Als u wilt, kunt u zowel opmerkingen als regelbreaks opnemen in formulereeksen. Let er ook op dat ontbrekende puntkomma's kunnen leiden tot evaluatiefouten.

Interval voor automatisch schalen

De Batch-service past standaard elke 15 minuten de grootte van een pool aan op basis van de formule voor automatisch schalen. Dit interval kan worden geconfigureerd met behulp van de volgende pooleigenschappen:

Het minimale interval is vijf minuten en het maximum is 168 uur. Als een interval buiten dit bereik is opgegeven, retourneert de Batch-service de fout Bad Request (400).

Notitie

Automatisch schalen is momenteel niet bedoeld om in minder dan een minuut te reageren op wijzigingen, maar is bedoeld om de grootte van uw pool geleidelijk aan te passen wanneer u een workload gaat uitvoeren.

Een pool voor automatisch schalen maken met Batch-SDK's

Automatisch schalen van pool kan worden geconfigureerd met behulp van een van de Batch SDK's,de Batch REST API Batch PowerShell-cmdletsen de Batch CLI. In deze sectie ziet u voorbeelden voor zowel .NET als Python.

.NET

Als u een pool wilt maken met automatisch schalen ingeschakeld in .NET, volgt u deze stappen:

  1. Maak de pool met BatchClient.PoolOperations.CreatePool.
  2. Stel de eigenschap CloudPool.AutoScaleEnabled in op true .
  3. Stel de eigenschap CloudPool.AutoScaleFormula in met uw formule voor automatisch schalen.
  4. (Optioneel) Stel de eigenschap CloudPool.AutoScaleEvaluationInterval in (de standaardwaarde is 15 minuten).
  5. Commit the pool with CloudPool.Commit or CommitAsync.

In het volgende voorbeeld wordt een pool met automatisch schalen gemaakt in .NET. De formule voor automatisch schalen van de pool stelt het doelaantal toegewezen knooppunten op maandagen in op 5 en op 1 op elke andere dag van de week. Het interval voor automatisch schalen is ingesteld op 30 minuten. In dit en de andere C#-codefragmenten in dit artikel is een correct initialiseerde instantie myBatchClient van de BatchClient-klasse.

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();

Belangrijk

Wanneer u een pool maakt die automatisch wordt geschaald, geeft u de parameter targetDedicatedNodes of de parameter targetLowPriorityNodes niet op bij de aanroep van CreatePool. Geef in plaats daarvan de eigenschappen AutoScaleEnabled en AutoScaleFormula op in de pool. De waarden voor deze eigenschappen bepalen het doelnummer van elk type knooppunt.

Als u de schaal van een pool met automatische schaalbaarheid handmatig wilt wijzigen (bijvoorbeeld met BatchClient.PoolOperations.ResizePoolAsync),moet u eerst automatisch schalen voor de pool uitschakelen en vervolgens de schaal wijzigen.

Python

Voor automatisch schalen ingeschakelde pool maken met de Python-SDK:

  1. Maak een pool en geef de configuratie op.
  2. Voeg de pool toe aan de serviceclient.
  3. Schakel automatisch schalen in voor de pool met een formule die u schrijft.

In het volgende voorbeeld worden deze stappen geïllustreerd.

# 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="18.04-LTS",
          version="latest"
            ),
        node_agent_sku_id="batch.node.ubuntu 18.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

Meer voorbeelden van het gebruik van de Python SDK vindt u in de Batch Python Quickstart-opslagplaats op GitHub.

Automatisch schalen inschakelen voor een bestaande pool

Elke Batch-SDK biedt een manier om automatisch schalen mogelijk te maken. Bijvoorbeeld:

Wanneer u automatisch schalen in een bestaande pool inschakelen, moet u rekening houden met het volgende:

  • Als automatisch schalen momenteel is uitgeschakeld voor de groep, moet u een geldige formule voor automatisch schalen opgeven wanneer u de aanvraag indient. U kunt eventueel een automatisch schaalinterval opgeven. Als u geen interval opgeeft, wordt de standaardwaarde 15 minuten gebruikt.
  • Als automatische schalen momenteel is ingeschakeld voor de pool, kunt u een nieuwe formule, een nieuw interval of beide opgeven. U moet ten minste één van deze eigenschappen opgeven.
    • Als u een nieuw automatisch schaalinterval opgeeft, wordt de bestaande planning gestopt en wordt een nieuwe planning gestart. De begintijd van het nieuwe schema is het tijdstip waarop de aanvraag voor het inschakelen van automatisch schalen is uitgegeven.
    • Als u de formule of het interval voor automatisch schalen weglaten, blijft de Batch-service de huidige waarde van die instelling gebruiken.

Notitie

Als u waarden hebt opgegeven voor de parameters targetDedicatedNodes of targetLowPriorityNodes van de methode CreatePool tijdens het maken van de pool in .NET of voor de vergelijkbare parameters in een andere taal, worden deze waarden genegeerd wanneer de formule voor automatisch schalen wordt geëvalueerd.

In dit C#-voorbeeld wordt de Batch .NET-bibliotheek gebruikt om automatisch schalen in te stellen voor een bestaande pool.

// 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);

Een formule voor automatisch schalen bijwerken

Als u de formule voor een bestaande pool met automatische schaalbewerking wilt bijwerken, roept u de bewerking aan om automatisch schalen opnieuw in te stellen met de nieuwe formule. Als automatisch schalen bijvoorbeeld al is ingeschakeld wanneer de volgende .NET-code wordt uitgevoerd, wordt de formule voor automatisch schalen vervangen door de myexistingpool inhoud van myNewFormula .

await myBatchClient.PoolOperations.EnableAutoScaleAsync(
    "myexistingpool",
    autoscaleFormula: myNewFormula);

Het interval voor automatisch schalen bijwerken

Als u het evaluatie-interval voor automatisch schalen van een bestaande pool met automatische schaalbewerking wilt bijwerken, roept u de bewerking aan om automatisch schalen opnieuw in te stellen met het nieuwe interval. Als u bijvoorbeeld het evaluatie-interval voor automatisch schalen wilt instellen op 60 minuten voor een pool die al automatisch wordt geschaald in .NET:

await myBatchClient.PoolOperations.EnableAutoScaleAsync(
    "myexistingpool",
    autoscaleEvaluationInterval: TimeSpan.FromMinutes(60));

Een formule voor automatisch schalen evalueren

U kunt een formule evalueren voordat u deze op een pool gaat toepassen. Hiermee kunt u de resultaten van de formule testen voordat u deze in productie gaat nemen.

Voordat u een formule voor automatisch schalen kunt evalueren, moet u automatisch schalen inschakelen voor de pool met een geldige formule, zoals de formule van één $TargetDedicatedNodes = 0 regel. Gebruik vervolgens een van de volgende opties om de formule te evalueren die u wilt testen:

In dit Batch .NET-voorbeeld wordt een formule voor automatisch schalen geëvalueerd. Als de pool nog geen gebruik maakt van automatisch schalen, moet u deze eerst inschakelen.

// 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)
{
    // We 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 we want to apply our new autoscale formula below if it
    // evaluates successfully, and we *just* enabled autoscaling on
    // this pool, we pause here to ensure we 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();
}

// We 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);
    }
}

Een geslaagde evaluatie van de formule die in dit codefragment wordt weergegeven, levert resultaten op die vergelijkbaar zijn met:

AutoScaleRun.Results:
    $TargetDedicatedNodes=10;
    $NodeDeallocationOption=requeue;
    $curTime=2016-10-13T19:18:47.805Z;
    $isWeekday=1;
    $isWorkingWeekdayHour=0;
    $workHours=0

Informatie over automatisch schalen

Om ervoor te zorgen dat uw formule werkt zoals verwacht, raden we u aan om regelmatig de resultaten te controleren van de automatisch schalen die Batch voor uw pool uitvoert. U doet dit door een verwijzing naar de pool op te halen (of te vernieuwen) en vervolgens de eigenschappen van de laatste keer automatisch schalen te bekijken.

In Batch .NET heeft de eigenschap CloudPool.AutoScaleRun verschillende eigenschappen die informatie bieden over de meest recente automatische schaalrun die op de pool wordt uitgevoerd:

In de REST API retourneert de aanvraag Voor informatie over een pool informatie over de pool, waaronder de meest recente gegevens over de automatische schalingsuitslag in de eigenschap autoScaleRun.

In het volgende C#-voorbeeld wordt de Batch .NET-bibliotheek gebruikt om informatie af te drukken over de laatste automatische schalen die in de pool myPool is uitgevoerd.

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);

Voorbeelduitvoer uit het voorgaande voorbeeld:

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:

Geschiedenis van automatisch schalen op basis van gebeurtenissen voor automatisch schalen van pool

U kunt ook de geschiedenis van automatisch schalen controleren door een query uit te voeren op PoolAutoScaleEvent. Deze gebeurtenis wordt door Batch Service uitgevoerd om vast te maken of er formules automatisch worden geëvalueerd en uitgevoerd. Dit kan handig zijn om potentiële problemen op te lossen.

Voorbeeldgebeurtenis voor 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": []
    }
}

Voorbeeldformules voor automatisch schalen

Laten we eens kijken naar een aantal formules die verschillende manieren laten zien om de hoeveelheid rekenbronnen in een pool aan te passen.

Voorbeeld 1: Aanpassing op basis van tijd

Stel dat u de poolgrootte wilt aanpassen op basis van de dag van de week en het tijdstip van de dag. In dit voorbeeld ziet u hoe u het aantal knooppunten in de pool dienovereenkomstig verhoogt of verlaagt.

De formule verkrijgt eerst de huidige tijd. Als het een doordeweekse dag (1-5) en binnen werkuren (8:00 tot 18:00 uur) is, wordt de grootte van de doelgroep ingesteld op 20 knooppunten. Anders wordt deze ingesteld op 10 knooppunten.

$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 kan worden aangepast aan uw lokale tijdzone door toe te time() voegen aan het product van en uw TimeZoneInterval_Hour UTC-offset. Gebruik bijvoorbeeld voor $curTime = time() + (-6 * TimeInterval_Hour); Mountain Daylight Time (MDT). Houd er rekening mee dat de offset moet worden aangepast aan het begin en einde van de zomertijd (indien van toepassing).

Voorbeeld 2: Aanpassing op basis van taken

In dit C#-voorbeeld wordt de poolgrootte aangepast op basis van het aantal taken in de wachtrij. We hebben zowel opmerkingen als regelbreaks opgenomen in de formulereeksen.

// Get pending tasks for the past 15 minutes.
$samples = $PendingTasks.GetSamplePercent(TimeInterval_Minute * 15);
// If we have fewer than 70 percent data points, we use the last sample point,
// otherwise we 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;

Voorbeeld 3: Accounting voor parallelle taken

In dit C#-voorbeeld wordt de poolgrootte aangepast op basis van het aantal taken. Deze formule houdt ook rekening met de waarde TaskSlotsPerNode die is ingesteld voor de pool. Deze aanpak is handig in situaties waarin parallelle taakuitvoering is ingeschakeld in uw pool.

// 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;

Voorbeeld 4: Een initiële poolgrootte instellen

In dit voorbeeld ziet u een C#-voorbeeld met een formule voor automatisch schalen die de poolgrootte in een eerste periode in stelt op een opgegeven aantal knooppunten. Daarna wordt de poolgrootte aangepast op basis van het aantal actieve en actieve taken.

Deze formule doet met name het volgende:

  • Hiermee stelt u de grootte van de initiële pool in op vier knooppunten.
  • De grootte van de pool wordt niet binnen de eerste tien minuten van de levenscyclus van de pool aangepast.
  • Na 10 minuten verkrijgt de maximale waarde van het aantal actieve en actieve taken binnen de afgelopen 60 minuten.
    • Als beide waarden 0 zijn (wat aangeeft dat er in de afgelopen 60 minuten geen taken werden uitgevoerd of actief waren), wordt de poolgrootte ingesteld op 0.
    • Als een van beide waarden groter is dan nul, wordt er geen wijziging aangebracht.
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);

Volgende stappen