Creare una formula di scalabilità automatica per i nodi di calcolo in un pool Batch

Azure Batch può ridimensionare automaticamente i pool in base ai parametri definiti, risparmiando tempo e denaro. Con il ridimensionamento automatico, Batch aggiunge dinamicamente nodi a un pool man mano che aumentano le richieste di attività e rimuove i nodi di calcolo man mano che le richieste di attività diminuiscono.

Per abilitare il ridimensionamento automatico in un pool di nodi di calcolo, associare il pool a una formula di scalabilità automatica definita. Il servizio Batch usa la formula di scalabilità automatica per determinare il numero di nodi necessari per eseguire il carico di lavoro. Questi nodi possono essere nodi dedicati o nodi spot di Azure. Batch esamina periodicamente i dati delle metriche del servizio e lo usa per modificare il numero di nodi nel pool in base alla formula e a un intervallo definito dall'utente.

È possibile abilitare il ridimensionamento automatico quando si crea un pool o applicarlo a un pool esistente. Batch consente di valutare le formule prima di assegnarle ai pool e di monitorare lo stato delle esecuzioni di ridimensionamento automatico. Dopo aver configurato un pool con il ridimensionamento automatico, è possibile apportare modifiche alla formula in un secondo momento.

Importante

Quando si crea un account Batch, è possibile specificare la modalità di allocazione del pool, che determina se i pool vengono allocati in una sottoscrizione del servizio Batch (impostazione predefinita) o nella sottoscrizione utente. Se è stato creato l'account Batch con la configurazione predefinita del servizio Batch, l'account è limitato a un numero massimo di core che possono essere usati per l'elaborazione. Il servizio Batch gestisce la scalabilità dei nodi di calcolo solo fino al raggiungimento del limite di core. Per questo motivo, il servizio Batch potrebbe non raggiungere il numero di nodi di calcolo specificato da una formula di scalabilità automatica. Per informazioni su come visualizzare e aumentare le quote dell'account, vedere Quote e limiti per il servizio Azure Batch.

Se è stato creato l'account con la modalità di sottoscrizione utente, l'account condivide la quota principale per la sottoscrizione. Per altre informazioni, vedere Limiti relativi a Macchine virtuali in Sottoscrizione di Azure e limiti, quote e vincoli dei servizi.

Formule di scalabilità automatica

Una formula di scalabilità automatica è un valore stringa definito che contiene una o più istruzioni. La formula di scalabilità automatica viene assegnata all'elemento autoScaleFormula di un pool (Batch REST) o alla proprietà CloudPool.AutoScaleFormula (Batch .NET). Il servizio Batch usa la formula per determinare il numero di nodi di calcolo di destinazione del pool per l'intervallo di elaborazione successivo. La stringa della formula non può superare 8 KB, può includere fino a 100 istruzioni separate da punti e virgola e possono includere interruzioni di riga e commenti.

È possibile considerare le formule di ridimensionamento automatico come un "linguaggio" di scalabilità automatica di Batch. Le istruzioni formula sono espressioni in formato libero che possono includere variabili definite dal servizio, definite dal servizio Batch e variabili definite dall'utente. Le formule possono eseguire varie operazioni su questi valori usando tipi, operatori e funzioni predefiniti. Ad esempio, un'istruzione può avere il formato seguente:

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

Le formule contengono in genere più istruzioni che eseguono operazioni su valori ottenuti nelle istruzioni precedenti. Ad esempio, ottenere prima un valore per variable1, quindi passarlo a una funzione per popolare variable2:

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

Includere queste istruzioni nella formula di scalabilità automatica per arrivare al numero di nodi di calcolo di destinazione. I nodi dedicati e i nodi spot hanno ognuna le proprie impostazioni di destinazione. Una formula di scalabilità automatica può includere un valore di destinazione per i nodi dedicati, un valore di destinazione per i nodi Spot o entrambi.

Il numero di nodi di destinazione potrebbe essere superiore, inferiore o uguale al numero corrente di nodi di quel tipo nel pool. Batch valuta la formula di scalabilità automatica di un pool a intervalli di ridimensionamento automatico specifici. Batch regola quindi il numero di nodi di destinazione di ogni tipo nel pool in base al numero specificato dalla formula di scalabilità automatica al momento della valutazione.

Formule di scalabilità automatica di esempio

Gli esempi seguenti illustrano due formule di scalabilità automatica, che possono essere modificate per funzionare per la maggior parte degli scenari. Le variabili startingNumberOfVMs e maxNumberofVMs nelle formule di esempio possono essere modificate in base alle esigenze.

Attività in sospeso

Con questa formula di scalabilità automatica il pool viene inizialmente creato con una singola macchina virtuale. La metrica $PendingTasks definisce il numero di attività in esecuzione o in coda. La formula trova il numero medio di attività in sospeso negli ultimi 180 secondi e imposta la variabile $TargetDedicatedNodes di conseguenza. La formula garantisce che il numero di nodi dedicati di destinazione non superi mai 25 macchine virtuali. Man mano che vengono inviate nuove attività, il pool si espande automaticamente. Al termine delle attività, le macchine virtuali diventano gratuite e la formula di scalabilità automatica riduce il pool.

Questa formula ridimensiona i nodi dedicati, ma può essere modificata per applicare anche i nodi spot.

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;

Importante

Attualmente, il servizio Batch presenta limitazioni per la risoluzione delle attività in sospeso. Quando un'attività viene aggiunta al processo, viene aggiunta anche in una coda interna usata dal servizio Batch per la pianificazione. Se l'attività viene eliminata prima che possa essere pianificata, l'attività potrebbe rimanere persistente all'interno della coda, causandone il conteggio in $PendingTasks. Questa attività eliminata verrà infine cancellata dalla coda quando Batch ha la possibilità di eseguire il pull delle attività dalla coda per pianificare con nodi inattive nel pool di Batch.

Nodi interrotti

Questo esempio crea un pool che inizia con 25 nodi spot. Ogni volta che viene superato un nodo Spot, viene sostituito con un nodo dedicato. Come nel primo esempio, la variabile maxNumberofVMs impedisce al pool di superare 25 VM. Questo esempio è utile per sfruttare i vantaggi delle macchine virtuali spot, assicurando allo stesso tempo che si verifichi solo un numero fisso di preemptions per la durata del pool.

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

Altre informazioni su come creare formule di scalabilità automatica e vedere altre formule di scalabilità automatica di esempio più avanti in questo articolo.

Variabili

Nelle formule di scalabilità automatica è possibile usare sia variabili definite dal servizio sia variabili definite dall'utente.

Le variabili definite dal servizio sono incorporate nel servizio Batch. Alcune sono in lettura/scrittura e altre di sola lettura.

Le variabili definite dall'utente vengono configurate dall'utente. Nell'esempio $TargetDedicatedNodes precedente e $PendingTasks sono variabili definite dal servizio, mentre startingNumberOfVMs e maxNumberofVMs sono variabili definite dall'utente.

Nota

Le variabili definite dal servizio sono sempre precedute da un segno di dollaro ($). Per le variabili definite dall'utente il segno di dollaro è facoltativo.

Le tabelle seguenti illustrano le variabili di lettura/scrittura e di sola lettura definite dal servizio Batch.

Variabili in lettura/scrittura definite dal servizio

È possibile ottenere e impostare i valori di queste variabili definite dal servizio per gestire il numero di nodi di calcolo in un pool.

Variabile Descrizione
$TargetDedicatedNodes Numero di destinazione dei nodi di calcolo dedicati per il pool. Specificato come destinazione perché un pool potrebbe non ottenere sempre il numero desiderato di nodi. Ad esempio, se il numero di destinazione di nodi dedicati viene modificato da una valutazione di scalabilità automatica prima che il pool abbia raggiunto la destinazione iniziale, il pool potrebbe non raggiungere la destinazione.

Un pool in un account creato in modalità servizio Batch potrebbe non raggiungere la destinazione se la destinazione supera una quota di core o un nodo dell'account Batch. Un pool in un account creato in modalità sottoscrizione utente potrebbe non raggiungere la destinazione se la destinazione supera la quota di core condivisa per la sottoscrizione.
$TargetLowPriorityNodes Numero di destinazione di nodi di calcolo spot per il pool. Specificato come destinazione perché un pool potrebbe non ottenere sempre il numero desiderato di nodi. Ad esempio, se il numero di destinazione dei nodi spot viene modificato da una valutazione di scalabilità automatica prima che il pool abbia raggiunto la destinazione iniziale, il pool potrebbe non raggiungere la destinazione. Un pool potrebbe anche non raggiungere la destinazione se la destinazione supera una quota di core o un nodo dell'account Batch.

Per altre informazioni sui nodi di calcolo spot, vedere Usare macchine virtuali spot con Batch.
$NodeDeallocationOption L'azione che si verifica quando i nodi di calcolo vengono rimossi da un pool. I valori possibili sono:
- requeue: valore predefinito. Termina immediatamente le attività e le rimette nella coda dei processi in modo che vengano riprogrammate. Questa azione garantisce che il numero di nodi di destinazione venga raggiunto il più rapidamente possibile. Tuttavia, potrebbe essere meno efficiente, perché le attività in esecuzione vengono interrotte e quindi devono essere riavviate.
- terminate: termina immediatamente le attività e le rimuove dalla coda di processi.
- taskcompletion: attende il completamento delle attività attualmente in esecuzione e quindi rimuove il nodo dal pool. Usare questa opzione per evitare che le attività vengano interrotte e rieseguendo la coda, sprecare qualsiasi lavoro eseguito dall'attività.
- retaineddata: attende che tutti i dati locali conservati dall'attività nel nodo vengano puliti prima di rimuovere il nodo dal pool.

Nota

La variabile $TargetDedicatedNodes può anche essere specificata con l'alias $TargetDedicated. Analogamente, la variabile $TargetLowPriorityNodes può essere specificata con l'alias $TargetLowPriority. Se sia la variabile completamente denominata che il relativo alias vengono impostati dalla formula, il valore assegnato alla variabile completamente denominata ha la precedenza.

Variabili di sola lettura definite dal servizio

È possibile ottenere il valore di queste variabili definite dal servizio per apportare modifiche basate sulle metriche del servizio Batch.

Importante

Le attività di rilascio dei processi non sono attualmente incluse nelle variabili che forniscono conteggi delle attività, ad esempio $ActiveTasks e $PendingTasks. A seconda della formula di scalabilità automatica, questo può comportare la rimozione dei nodi senza nodi disponibili per l'esecuzione delle attività di rilascio dei processi.

Suggerimento

Queste variabili definite dal servizio di sola lettura sono oggetti che forniscono vari metodi per accedere ai dati associati a ognuno di essi. Per altre informazioni, vedere Ottenere dati di esempio più avanti in questo articolo.

Variabile Descrizione
$CPUPercent Percentuale media di utilizzo della CPU.
$WallClockSeconds Numero di secondi utilizzati. Ritiro dopo il 2024-mar-31.
$MemoryBytes Numero medio di megabyte usati. Ritiro dopo il 2024-mar-31.
$DiskBytes Numero medio di gigabyte usati sui dischi locali. Ritiro dopo il 2024-mar-31.
$DiskReadBytes Numero di byte letti. Ritiro dopo il 2024-mar-31.
$DiskWriteBytes Numero di byte scritti. Ritiro dopo il 2024-mar-31.
$DiskReadOps Numero di operazioni di lettura del disco eseguite. Ritiro dopo il 2024-mar-31.
$DiskWriteOps Numero di operazioni di scrittura sul disco eseguite. Ritiro dopo il 2024-mar-31.
$NetworkInBytes Numero di byte in ingresso. Ritiro dopo il 2024-mar-31.
$NetworkOutBytes Numero di byte in uscita. Ritiro dopo il 2024-mar-31.
$SampleNodeCount Conteggio dei nodi di calcolo. Ritiro dopo il 2024-mar-31.
$ActiveTasks Numero di attività pronte per l'esecuzione, ma non ancora in esecuzione. Sono incluse tutte le attività nello stato attivo e le cui dipendenze sono state soddisfatte. Tutte le attività che si trovano nello stato attivo, ma le cui dipendenze non sono state soddisfatte vengono escluse dal $ActiveTasks conteggio. Per un'attività a istanze multipla, $ActiveTasks include il numero di istanze impostate nell'attività.
$RunningTasks Numero di attività nello stato in corso di esecuzione.
$PendingTasks Somma di $ActiveTasks e $RunningTasks.
$SucceededTasks Numero di attività completate correttamente.
$FailedTasks Numero di attività non riuscite.
$TaskSlotsPerNode Numero di slot di attività che possono essere usati per eseguire attività simultanee in un singolo nodo di calcolo nel pool.
$CurrentDedicatedNodes Numero corrente di nodi di calcolo dedicati.
$CurrentLowPriorityNodes Numero corrente di nodi di calcolo Spot, inclusi tutti i nodi che sono stati annullati.
$UsableNodeCount Numero di nodi di calcolo utilizzabili.
$PreemptedNodeCount Il numero di nodi nel pool che si trovano nello stato Annullato.

Avviso

Selezionare le variabili definite dal servizio verranno ritirati dopo il 31 marzo 2024 , come indicato nella tabella precedente. Dopo la data di ritiro, queste variabili definite dal servizio non verranno più popolate con dati di esempio. Interrompere l'uso di queste variabili prima di questa data.

Nota

Usare $RunningTasks quando si esegue il ridimensionamento in base al numero di attività in esecuzione in un momento specifico e $ActiveTasks quando si ridimensiona in base al numero di attività in coda per l'esecuzione.

Tipi

Le formule di scalabilità automatica supportano i tipi seguenti:

  • double
  • doubleVec
  • doubleVecList
  • string
  • timestamp: struttura composta che contiene i membri seguenti:
    • year
    • month (1-12)
    • day (1-31)
    • weekday (in formato numero, ad esempio 1 per lunedì)
    • hour (in formato 24 ore, ad esempio 13 per indicare le ore 13.00)
    • minute (00-59)
    • second (00-59)
  • timeinterval
    • TimeInterval_Zero
    • TimeInterval_100ns
    • TimeInterval_Microsecond
    • TimeInterval_Millisecond
    • TimeInterval_Second
    • TimeInterval_Minute
    • TimeInterval_Hour
    • TimeInterval_Day
    • TimeInterval_Week
    • TimeInterval_Year

Operazioni

Queste operazioni sono consentite sui tipi elencati nella sezione precedente.

Operazione Operatori supportati Tipo di risultato
double operatore double +, -, *, / double
double operatore timeinterval * timeInterval
doubleVec operatore double +, -, *, / doubleVec
doubleVec operatore doubleVec +, -, *, / doubleVec
timeinterval operatore double *, / timeInterval
timeinterval operatore timeinterval +, - timeInterval
timeinterval operatore timestamp + timestamp
timestamp operatore timeinterval + timestamp
timestamp operatore timestamp - timeInterval
operator double -, ! double
operatore timeinterval - timeInterval
double operatore double <, <=, ==, >=, >, != double
string operatore string <, <=, ==, >=, >, != double
timestamp operatore timestamp <, <=, ==, >=, >, != double
timeinterval operatore timeinterval <, <=, ==, >=, >, != double
double operatore double &&, || double

Il test di un double con un operatore ternario (double ? statement1 : statement2), comporta un valore diverso da zero come true e zero come false.

Funzioni

È possibile usare queste funzioni predefinite quando si definisce una formula di scalabilità automatica.

Funzione Tipo restituito Descrizione
avg(doubleVecList) double Restituisce il valore medio per tutti i valori in doubleVecList.
ceil(double) double Restituisce il valore intero più piccolo non minore del valore double.
ceil(doubleVecList) doubleVec Restituisce il componente dell'oggetto ceil doubleVecList.
floor(double) double Restituisce il valore intero più grande non maggiore del valore double.
floor(doubleVecList) doubleVec Restituisce il componente dell'oggetto floor doubleVecList.
len(doubleVecList) double Restituisce la lunghezza del vettore creato da doubleVecList.
lg(double) double Restituisce il logaritmo in base 2 di double.
lg(doubleVecList) doubleVec Restituisce il componente dell'oggetto lg doubleVecList.
ln(double) double Restituisce il logaritmo naturale di double.
ln(doubleVecList) doubleVec Restituisce il componente dell'oggetto ln doubleVecList.
log(double) double Restituisce il logaritmo in base 10 di double.
log(doubleVecList) doubleVec Restituisce il componente dell'oggetto log doubleVecList.
max(doubleVecList) double Restituisce il valore massimo in doubleVecList.
min(doubleVecList) double Restituisce il valore minimo in doubleVecList.
norm(doubleVecList) double Restituisce la norma 2 del vettore creato da doubleVecList.
percentile(doubleVec v, double p) double Restituisce l'elemento percentile del vettore v.
rand() double Restituisce un valore casuale compreso tra 0,0 e 1,0.
range(doubleVecList) double Restituisce la differenza tra i valori minimo e massimo in doubleVecList.
round(double) double Restituisce il valore intero più vicino al valore double (in formato a virgola mobile), arrotondando i case a metà strada da zero.
round(doubleVecList) doubleVec Restituisce il componente dell'oggetto round doubleVecList.
std(doubleVecList) double Restituisce la deviazione standard del campione dei valori in doubleVecList.
stop() Arresta la valutazione dell'espressione per il ridimensionamento automatico.
sum(doubleVecList) double Restituisce la somma di tutti i componenti di doubleVecList.
time(string dateTime="") timestamp Restituisce il timestamp dell'ora corrente se non vengono passati parametri o il timestamp della stringa dateTime, se passato. I formati dateTime supportati sono W3C-DTF e RFC 1123.
val(doubleVec v, double i) double Restituisce il valore dell'elemento nella posizione i nel vettore v con un indice iniziale pari a zero.

Alcune delle funzioni descritte nella tabella precedente possono accettare un elenco come argomento. L'elenco con valori delimitati da virgole è una combinazione qualsiasi di double e doubleVec. Ad esempio:

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

Il valore doubleVecList viene convertito in un singolo doubleVec prima della valutazione. Ad esempio, se v = [1,2,3], la chiamata di avg(v) equivale alla chiamata di avg(1,2,3). La chiamata di avg(v, 7) equivale alla chiamata di avg(1,2,3,7).

Metriche

È possibile usare sia le metriche delle risorse che le metriche delle attività quando si definisce una formula. Adeguare il numero di destinazione di nodi dedicati nel pool in base ai dati di metrica ottenuti e valutati. Per altre informazioni su ogni metrica, vedere la sezione Variabili .

Metrico Descrizione
Risorsa La metrica delle risorse si basa sull'uso della memoria, della CPU e della larghezza di banda dei nodi di calcolo, nonché sul numero di nodi.

Queste variabili definite dal servizio sono utili per eseguire adeguamenti in base al conteggio dei nodi:
- $TargetDedicatedNodes
- $TargetLowPriorityNodes
- $CurrentDedicatedNodes
- $CurrentLowPriorityNodes
- $PreemptedNodeCount
- $UsableNodeCount

Queste variabili definite dal servizio sono utili per apportare modifiche in base all'utilizzo delle risorse del nodo:
- $CPUPercent
- $WallClockSeconds
- $MemoryBytes
- $DiskBytes
- $DiskReadBytes
- $DiskWriteBytes
- $DiskReadOps
- $DiskWriteOps
- $NetworkInBytes
- $NetworkOutBytes
Attività La metrica delle attività si basa sullo stato delle attività, ad esempio Attiva, In sospeso e Completata. Le variabili definite dal servizio seguenti sono utili per apportare modifiche alle dimensioni del pool in base alle metriche delle attività:
- $ActiveTasks
- $RunningTasks
- $PendingTasks
- $SucceededTasks
- $FailedTasks

Ottenere dati di esempio

Il funzionamento principale di una formula di scalabilità automatica consiste nel ottenere i dati delle metriche delle attività e delle risorse (esempi) e quindi modificare le dimensioni del pool in base a tali dati. Di conseguenza, è importante avere una chiara comprensione del modo in cui le formule di scalabilità automatica interagiscono con gli esempi.

Metodi

Le formule di scalabilità automatica agiscono su esempi di dati delle metriche forniti dal servizio Batch. Una formula aumenta o riduce i nodi di calcolo del pool in base ai valori ottenuti. Le variabili definite dal servizio sono oggetti che forniscono metodi per accedere ai dati associati a tale oggetto. Ad esempio, l'espressione seguente mostra una richiesta per recuperare gli ultimi 5 minuti di utilizzo della CPU:

$CPUPercent.GetSample(TimeInterval_Minute * 5)

Per ottenere dati di esempio sulle variabili definite dal servizio, è possibile usare i metodi seguenti.

metodo Descrizione
GetSample() Il metodo GetSample() restituisce un vettore relativo ai campioni di dati.

Un campione rappresenta 30 secondi di dati di metrica. In altre parole i campioni vengono raccolti ogni 30 secondi, Come indicato di seguito, tuttavia, si verifica un ritardo tra il momento in cui viene raccolto un campione e quando è disponibile per una formula. Di conseguenza, non tutti i campioni per un determinato periodo di tempo potrebbero essere disponibili per la valutazione da parte di una formula.

- doubleVec GetSample(double count): specifica il numero di campioni da ottenere dai campioni più recenti raccolti. GetSample(1) restituisce l'ultimo campione disponibile. Per le metriche come $CPUPercent, tuttavia, GetSample(1) non deve essere usato, perché non è possibile sapere quando è stato raccolto l'esempio. Potrebbe essere recente o, a causa di problemi di sistema, potrebbe essere molto più vecchio. In questi casi, è preferibile usare un intervallo di tempo, come illustrato di seguito.

- doubleVec GetSample((timestamp or timeinterval) startTime [, double samplePercent]): specifica un intervallo di tempo per la raccolta dei dati di esempio. Facoltativamente specifica anche la percentuale di campioni che deve essere disponibile nell'intervallo di tempo richiesto. Ad esempio, $CPUPercent.GetSample(TimeInterval_Minute * 10) restituirebbe 20 campioni se tutti i campioni degli ultimi 10 minuti sono presenti nella CPUPercent cronologia. Se l'ultimo minuto di cronologia non è disponibile, verranno restituiti solo 18 campioni. In questo caso $CPUPercent.GetSample(TimeInterval_Minute * 10, 95) si verifica un errore perché sono disponibili solo il 90% dei campioni, ma $CPUPercent.GetSample(TimeInterval_Minute * 10, 80) avrà esito positivo.

- doubleVec GetSample((timestamp or timeinterval) startTime, (timestamp or timeinterval) endTime [, double samplePercent]): specifica un intervallo di tempo per la raccolta dei dati, con un'ora di inizio e un'ora di fine. Come accennato in precedenza, si verifica un ritardo tra il momento in cui viene raccolto un campione e quando diventa disponibile per una formula. È necessario tenere presente questo ritardo quando si usa il metodo GetSample. Vedere GetSamplePercent di seguito.
GetSamplePeriod() Restituisce il periodo dei campioni raccolti in un set di dati campione cronologici.
Count() Restituisce il numero totale di campioni nella cronologia delle metriche.
HistoryBeginTime() Restituisce il timestamp del campione di dati disponibile meno recente per la metrica.
GetSamplePercent() Restituisce la percentuale di campioni disponibili per un determinato intervallo di tempo. Ad esempio: doubleVec GetSamplePercent( (timestamp or timeinterval) startTime [, (timestamp or timeinterval) endTime] ). Poiché il metodo GetSample non riesce se la percentuale di campioni restituiti è minore del valore samplePercent specificato, è possibile eseguire prima il controllo con il metodo GetSamplePercent. È quindi possibile eseguire un'azione alternativa se non sono presenti campioni sufficienti, senza interrompere la valutazione del ridimensionamento automatico.

Esempi

Il servizio Batch acquisisce periodicamente campioni di metriche relative a risorse e attività e li rende disponibili per le formule di scalabilità automatica. Questi campioni vengono registrati ogni 30 secondi dal servizio Batch. Tuttavia, si verifica in genere un ritardo tra il momento in cui questi campioni sono stati registrati e quando vengono resi disponibili per le formule di scalabilità automatica (e letta da). Inoltre, gli esempi potrebbero non essere registrati per un determinato intervallo a causa di fattori come la rete o altri problemi di infrastruttura.

Percentuale di campioni

Quando samplePercent viene passato al GetSample() metodo o viene chiamato il GetSamplePercent() metodo , la percentuale fa riferimento a un confronto tra il numero totale possibile di campioni registrati dal servizio Batch e il numero di campioni disponibili per la formula di scalabilità automatica.

Si esaminerà ora un intervallo di tempo di 10 minuti come esempio. Poiché i campioni vengono registrati ogni 30 secondi entro l'intervallo di tempo di 10 minuti, il numero totale massimo di campioni registrati da Batch sarà di 20 campioni (2 al minuto). Tuttavia, a causa della latenza intrinseca del meccanismo di creazione di report e di altri problemi in Azure, potrebbero essere disponibili solo 15 esempi per la lettura della formula di scalabilità automatica. Ad esempio, per quel periodo di 10 minuti, solo il 75% del numero totale di campioni registrati potrebbe essere disponibile per la formula.

GetSample() e intervalli di campioni

Le formule di scalabilità automatica aumentano e riducono i pool aggiungendo o rimuovendo nodi. Poiché i nodi costano denaro, assicurarsi che le formule usino un metodo intelligente di analisi basato su dati sufficienti. È consigliabile usare un'analisi dei tipi di tendenza nelle formule. aumentando e riducendo i pool in base a un intervallo di campioni raccolti.

A tale scopo, usare GetSample(interval look-back start, interval look-back end) per restituire un vettore di campioni:

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

Quando Batch valuta la riga precedente, restituisce un intervallo di campioni come vettore di valori. Ad esempio:

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

Dopo aver raccolto il vettore di campioni, è possibile usare funzioni come min(), max()e avg() per derivare valori significativi dall'intervallo raccolto.

Per prestare particolare attenzione, è possibile forzare l'esito negativo di una valutazione della formula se per un determinato periodo di tempo è disponibile meno di una determinata percentuale di campionamento. Quando si forza l'esito negativo della valutazione di una formula, si indica a Batch di interrompere ulteriormente la valutazione della formula se la percentuale specificata di campioni non è disponibile. In questo caso non viene apportata alcuna modifica alla dimensione del pool. Per specificare una percentuale di campioni obbligatoria perché la valutazione riesca, specificarla come terzo parametro in GetSample(). Qui è specificato un requisito pari al 75% dei campioni:

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

Poiché potrebbe verificarsi un ritardo nella disponibilità di esempio, è consigliabile specificare sempre un intervallo di tempo con un'ora di inizio lookback precedente a un minuto. La propagazione dei campioni nel sistema richiede circa un minuto, quindi i campioni nell'intervallo (0 * TimeInterval_Second, 60 * TimeInterval_Second) potrebbero non essere disponibili. Anche in questo caso, è possibile usare il parametro percentuale di GetSample() per imporre uno specifico requisito di percentuale dei campioni.

Importante

È consigliabile evitare di basarsi solo sulle GetSample(1) formule di scalabilità automatica. Ciò è dovuto al fatto che GetSample(1) essenzialmente dice al servizio Batch: "Dammi l'ultimo esempio che hai avuto, non importa quanto tempo fa l'hai recuperato". Poiché si tratta solo di un singolo esempio e potrebbe trattarsi di un campione meno recente, potrebbe non essere rappresentativo dell'immagine più ampia dello stato recente delle attività o delle risorse. Se si usa GetSample(1), accertarsi che faccia parte di un'istruzione di dimensioni maggiori e non sia il solo punto dati su cui si basa la formula.

Scrivere una formula di scalabilità automatica

La compilazione di una formula di scalabilità automatica prevede la composizione di istruzioni che usano i componenti precedenti e quindi la combinazione di tali istruzioni in una formula completa. In questa sezione viene creata una formula di scalabilità automatica di esempio in grado di eseguire decisioni di ridimensionamento reali e apportare modifiche.

In primo luogo, definire i requisiti per la nuova formula di scalabilità automatica. La formula deve:

  • Aumentare il numero di destinazione dei nodi di calcolo dedicati in un pool se l'uso della CPU è elevato.
  • Ridurre il numero di destinazione dei nodi di calcolo dedicati in un pool se l'uso della CPU è basso.
  • Limitare sempre il numero massimo di nodi dedicati a 400.
  • Quando si riduce il numero di nodi, non rimuovere nodi che eseguono attività; se necessario, attendere il completamento delle attività prima di rimuovere i nodi.

La prima istruzione nella formula aumenta il numero di nodi durante un utilizzo elevato della CPU. Si definisce un'istruzione che popola una variabile definita dall'utente ($totalDedicatedNodes) con un valore pari al 110% del numero di destinazione corrente di nodi dedicati, ma solo se l'utilizzo medio minimo della CPU negli ultimi 10 minuti è superiore al 70%. In caso contrario, usa il valore per il numero corrente di nodi dedicati.

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

Per ridurre il numero di nodi dedicati durante un utilizzo ridotto della CPU, l'istruzione successiva nella formula imposta la stessa $totalDedicatedNodes variabile sul 90% del numero di destinazione corrente dei nodi dedicati, se l'utilizzo medio della CPU negli ultimi 60 minuti era inferiore al 20%. In caso contrario, usa il valore corrente di $totalDedicatedNodes popolato nell'istruzione precedente.

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

Limitare ora il numero di destinazione di nodi di calcolo dedicati a un massimo di 400.

$TargetDedicatedNodes = min(400, $totalDedicatedNodes);

Assicurarsi infine che i nodi non vengano rimossi fino al termine delle attività.

$NodeDeallocationOption = taskcompletion;

Ecco la formula completa:

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

Nota

Se si sceglie, è possibile includere sia commenti che interruzioni di riga nelle stringhe di formula. Tenere presente anche che i punti e virgola mancanti potrebbero causare errori di valutazione.

Intervallo di ridimensionamento automatico

Per impostazione predefinita, il servizio Batch adegua le dimensioni di un pool in base alla relativa formula di ridimensionamento automatico ogni 15 minuti. Questo intervallo è configurabile usando le proprietà del pool seguenti:

L'intervallo minimo è di 5 minuti e il massimo di 168 ore. Se viene specificato un intervallo che non rientra in questi valori, il servizio Batch restituisce un errore di richiesta non valida (400).

Nota

La funzionalità di ridimensionamento automatico non è attualmente concepita come risposta alle modifiche in meno di un minuto, ma piuttosto per l'adeguamento graduale delle dimensioni del pool durante l'esecuzione di un carico di lavoro.

Creare un pool abilitato per la scalabilità automatica con gli SDK Batch

La scalabilità automatica del pool può essere configurata usando uno qualsiasi degli SDK di Batch, i cmdlet di PowerShell per l'API REST batch e l'interfaccia della riga di comando di Batch. In questa sezione è possibile vedere esempi per .NET e Python.

.NET

Per creare un pool con la scalabilità automatica abilitata in .NET, seguire questi passaggi:

  1. Creare il pool con BatchClient.PoolOperations.CreatePool.
  2. Impostare la proprietà CloudPool.AutoScaleEnabled su true.
  3. Impostare la proprietà CloudPool.AutoScaleFormula con la formula di scalabilità automatica.
  4. (Facoltativo) Impostare la proprietà CloudPool.AutoScaleEvaluationInterval (valore predefinito è 15 minuti).
  5. Eseguire il commit del pool con CloudPool.Commit o CommitAsync.

Nell'esempio seguente viene creato un pool abilitato per la scalabilità automatica in .NET. La formula di scalabilità automatica del pool imposta il numero di destinazione di nodi dedicati su 5 il lunedì e su 1 ogni altro giorno della settimana. L'intervallo di scalabilità automatica è impostato su 30 minuti. In questo e in altri frammenti di codice C# di questo articolo, myBatchClient è un'istanza correttamente inizializzata della classe BatchClient.

CloudPool pool = myBatchClient.PoolOperations.CreatePool(
                    poolId: "mypool",
                    virtualMachineSize: "standard_d1_v2",
                    VirtualMachineConfiguration: new VirtualMachineConfiguration(
                        imageReference: new ImageReference(
                                            publisher: "MicrosoftWindowsServer",
                                            offer: "WindowsServer",
                                            sku: "2019-datacenter-core",
                                            version: "latest"),
                        nodeAgentSkuId: "batch.node.windows amd64");
pool.AutoScaleEnabled = true;
pool.AutoScaleFormula = "$TargetDedicatedNodes = (time().weekday == 1 ? 5:1);";
pool.AutoScaleEvaluationInterval = TimeSpan.FromMinutes(30);
await pool.CommitAsync();

Importante

Quando si crea un pool abilitato per la scalabilità automatica, non specificare il parametro targetDedicatedNodes o il parametro targetLowPriorityNodes nella chiamata a CreatePool. Specificare invece le AutoScaleEnabled proprietà e AutoScaleFormula nel pool. I valori per queste proprietà determinano il numero di destinazione di ogni tipo di nodo.

Per ridimensionare manualmente un pool abilitato per la scalabilità automatica (ad esempio, con BatchClient.PoolOperations.ResizePoolAsync), è prima necessario disabilitare la scalabilità automatica nel pool, quindi ridimensionarla.

Suggerimento

Per altri esempi di uso di .NET SDK, vedere il repository di avvio rapido di Batch .NET in GitHub.

Python

Per creare un pool abilitato per la scalabilità automatica con Python SDK:

  1. Creare un pool e specificarne la configurazione.
  2. Aggiungere il pool al client del servizio.
  3. Abilitare la scalabilità automatica nel pool con una formula scritta.

Nell'esempio seguente vengono illustrati questi passaggi.

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

Suggerimento

Per altri esempi di uso di Python SDK, vedere il repository di avvio rapido di Batch Python in GitHub.

Abilitare la scalabilità automatica in un pool esistente

Ogni SDK di Batch consente di abilitare il ridimensionamento automatico. Ad esempio:

Quando si abilita la scalabilità automatica in un pool esistente, tenere presente quanto segue:

  • Se la scalabilità automatica è attualmente disabilitata nel pool, è necessario specificare una formula di scalabilità automatica valida quando si esegue la richiesta. Facoltativamente, è possibile specificare un intervallo di ridimensionamento automatico. Se non si specifica un intervallo, viene usato il valore predefinito di 15 minuti.
  • Se la scalabilità automatica è attualmente abilitata nel pool, è possibile specificare una nuova formula, un nuovo intervallo o entrambi. È necessario specificare almeno una di queste proprietà.
    • Se si specifica un nuovo intervallo di ridimensionamento automatico, la pianificazione esistente viene arrestata e viene avviata una nuova pianificazione. L'ora di inizio della nuova pianificazione corrisponde al momento in cui è stata inviata la richiesta di abilitazione della scalabilità automatica.
    • Se si omette la formula o l'intervallo di scalabilità automatica, il servizio Batch continua a usare il valore corrente di tale impostazione.

Nota

Se sono stati specificati valori per i parametri targetDedicatedNodes o targetLowPriorityNodes del CreatePool metodo quando è stato creato il pool in .NET o per i parametri confrontabili in un altro linguaggio, questi valori vengono ignorati quando viene valutata la formula di scalabilità automatica.

Questo esempio C# usa la libreria Batch .NET per abilitare la scalabilità automatica in un pool esistente.

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

Aggiornare una formula di scalabilità automatica

Per aggiornare la formula in un pool esistente abilitato per la scalabilità automatica, chiamare l'operazione per abilitare di nuovo la scalabilità automatica con la nuova formula. Ad esempio, se la scalabilità automatica è già abilitata su myexistingpool quando viene eseguito il codice .NET seguente, la relativa formula di scalabilità automatica viene sostituita con il contenuto di myNewFormula.

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

Aggiornare l'intervallo di scalabilità automatica

Per aggiornare l'intervallo di valutazione della scalabilità automatica in un pool esistente abilitato per la scalabilità automatica, chiamare l'operazione per abilitare di nuovo la scalabilità automatica con il nuovo intervallo. Ad esempio, per impostare l'intervallo di valutazione della scalabilità automatica su 60 minuti per un pool già abilitato per la scalabilità automatica in .NET:

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

Valutare la formula di scalabilità automatica

È possibile valutare la formula prima di applicarla a un pool. In questo modo è possibile testare i risultati della formula prima di inserirli nell'ambiente di produzione.

Prima di poter valutare una formula di scalabilità automatica, è necessario abilitare la scalabilità automatica nel pool con una formula valida, ad esempio la formula $TargetDedicatedNodes = 0a una riga . Usare quindi uno dei metodi seguenti per valutare la formula da testare:

Nell'esempio di Batch .NET seguente viene valutata una formula di scalabilità automatica. Se il pool non usa già la scalabilità automatica, abilitarlo per primo.

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

La valutazione corretta della formula in questo frammento di codice produce risultati simili ai seguenti:

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

Visualizzare informazioni sulle esecuzioni della scalabilità automatica

È consigliabile controllare periodicamente la valutazione del servizio Batch della formula di scalabilità automatica. A tale scopo, ottenere (o aggiornare) un riferimento al pool, quindi esaminare le proprietà dell'ultima esecuzione di scalabilità automatica.

In .NET di Batch la proprietà CloudPool.AutoScaleRun presenta varie proprietà che forniscono informazioni sull'ultima esecuzione di scalabilità automatica sul pool:

Nell'API REST la richiesta Ottenere informazioni su un pool restituisce informazioni relative al pool, che includono l'ultima esecuzione della scalabilità automatica nella proprietà autoScaleRun.

Nell'esempio C# seguente viene usata la libreria Batch .NET per stampare informazioni sull'ultima esecuzione della scalabilità automatica nel 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);

Output di esempio dell'esempio precedente:

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:

Ottenere la cronologia di esecuzione della scalabilità automatica usando gli eventi di scalabilità automatica del pool

È anche possibile controllare la cronologia di ridimensionamento automatico eseguendo query su PoolAutoScaleEvent. Batch genera questo evento per registrare ogni occorrenza della valutazione e dell'esecuzione della formula di scalabilità automatica, che può essere utile per risolvere potenziali problemi.

Evento di esempio per 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": []
    }
}

Formule di scalabilità automatica di esempio

Di seguito verranno esaminate alcune formule che mostrano diverse modalità per regolare la quantità di risorse di calcolo in un pool.

Esempio 1: Adeguamento basato sul tempo

Si supponga di volte regolare le dimensioni del pool in base al giorno della settimana e all'ora del giorno. Questo esempio mostra come aumentare o ridurre il numero di nodi nel pool di conseguenza.

La formula ottiene prima di tutto l'ora corrente. Durante i giorni della settimana, da 1 a 5, e durante l'orario lavorativo, dalle 8.00 alle 18.00, le dimensioni del pool di destinazione sono impostate su 20 nodi. In caso contrario, vengono impostate su 10 nodi.

$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 può essere modificato in base al fuso orario locale con l'aggiunta di time() al prodotto di TimeZoneInterval_Hour e dell'offset UTC. Ad esempio, usare $curTime = time() + (-6 * TimeInterval_Hour); per l'ora legale del fuso occidentale (MDT). Tenere presente che l'offset deve essere regolato all'inizio e alla fine dell'ora legale, se applicabile.

Esempio 2: Adeguamento basato sulle attività

In questo esempio C# le dimensioni del pool vengono modificate in base al numero di attività nella coda. I commenti e le interruzioni di riga sono inclusi nelle stringhe della formula.

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

Esempio 3: Considerazioni sulle attività parallele

Questo esempio C# regola le dimensioni del pool in base al numero di attività. Questa formula prende in considerazione anche il valore TaskSlotsPerNode impostato per il pool. Questo approccio è utile nelle situazioni in cui l'esecuzione di attività parallele è abilitata nel 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;

Esempio 4: Impostazione di dimensioni iniziali del pool

Questo esempio mostra un esempio C# con una formula di scalabilità automatica che imposta le dimensioni del pool su un numero specificato di nodi per un periodo di tempo iniziale. Successivamente, regola le dimensioni del pool in base al numero di attività in esecuzione e attive.

In particolare, questa formula esegue le operazioni seguenti:

  • Imposta le dimensioni iniziali del pool su 4 nodi.
  • Non modifica le dimensioni del pool entro i primi 10 minuti del ciclo di vita del pool.
  • Dopo 10 minuti ottiene il valore massimo del numero di attività in esecuzione e attive negli ultimi 60 minuti.
    • Se entrambi i valori sono 0, a indicare che non sono state eseguite attività o attive negli ultimi 60 minuti, le dimensioni del pool sono impostate su 0.
    • Se uno dei valori è maggiore di zero, non viene apportata alcuna modifica.
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);

Passaggi successivi