Een formule maken om rekennodes automatisch te schalen in een Batch-groep

Azure Batch kan 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 taakvereisten toenemen en worden rekenknooppunten verwijderd wanneer de taakvereisten afnemen.

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 Azure Spot-knooppunten zijn. Batch controleert regelmatig metrische servicegegevens 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 deze toewijst aan pools en de status van automatische schaaluitvoeringen 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, die bepaalt 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 automatische schaalaanpassing. Zie Quota en limieten voor de Azure Batch-service voor meer informatie over het weergeven en verhogen van uw accountquota.

Als u uw account hebt gemaakt met de modus gebruikersabonnement, wordt uw account gedeeld in 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 die een of meer instructies bevat. De formule voor automatische schaalaanpassing 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 formuletekenreeks mag niet groter zijn dan 8 kB, kan maximaal 100 instructies bevatten, gescheiden door puntkomma's en kan regeleinden en opmerkingen bevatten.

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

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

Formules bevatten over het algemeen meerdere instructies die bewerkingen uitvoeren op waarden die zijn verkregen in eerdere instructies. U verkrijgt bijvoorbeeld eerst een waarde voor variable1en geeft deze vervolgens door aan een functie om het volgende in te vullen variable2:

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

Neem deze instructies op in de formule voor automatische schaalaanpassing om een doelaantal rekenknooppunten te bereiken. Toegewezen knooppunten en Spot-knooppunten hebben elk hun eigen doelinstellingen. Een formule voor automatisch schalen kan een doelwaarde bevatten voor toegewezen knooppunten, een doelwaarde voor Spot-knooppunten of beide.

Het doelaantal knooppunten kan hoger, lager of hetzelfde zijn als het huidige aantal knooppunten van dat type in de pool. Batch evalueert de formule voor automatische schaalaanpassing van een pool met specifieke intervallen voor automatisch schalen. Batch past het doelnummer van elk type knooppunt in de groep aan op het getal dat de formule voor automatische schaalaanpassing opgeeft op het moment van evaluatie.

Voorbeeld van formules voor automatisch schalen

In de volgende voorbeelden ziet u twee formules voor automatische schaalaanpassing, die voor de meeste scenario's kunnen worden aangepast. De variabelen startingNumberOfVMs en maxNumberofVMs in de voorbeeldformules kunnen worden aangepast aan uw behoeften.

Taken in behandeling

Met deze formule voor automatische schaalaanpassing wordt de pool in eerste instantie gemaakt met één virtuele machine. De $PendingTasks metrische waarde 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. Naarmate er nieuwe taken worden verzonden, groeit de pool automatisch. Wanneer taken zijn voltooid, worden VM's vrij en wordt de formule voor automatisch schalen kleiner.

Met deze formule worden toegewezen knooppunten geschaald, maar deze kunnen ook worden aangepast om spot-knooppunten 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;

Belangrijk

Momenteel heeft Batch Service beperkingen met de oplossing van de taken die in behandeling zijn. Wanneer een taak wordt toegevoegd aan de taak, wordt deze ook toegevoegd aan een interne wachtrij die wordt gebruikt door de Batch-service voor het plannen. Als de taak wordt verwijderd voordat deze kan worden gepland, kan de taak in de wachtrij blijven staan, waardoor deze nog steeds wordt $PendingTasksgeteld. Deze verwijderde taak wordt uiteindelijk gewist uit de wachtrij wanneer Batch taken uit de wachtrij haalt om te plannen met niet-actieve knooppunten in de Batch-pool.

Vooraf geïmplementeerde knooppunten

In dit voorbeeld wordt een pool gemaakt die begint met 25 Spot-knooppunten. Telkens wanneer een Spot-knooppunt wordt vervangen door een toegewezen knooppunt. Net als in het eerste voorbeeld voorkomt de maxNumberofVMs variabele dat de pool meer dan 25 VM's overschrijdt. Dit voorbeeld is handig om te profiteren van spot-VM's, terwijl u er ook voor zorgt dat er slechts een vast aantal voorbeëdigingen optreden voor de levensduur van de pool.

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

Verderop in dit artikel vindt u meer informatie over het maken van formules voor automatisch schalen en meer voorbeelden van formules 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 zijn alleen-lezen.

Door de gebruiker gedefinieerde variabelen zijn variabelen die u definieert. In het vorige voorbeeld $TargetDedicatedNodes$PendingTasks zijn servicegedefinieerde variabelen, terwijl startingNumberOfVMs en maxNumberofVMs door de gebruiker gedefinieerde variabelen zijn.

Notitie

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

In de volgende tabellen worden de variabelen alleen-lezen en alleen-lezen weergegeven die zijn gedefinieerd door de Batch-service.

Servicegedefinieerde variabelen lezen/schrijven

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

Variabele Beschrijving
$TargetDedicatedNodes Het doelaantal toegewezen rekenknooppunten voor de pool. 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 automatische schaalaanpassing 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 groter is dan een Batch-accountknooppunt of kernquotum. Een pool in een account dat is gemaakt in de modus gebruikersabonnement bereikt mogelijk niet het doel als het doel groter is dan het quotum voor gedeelde kernen voor het abonnement.
$TargetLowPriorityNodes Het doelaantal spot-rekenknooppunten voor de pool. Opgegeven als een doel omdat een pool mogelijk niet altijd het gewenste aantal knooppunten bereikt. Als het doelaantal spot-knooppunten bijvoorbeeld wordt gewijzigd door een evaluatie van automatische schaalaanpassing voordat de pool het oorspronkelijke doel heeft bereikt, bereikt de pool mogelijk het doel niet. Een pool bereikt mogelijk ook niet het doel als het doel een Batch-accountknooppunt of kernquotum overschrijdt.

Zie Spot-VM's gebruiken met Batch voor meer informatie over spot-rekenknooppunten.
$NodeDeallocationOption De actie die optreedt wanneer rekenknooppunten uit een pool worden verwijderd. Mogelijke waarden zijn:
- requeue: de standaardwaarde. Hiermee worden taken onmiddellijk beëindigd en teruggezet in de taakwachtrij, 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 actieve taken worden onderbroken en vervolgens opnieuw moeten worden gestart.
- beëindigen: beëindigt taken onmiddellijk en verwijdert ze uit de taakwachtrij.
- taakcompletion: wacht totdat de taken die momenteel worden uitgevoerd, worden voltooid en wordt het knooppunt uit de pool verwijderd. Gebruik deze optie om te voorkomen dat taken worden onderbroken en opnieuw in de wachtrij worden gezet, waarbij alle werkzaamheden die door de taak zijn uitgevoerd, worden weggenomen.
- retaineddata: wacht tot alle gegevens die door de lokale taak zijn bewaard op het knooppunt worden 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 de $TargetLowPriorityNodes variabele worden opgegeven met behulp van de alias $TargetLowPriority. Als zowel de volledig benoemde variabele als de alias worden ingesteld door de formule, heeft de waarde die is toegewezen aan de volledig benoemde variabele voorrang.

Alleen-lezen servicegedefinieerde variabelen

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

Belangrijk

Taakreleasetaken zijn momenteel niet opgenomen in variabelen die het aantal taken bieden, zoals $ActiveTasks en $PendingTasks. Afhankelijk van uw formule voor automatische schaalaanpassing kan dit ertoe leiden dat knooppunten worden verwijderd zonder knooppunten die beschikbaar zijn voor het uitvoeren van taakreleasetaken.

Tip

Deze alleen-lezen servicegedefinieerde variabelen zijn objecten die verschillende methoden bieden voor toegang tot gegevens die aan elke variabelen zijn gekoppeld. Zie Voorbeeldgegevens verkrijgen verderop in dit artikel voor meer informatie.

Variabele Beschrijving
$CPUPercent Het gemiddelde percentage cpu-gebruik.
$WallClockSeconds Het aantal seconden dat is verbruikt. Buiten gebruik stellen na 2024-mar-31.
$MemoryBytes Het gemiddelde aantal gebruikte megabytes. Buiten gebruik stellen na 2024-mar-31.
$DiskBytes Het gemiddelde aantal gigabytes dat op de lokale schijven wordt gebruikt. Buiten gebruik stellen na 2024-mar-31.
$DiskReadBytes Het aantal gelezen bytes. Buiten gebruik stellen na 2024-mar-31.
$DiskWriteBytes Het aantal geschreven bytes. Buiten gebruik stellen na 2024-mar-31.
$DiskReadOps Het aantal uitgevoerde leesschijfbewerkingen. Buiten gebruik stellen na 2024-mar-31.
$DiskWriteOps Het aantal uitgevoerde schrijfschijfbewerkingen. Buiten gebruik stellen na 2024-mar-31.
$NetworkInBytes Het aantal binnenkomende bytes. Buiten gebruik stellen na 2024-mar-31.
$NetworkOutBytes Het aantal uitgaande bytes. Buiten gebruik stellen na 2024-mar-31.
$SampleNodeCount Het aantal rekenknooppunten. Buiten gebruik stellen na 2024-mar-31.
$ActiveTasks Het aantal taken dat klaar is om uit te voeren, maar nog niet wordt uitgevoerd. Dit omvat alle taken die de actieve status hebben en waarvan aan de afhankelijkheden is voldaan. Alle taken die de actieve status hebben, maar waarvan niet aan de afhankelijkheden is voldaan, worden uitgesloten van het $ActiveTasks aantal. Voor een taak $ActiveTasks met meerdere exemplaren bevat u het aantal exemplaren dat voor de taak is ingesteld.
$RunningTasks Het aantal taken in een actieve status.
$PendingTasks De som van $ActiveTasks en $RunningTasks.
$SucceededTasks Het aantal taken dat is voltooid.
$FailedTasks Het aantal mislukte taken.
$TaskSlotsPerNode Het aantal taaksites dat kan worden gebruikt om gelijktijdige taken uit te voeren op één rekenknooppunt in de pool.
$CurrentDedicatedNodes Het huidige aantal toegewezen rekenknooppunten.
$CurrentLowPriorityNodes Het huidige aantal Spot-rekenknooppunten, inclusief knooppunten die zijn vervorderd.
$UsableNodeCount Het aantal bruikbare rekenknooppunten.
$PreemptedNodeCount Het aantal knooppunten in de pool met een geprempteerde status.

Waarschuwing

Selecteer door de service gedefinieerde variabelen worden na 31 maart 2024 buiten gebruik gesteld, zoals vermeld in de bovenstaande tabel. Na de buitengebruikstellingsdatum worden deze door de service gedefinieerde variabelen niet meer gevuld met voorbeeldgegevens. Stop het gebruik van deze variabelen vóór deze datum.

Notitie

Gebruik $RunningTasks deze functie wanneer u schaalt op basis van het aantal taken dat op een bepaald tijdstip wordt uitgevoerd en $ActiveTasks wanneer u schaalt op basis van het aantal taken dat in de wachtrij wordt geplaatst om uit te voeren.

Typen

Formules voor automatisch schalen ondersteunen de volgende typen:

  • dubbel
  • 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; bijvoorbeeld 13 betekent 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 worden vermeld in de vorige sectie.

Operation Niet-ondersteunde operators Resultaattype
dubbele operator dubbel +, -, *, / dubbel
dubbele operator timeinterval * timeinterval
doubleVec operator double +, -, *, / doubleVec
doubleVec operator doubleVec +, -, *, / doubleVec
timeinterval-operator dubbel *, / timeinterval
timeinterval van operator timeinterval +, - timeinterval
tijdstempel van time-intervaloperator + timestamp
timeinterval van tijdstempeloperator + timestamp
tijdstempel van tijdstempel van tijdstempel - timeinterval
operator double -, ! dubbel
time-interval van operator - timeinterval
dubbele operator dubbel <, <=, =, =, >=, >!= dubbel
tekenreeks voor tekenreeksoperator <, <=, =, =, >=, >!= dubbel
tijdstempel van tijdstempel van tijdstempel <, <=, =, =, >=, >!= dubbel
timeinterval van operator timeinterval <, <=, =, =, >=, >!= dubbel
dubbele operator dubbel &&, || dubbel

Het testen van een dubbel met een ternaire operator (double ? statement1 : statement2), resulteert in niet-nul als waar en nul als onwaar.

Functions

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

Functie Resultaattype Beschrijving
avg(doubleVecList) dubbel Retourneert de gemiddelde waarde voor alle waarden in de doubleVecList.
ceil(double) dubbel Retourneert de kleinste gehele waarde die niet kleiner is dan het dubbele getal.
ceil(doubleVecList) doubleVec Retourneert het componentgewijs ceil van de doubleVecList.
floor(double) dubbel Retourneert de grootste gehele waarde die niet groter is dan het dubbele getal.
floor(doubleVecList) doubleVec Retourneert het componentgewijs floor van de doubleVecList.
len(doubleVecList) dubbel Retourneert de lengte van de vector die is gemaakt op basis van de doubleVecList.
lg(double) dubbel Retourneert de logboekbasis 2 van het dubbele.
lg(doubleVecList) doubleVec Retourneert het componentgewijs lg van de doubleVecList.
ln(dubbel) dubbel Retourneert het natuurlijke logboek van het dubbele.
ln(doubleVecList) doubleVec Retourneert het componentgewijs ln van de doubleVecList.
log(double) dubbel Retourneert de logboekbasis 10 van het dubbele.
log(doubleVecList) doubleVec Retourneert het componentgewijs log van de doubleVecList.
max(doubleVecList) dubbel Retourneert de maximumwaarde in de doubleVecList.
min(doubleVecList) dubbel Retourneert de minimumwaarde in de doubleVecList.
norm (doubleVecList) dubbel Retourneert de twee-norm van de vector die is gemaakt op basis van de doubleVecList.
percentiel (doubleVec v, dubbele p) dubbel Retourneert het percentielelement van de vector v.
rand() dubbel Retourneert een willekeurige waarde tussen 0,0 en 1,0.
range(doubleVecList) dubbel Retourneert het verschil tussen de minimum- en maximumwaarden in de doubleVecList.
round(double) dubbel Retourneert de dichtstbijzijnde gehele waarde naar het dubbele getal (in drijvendekommage-notatie), waarbij halve gevallen van nul worden afgerond.
round(doubleVecList) doubleVec Retourneert het componentgewijs round van de doubleVecList.
std(doubleVecList) dubbel Retourneert de standaarddeviatie van de steekproef van de waarden in de doubleVecList.
stop() Hiermee stopt u de evaluatie van de expressie voor automatisch schalen.
sum(doubleVecList) dubbel Retourneert de som van alle onderdelen van de doubleVecList.
time(tekenreeks dateTime="") timestamp Retourneert de tijdstempel van de huidige tijd als er geen parameters worden doorgegeven, of het tijdstempel van de tekenreeks dateTime als dat wordt doorgegeven. Ondersteunde datum/tijd-indelingen zijn W3C-DTF en RFC 1123.
val(doubleVec v, double i) dubbel Retourneert de waarde van het element dat zich op locatie i in vector v bevindt, met een beginindex van nul.

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

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

De waarde doubleVecList wordt vóór de evaluatie geconverteerd naar één doubleVec . Als bijvoorbeeld v = [1,2,3]bellen avg(v) gelijk is aan bellen avg(1,2,3). Bellen avg(v, 7) is gelijk aan bellen avg(1,2,3,7).

Metrische gegevens voor

U kunt metrische gegevens van resources en taken gebruiken wanneer u een formule definieert. 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 voor meer informatie over elke metrische waarde.

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 knooppunten:
- $TargetDedicatedNodes
- $TargetLowPriorityNodes
- $CurrentDedicatedNodes
- $CurrentLowPriorityNodes
- $PreemptedNodeCount
- $UsableNodeCount

Deze door de service gedefinieerde variabelen zijn handig voor het aanbrengen van aanpassingen op basis van het resourcegebruik van knooppunten:
- $CPUPercent
- $WallClockSeconds
- $MemoryBytes
- $DiskBytes
- $DiskReadBytes
- $DiskWriteBytes
- $DiskReadOps
- $DiskWriteOps
- $NetworkInBytes
- $NetworkOutBytes
Opdracht Metrische taakgegevens 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 poolgrootte op basis van metrische taakgegevens:
- $ActiveTasks
- $RunningTasks
- $PendingTasks
- $SucceededTasks
- $FailedTasks

Voorbeeldgegevens verkrijgen

De kernbewerking van een formule voor automatisch schalen is het verkrijgen van taak- en resourcegegevens (voorbeelden) en vervolgens de poolgrootte aanpassen op basis van die gegevens. Daarom is het belangrijk dat u duidelijk begrijpt hoe formules voor automatisch schalen communiceren met voorbeelden.

Methoden

Formules automatisch schalen op voorbeelden van metrische gegevens die worden geleverd door de Batch-service. Een formule groeit of verkleint de rekenknooppunten van de pool op basis van de waarden die deze verkrijgt. Door de service gedefinieerde variabelen zijn objecten die methoden bieden voor toegang tot gegevens die aan dat object zijn gekoppeld. In de volgende expressie ziet u bijvoorbeeld een aanvraag voor het ophalen van het laatste vijf minuten CPU-gebruik:

$CPUPercent.GetSample(TimeInterval_Minute * 5)

De volgende methoden kunnen worden gebruikt om voorbeeldgegevens te verkrijgen over door de service gedefinieerde variabelen.

Wijze Description
GetSample() De GetSample() methode retourneert een vector van gegevensvoorbeelden.

Een voorbeeld is 30 seconden aan metrische gegevens. Met andere woorden, monsters worden elke 30 seconden verkregen. Maar zoals hieronder vermeld, is er een vertraging tussen wanneer een steekproef wordt verzameld en wanneer deze beschikbaar is voor een formule. Als zodanig zijn niet alle steekproeven voor een bepaalde periode mogelijk beschikbaar voor evaluatie door een formule.

- doubleVec GetSample(double count): Hiermee geeft u het aantal monsters op dat moet worden verkregen uit de meest recente monsters die zijn verzameld. GetSample(1) retourneert het laatste beschikbare voorbeeld. Voor metrische gegevens, zoals $CPUPercent, moeten echter GetSample(1) niet worden gebruikt, omdat het onmogelijk is om te weten wanneer het voorbeeld is verzameld. Het kan recent zijn, of vanwege systeemproblemen kan het 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. Desgewenst geeft het ook het percentage monsters op dat beschikbaar moet zijn in het aangevraagde tijdsbestek. Retourneert bijvoorbeeld $CPUPercent.GetSample(TimeInterval_Minute * 10) 20 steekproeven als alle steekproeven voor de afgelopen 10 minuten aanwezig zijn in de CPUPercent geschiedenis. Als de laatste minuut van de geschiedenis niet beschikbaar was, worden slechts 18 steekproeven geretourneerd. In dit geval $CPUPercent.GetSample(TimeInterval_Minute * 10, 95) mislukt omdat slechts 90 procent van de steekproeven 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 wanneer een steekproef wordt verzameld en wanneer deze beschikbaar is voor een formule. Houd rekening met deze vertraging wanneer u de GetSample methode gebruikt. Zie GetSamplePercent hieronder.
GetSamplePeriod() Retourneert de periode van steekproeven die zijn genomen in een historische steekproefgegevensset.
Count() Retourneert het totale aantal voorbeelden in de geschiedenis van metrische gegevens.
HistoryBeginTime() Retourneert het tijdstempel van het oudste beschikbare gegevensvoorbeeld voor de metrische waarde.
GetSamplePercent() Retourneert het percentage steekproeven dat beschikbaar is voor een bepaald tijdsinterval. Bijvoorbeeld: doubleVec GetSamplePercent( (timestamp or timeinterval) startTime [, (timestamp or timeinterval) endTime] ). Omdat de GetSample methode mislukt als het geretourneerde percentage monsters kleiner is dan het samplePercent opgegeven, kunt u de GetSamplePercent methode gebruiken om eerst te controleren. Vervolgens kunt u een alternatieve actie uitvoeren als er onvoldoende voorbeelden aanwezig zijn, zonder de automatische schaalaanpassing te stoppen.

Voorbeelden

De Batch-service neemt periodiek voorbeelden van metrische taak- en resourcegegevens 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 (en gelezen door) uw formules voor automatische schaalaanpassing. Daarnaast worden voorbeelden mogelijk niet vastgelegd voor een bepaald interval vanwege factoren zoals netwerk- of andere infrastructuurproblemen.

Voorbeeldpercentage

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

Laten we eens kijken naar een periode van 10 minuten als voorbeeld. Omdat monsters elke 30 seconden binnen die periode van 10 minuten worden vastgelegd, is het maximumaantal monsters dat door Batch is vastgelegd 20 monsters (2 per minuut). Vanwege de inherente latentie van het rapportagemechanisme en andere problemen in Azure zijn er echter mogelijk slechts 15 voorbeelden beschikbaar voor uw formule voor automatische schaalaanpassing voor lezen. Voor die periode van 10 minuten is er dus slechts 75 procent van het totale aantal opgenomen steekproeven beschikbaar voor uw formule.

GetSample() en voorbeeldbereiken

Uw formules voor automatisch schalen groeien en verkleinen 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. Het is raadzaam om een trending-type analyse te gebruiken in uw formules. Dit type groeit en verkleint uw pools op basis van een reeks verzamelde voorbeelden.

Gebruik GetSample(interval look-back start, interval look-back end) hiervoor om een vector met steekproeven te retourneren:

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

Wanneer Batch de bovenstaande regel evalueert, retourneert het een reeks voorbeelden als een vector met waarden. Voorbeeld:

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

Nadat u de vector van steekproeven hebt verzameld, kunt u functies zoals min(), max()gebruiken en avg() zinvolle waarden afleiden uit het verzamelde bereik.

Om extra voorzichtig te zijn, kunt u afdwingen dat een formule-evaluatie mislukt als er minder dan een bepaald steekproefpercentage beschikbaar is voor een bepaalde periode. Wanneer u afdwingen dat een formule-evaluatie mislukt, geeft u Batch de opdracht om de formule verder te evalueren als het opgegeven percentage steekproeven niet beschikbaar is. In dit geval wordt er geen wijziging aangebracht in de poolgrootte. Als u een vereist percentage steekproeven wilt opgeven voor de evaluatie die moet worden uitgevoerd, geeft u deze op als de derde parameter voor GetSample(). Hier wordt een vereiste van 75 procent van de steekproeven opgegeven:

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

Omdat er mogelijk een vertraging is in de beschikbaarheid van de steekproef, moet u altijd een tijdsbereik opgeven met een begintijd die ouder is dan één minuut. Het duurt ongeveer één minuut voordat voorbeelden via het systeem worden doorgegeven, zodat voorbeelden in het bereik (0 * TimeInterval_Second, 60 * TimeInterval_Second) mogelijk niet beschikbaar zijn. Ook hier kunt u de percentageparameter gebruiken GetSample() om een bepaalde steekproefpercentagevereiste af te dwingen.

Belangrijk

We raden u ten zeerste aan om te voorkomen dat u alleenGetSample(1) vertrouwt in uw formules voor automatische schaalaanpassing. Dit komt omdat GetSample(1) in wezen aan de Batch-service staat: 'Geef me het laatste voorbeeld dat u had, ongeacht hoe lang geleden u het hebt opgehaald.' Omdat het slechts één steekproef is en het mogelijk een oudere steekproef is, is het mogelijk niet representatief voor het grotere beeld van de recente taak of resourcestatus. Als u dit wel doet GetSample(1), moet u ervoor zorgen dat deze deel uitmaakt van een grotere instructie en niet het enige gegevenspunt waarvan uw formule afhankelijk is.

Een formule voor automatische schaalaanpassing schrijven

U bouwt een formule voor automatische schaalaanpassing door instructies te vormen die gebruikmaken van de bovenstaande onderdelen en deze instructies vervolgens te combineren tot een volledige formule. In deze sectie maakt u een voorbeeld van een formule voor automatisch schalen waarmee echte beslissingen voor schaalaanpassing kunnen worden genomen en aanpassingen kunnen worden aangebracht.

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

  • Verhoog het doelaantal toegewezen rekenknooppunten in een pool als het CPU-gebruik hoog is.
  • Verlaag 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 die taken uitvoeren; wacht zo nodig totdat taken zijn voltooid voordat u knooppunten verwijdert.

De eerste instructie in de formule verhoogt het aantal knooppunten tijdens hoog CPU-gebruik. U definieert een instructie die een door de gebruiker gedefinieerde variabele ($totalDedicatedNodes) vult met een waarde die 110 procent van het huidige doelaantal toegewezen knooppunten is, maar alleen als het minimale gemiddelde CPU-gebruik in de afgelopen 10 minuten hoger was dan 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;

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

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

Beperk nu het doelaantal toegewezen rekenknooppunten tot maximaal 400.

$TargetDedicatedNodes = min(400, $totalDedicatedNodes);

Controleer ten slotte of knooppunten pas worden verwijderd nadat 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 kiest, kunt u zowel opmerkingen als regeleinden opnemen in formuletekenreeksen. Houd er ook rekening mee 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 automatische schaalaanpassing. 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 een fout met een ongeldige aanvraag (400).

Notitie

Automatische schaalaanpassing is momenteel niet bedoeld om te reageren op wijzigingen in minder dan een minuut, maar is eerder bedoeld om de grootte van uw pool geleidelijk aan te passen wanneer u een workload uitvoert.

Een pool met automatische schaalaanpassing maken met Batch SDK's

Automatische schaalaanpassing van pools kan worden geconfigureerd met behulp van een van de Batch SDK's, de Batch REST APIBatch PowerShell-cmdlets en de Batch CLI. In deze sectie ziet u voorbeelden voor zowel .NET als Python.

.NET

Als u een pool wilt maken waarvoor automatisch schalen is ingeschakeld in .NET, voert u de volgende stappen uit:

  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 automatische schaalaanpassing.
  4. (Optioneel) Stel de eigenschap CloudPool.AutoScaleEvaluationInterval in (de standaardwaarde is 15 minuten).
  5. Voer de pool door met CloudPool.Commit of CommitAsync.

In het volgende voorbeeld wordt een pool met automatische schaalaanpassing gemaakt in .NET. Met de formule voor automatische schaalaanpassing van de pool wordt het doelaantal toegewezen knooppunten ingesteld op 5 op maandag en op elke andere dag van de week op 1. Het interval voor automatisch schalen is ingesteld op 30 minuten. In dit en de andere C#-fragmenten in dit artikel is myBatchClient het een correct geïnitialiseerd exemplaar 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 met automatische schaalaanpassing maakt, geeft u de parameter targetDedicatedNodes of de parameter targetLowPriorityNodes niet op in de aanroep naar CreatePool. Geef in plaats daarvan de AutoScaleEnabled en AutoScaleFormula eigenschappen voor de pool op. De waarden voor deze eigenschappen bepalen het doelnummer van elk type knooppunt.

Als u het formaat van een pool met automatische schaalaanpassing handmatig wilt wijzigen (bijvoorbeeld met BatchClient.PoolOperations.ResizePoolAsync), moet u eerst automatisch schalen in de pool uitschakelen en vervolgens het formaat ervan wijzigen.

Tip

Zie de Batch .NET Quickstart-opslagplaats op GitHub voor meer voorbeelden van het gebruik van de .NET SDK.

Python

Een pool met automatische schaalaanpassing maken met de Python SDK:

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

In het volgende voorbeeld ziet u deze stappen.

# 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

Zie de Batch Python-snelstartopslagplaats op GitHub voor meer voorbeelden van het gebruik van de Python-SDK.

Automatisch schalen inschakelen voor een bestaande pool

Elke Batch SDK biedt een manier om automatisch schalen in te schakelen. Voorbeeld:

Houd rekening met het volgende wanneer u automatische schaalaanpassing inschakelt voor een bestaande pool:

  • Als automatisch schalen momenteel is uitgeschakeld in de pool, moet u een geldige formule voor automatische schaalaanpassing opgeven wanneer u de aanvraag verzendt. U kunt desgewenst een automatisch schaalinterval opgeven. Als u geen interval opgeeft, wordt de standaardwaarde van 15 minuten gebruikt.
  • Als automatisch 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 interval voor automatisch schalen opgeeft, wordt het bestaande schema gestopt en wordt er een nieuw schema gestart. De begintijd van de nieuwe planning is het tijdstip waarop de aanvraag voor het inschakelen van automatisch schalen is uitgegeven.
    • Als u de formule of het interval voor automatische schaalaanpassing weglaat, 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 CreatePool methode bij het maken van de pool in .NET of voor de vergelijkbare parameters in een andere taal, worden deze waarden genegeerd wanneer de formule voor automatische schaalaanpassing wordt geëvalueerd.

In dit C#-voorbeeld wordt de Batch .NET-bibliotheek gebruikt om automatisch schalen in te schakelen 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 automatische schaalaanpassing bijwerken

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

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

Het interval voor automatische schaalaanpassing bijwerken

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

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

Een formule voor automatische schaalaanpassing evalueren

U kunt een formule evalueren voordat u deze toepast op een pool. Hiermee kunt u de resultaten van de formule testen voordat u deze in productie neemt.

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

In het volgende Batch .NET-voorbeeld wordt een formule voor automatische schaalaanpassing geëvalueerd. Als de pool nog geen automatische schaalaanpassing gebruikt, schakelt u deze eerst in.

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

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 ophalen over uitvoeringen van automatische schaalaanpassing

Het is raadzaam om regelmatig de evaluatie van uw formule voor automatische schaalaanpassing van de Batch-service te controleren. Als u dit wilt doen, haalt u een verwijzing naar de pool op (of vernieuwt) en bekijkt u vervolgens de eigenschappen van de laatste uitvoering van automatische schaalaanpassing.

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

In de REST API retourneert de informatie over een poolaanvraag informatie over de pool, die de meest recente informatie over de automatische schaalaanpassing bevat in de eigenschap AutoScaleRun .

In het volgende C#-voorbeeld wordt de Batch .NET-bibliotheek gebruikt om informatie af te drukken over de laatste automatische schaalaanpassing die wordt uitgevoerd op pool 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);

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:

Uitvoeringsgeschiedenis van automatische schaalaanpassing ophalen met behulp van gebeurtenissen voor automatisch schalen van pools

U kunt ook de geschiedenis van automatische schaalaanpassing controleren door een query uit te voeren op PoolAutoScaleEvent. Batch verzendt deze gebeurtenis om elk exemplaar van de evaluatie en uitvoering van formules voor automatische schaalaanpassing vast te leggen. 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 paar formules waarin verschillende manieren worden weergegeven om de hoeveelheid rekenresources 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 weekdag (1-5) is en binnen kantooruren (8:00 tot 18:00 uur), wordt de grootte van de doelgroep ingesteld op 20 knooppunten. Anders is 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;

$curTimekan worden aangepast om uw lokale tijdzone weer te geven door het product van TimeZoneInterval_Hour en uw UTC-offset toe te voegentime(). Gebruik bijvoorbeeld $curTime = time() + (-6 * TimeInterval_Hour); voor 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. Zowel opmerkingen als regeleinden worden opgenomen in de formuletekenreeksen.

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

Voorbeeld 3: Boekhouding 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 methode is handig in situaties waarin parallelle taakuitvoering is ingeschakeld voor 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: De oorspronkelijke poolgrootte instellen

In dit voorbeeld ziet u een C#-voorbeeld met een formule voor automatische schaalaanpassing waarmee de poolgrootte wordt ingesteld op een opgegeven aantal knooppunten voor een initiële periode. Daarna wordt de poolgrootte aangepast op basis van het aantal actieve en actieve taken.

Deze formule doet het volgende:

  • Hiermee stelt u de oorspronkelijke poolgrootte in op vier knooppunten.
  • De poolgrootte wordt niet aangepast binnen de eerste 10 minuten van de levenscyclus van de pool.
  • Na 10 minuten krijgt u de maximale waarde van het aantal actieve en actieve taken binnen de afgelopen 60 minuten.
    • Als beide waarden 0 zijn, waarmee wordt aangegeven dat de afgelopen 60 minuten geen taken werden uitgevoerd of actief waren, is 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