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 variable1
en 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 $PendingTasks
geteld. 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. |
$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. |
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.
Functies
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
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 |
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:
- CloudPool.AutoScaleEvaluationInterval (Batch .NET)
- autoScaleEvaluationInterval (REST API)
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 API Batch 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:
- Maak de pool met BatchClient.PoolOperations.CreatePool.
- Stel de eigenschap CloudPool.AutoScaleEnabled in op true.
- Stel de eigenschap CloudPool.AutoScaleFormula in met uw formule voor automatische schaalaanpassing.
- (Optioneel) Stel de eigenschap CloudPool.AutoScaleEvaluationInterval in (de standaardwaarde is 15 minuten).
- 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:
- Maak een pool en geef de configuratie op.
- Voeg de pool toe aan de serviceclient.
- 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:
- BatchClient.PoolOperations.EnableAutoScaleAsync (Batch .NET)
- Automatisch schalen inschakelen voor een pool (REST API)
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 = 0
met één regel. Gebruik vervolgens een van de volgende opties om de formule te evalueren die u wilt testen:
BatchClient.PoolOperations.EvaluateAutoScale of EvaluateAutoScaleAsync
Voor deze Batch .NET-methoden is de id van een bestaande pool en een tekenreeks met de formule voor automatische schaalaanpassing vereist om te evalueren.
Een formule voor automatisch schalen evalueren
Geef in deze REST API-aanvraag de pool-id op in de URI en de formule voor automatisch schalen in het element autoScaleFormula van de aanvraagbody. Het antwoord van de bewerking bevat foutgegevens die mogelijk betrekking hebben op de formule.
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 bevat informatie over een pool de meest recente informatie over het automatisch schalen van uitvoeringen 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;
$curTime
kan 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
- Meer informatie over het gelijktijdig uitvoeren van meerdere taken op de rekenknooppunten in uw pool. Naast automatisch schalen kan dit helpen om de duur van taken voor sommige workloads te verlagen, waardoor u geld bespaart.
- Leer hoe u efficiënt query's uitvoert op de Azure Batch-service.