Creare una formula di scalabilità automatica per la scalabilità dei nodi di calcolo in un pool BatchCreate an automatic scaling formula for scaling compute nodes in a Batch pool

Azure Batch supporta la scalabilità automatica dei pool in base ai parametri definiti.Azure Batch can automatically scale pools based on parameters that you define. Con la scalabilità automatica, Batch aggiunge in modo dinamico nodi a un pool man mano che cresce la richiesta di attività e rimuove i nodi di calcolo in seguito alla riduzione delle richieste.With automatic scaling, Batch dynamically adds nodes to a pool as task demands increase, and removes compute nodes as they decrease. È possibile risparmiare tempo e denaro regolando automaticamente il numero dei nodi di calcolo usati dall'applicazione Batch.You can save both time and money by automatically adjusting the number of compute nodes used by your Batch application.

Per abilitare la scalabilità automatica in un pool di nodi di calcolo, definire e associare al pool una formula di scalabilità automatica.You enable automatic scaling on a pool of compute nodes by associating with it an autoscale formula that you define. Il servizio Batch usa la formula di scalabilità automatica per determinare il numero di nodi di calcolo necessari per eseguire il carico di lavoro.The Batch service uses the autoscale formula to determine the number of compute nodes that are needed to execute your workload. I nodi di calcolo possono essere nodi dedicati o nodi con priorità bassa.Compute nodes may be dedicated nodes or low-priority nodes. Batch risponde ai dati delle metriche del servizio raccolti periodicamente.Batch responds to service metrics data that is collected periodically. Usando i dati delle metriche, Batch regola il numero di nodi di calcolo nel pool in base alla formula e a un intervallo configurabile.Using this metrics data, Batch adjusts the number of compute nodes in the pool based on your formula and at a configurable interval.

È possibile abilitare la scalabilità automatica al momento della creazione di un pool o in un pool esistente.You can enable automatic scaling either when a pool is created, or on an existing pool. Si può anche modificare una formula esistente in un pool configurato per la scalabilità automatica.You can also change an existing formula on a pool that is configured for autoscaling. Batch consente di valutare le formule prima di assegnarle ai pool e di monitorare lo stato delle esecuzioni della scalabilità automatica.Batch enables you to evaluate your formulas before assigning them to pools and to monitor the status of automatic scaling runs.

Questo articolo illustra le diverse entità che costituiranno le formule di scalabilità automatica, tra cui variabili, operatori, operazioni e funzioni.This article discusses the various entities that make up your autoscale formulas, including variables, operators, operations, and functions. Si scoprirà come ottenere varie metriche relative ad attività e a risorse di calcolo all'interno di Batch.We discuss how to obtain various compute resource and task metrics within Batch. È possibile usare queste metriche per adeguare il numero di nodi del pool in base all'utilizzo delle risorse e allo stato delle attività.You can use these metrics to adjust your pool's node count based on resource usage and task status. Verrà quindi illustrato come costruire una formula e abilitare la scalabilità automatica in un pool con le API REST e .NET per Batch,We then describe how to construct a formula and enable automatic scaling on a pool by using both the Batch REST and .NET APIs. concludendo con alcune formule di esempio.Finally, we finish up with a few example formulas.

Importante

Quando si crea un account Batch, è possibile specificare la configurazione dell'account che determina se i pool devono essere allocati in una sottoscrizione del servizio Batch (impostazione predefinita) o nella sottoscrizione utente.When you create a Batch account, you can specify the account configuration, which determines whether pools are allocated in a Batch service subscription (the default), or in your user subscription. Se l'account Batch è stato creato con la configurazione del servizio Batch predefinita, l'account è limitato a un numero massimo di core utilizzabili per l'elaborazione.If you created your Batch account with the default Batch Service configuration, then your account is limited to a maximum number of cores that can be used for processing. Il servizio Batch gestisce la scalabilità dei nodi di calcolo solo fino al raggiungimento del limite di core.The Batch service scales compute nodes only up to that core limit. Per questo motivo, il servizio Batch può non raggiungere il numero di nodi di calcolo specificato da una formula di scalabilità automatica.For this reason, the Batch service may not reach the target number of compute nodes specified by an autoscale formula. Per informazioni su come visualizzare e aumentare le quote dell'account, vedere Quote e limiti per il servizio Azure Batch .See Quotas and limits for the Azure Batch service for information on viewing and increasing your account quotas.

Se l'account è stato creato con la configurazione di sottoscrizione utente, l'account condivide la quota di core per la sottoscrizione.If you created your account with the User Subscription configuration, then your account shares in the core quota for the subscription. Per altre informazioni, vedere Limiti relativi a Macchine virtuali in Sottoscrizione di Azure e limiti, quote e vincoli dei servizi.For more information, see Virtual Machines limits in Azure subscription and service limits, quotas, and constraints.

Formule di ridimensionamento automaticoAutomatic scaling formulas

Una formula di scalabilità automatica è un valore stringa definito che contiene una o più istruzioni.An automatic scaling formula is a string value that you define that contains one or more statements. La formula di scalabilità automatica viene assegnata all'elemento autoScaleFormula di un pool (Batch REST) o alla proprietà CloudPool.AutoScaleFormula (Batch .NET).The autoscale formula is assigned to a pool's autoScaleFormula element (Batch REST) or CloudPool.AutoScaleFormula property (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.The Batch service uses your formula to determine the target number of compute nodes in the pool for the next interval of processing. La stringa della formula non può avere dimensioni maggiori di 8 KB, può includere fino a 100 istruzioni separate da punti e virgola e può contenere interruzioni di riga e commenti.The formula string cannot exceed 8 KB, can include up to 100 statements that are separated by semicolons, and can include line breaks and comments.

È possibile paragonare le formule di ridimensionamento automatico a un "linguaggio" di ridimensionamento automatico di Batch.You can think of automatic scaling formulas as a Batch autoscale "language." Le istruzioni nella formula sono espressioni in formato libero che possono includere variabili definite dal servizio Batch e variabili definite dall'utente.Formula statements are free-formed expressions that can include both service-defined variables (variables defined by the Batch service) and user-defined variables (variables that you define). Possono eseguire diverse operazioni su questi valori usando funzioni, operatori e tipi predefiniti.They can perform various operations on these values by using built-in types, operators, and functions. Ad esempio, un'istruzione può avere il formato seguente:For example, a statement might take the following form:

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

Le formule contengono in genere più istruzioni che eseguono operazioni su valori ottenuti nelle istruzioni precedenti.Formulas generally contain multiple statements that perform operations on values that are obtained in previous statements. Ad esempio, si ottiene prima di tutto un valore per variable1, quindi il valore viene passato a una funzione per popolare variable2:For example, first we obtain a value for variable1, then pass it to a function to populate 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.Include these statements in your autoscale formula to arrive at a target number of compute nodes. I nodi dedicati e i nodi con priorità bassa hanno impostazioni proprie per la destinazione, in modo da poter definire una destinazione per ogni tipo di nodo.Dedicated nodes and low-priority nodes each have their own target settings, so that you can define a target for each type of node. Una formula di scalabilità automatica può includere un valore di destinazione per i nodi dedicati, un valore di destinazione per i nodi con priorità bassa o entrambi.An autoscale formula can include a target value for dedicated nodes, a target value for low-priority nodes, or both.

Il numero di nodi di destinazione può essere maggiore, minore o uguale al numero attuale di nodi di tale tipo nel pool.The target number of nodes may be higher, lower, or the same as the current number of nodes of that type in the pool. Batch valuta la formula di scalabilità automatica del pool a intervalli specifici (vedere gli intervalli di scalabilità automatica).Batch evaluates a pool's autoscale formula at a specific interval (see automatic scaling intervals). 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.Batch adjusts the target number of each type of node in the pool to the number that your autoscale formula specifies at the time of evaluation.

Esempio di formula di scalabilità automaticaSample autoscale formula

Di seguito è riportato un esempio di formula di scalabilità automatica che può essere adattato alla maggior parte degli scenari.Here is an example of an autoscale formula that can be adjusted to work for most scenarios. Le variabili startingNumberOfVMs e maxNumberofVMs nell'esempio di formula possono essere modificate in base alle proprie esigenze.The variables startingNumberOfVMs and maxNumberofVMs in the example formula can be adjusted to your needs. Questa formula ridimensiona i nodi dedicati, ma può essere modificata per applicarla anche ai nodi con priorità bassa.This formula scales dedicated nodes, but can be modified to apply to scale low-priority nodes as well.

startingNumberOfVMs = 1;
maxNumberofVMs = 25;
pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second);
pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second));
$TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);

Con questa formula di scalabilità automatica il pool viene inizialmente creato con una singola macchina virtuale.With this autoscale formula, the pool is initially created with a single VM. La metrica $PendingTasks definisce il numero di attività in esecuzione o in coda.The $PendingTasks metric defines the number of tasks that are running or queued. La formula trova il numero medio di attività in sospeso negli ultimi 180 secondi e imposta la variabile $TargetDedicatedNodes di conseguenza.The formula finds the average number of pending tasks in the last 180 seconds and sets the $TargetDedicatedNodes variable accordingly. La formula garantisce che il numero di nodi dedicati di destinazione non superi mai 25 macchine virtuali.The formula ensures that the target number of dedicated nodes never exceeds 25 VMs. Man mano che vengono inviate nuove attività, il pool si espande automaticamente.As new tasks are submitted, the pool automatically grows. Al termine delle attività le macchine virtuali diventano libere una ad una e la formula di scalabilità automatica riduce il pool.As tasks complete, VMs become free one by one and the autoscaling formula shrinks the pool.

variablesVariables

Nelle formule di scalabilità automatica è possibile usare sia variabili definite dal servizio sia variabili definite dall'utente.You can use both service-defined and user-defined variables in your autoscale formulas. Le variabili definite dal servizio sono incorporate nel servizio Batch.The service-defined variables are built in to the Batch service. Alcune sono in lettura/scrittura e altre di sola lettura.Some service-defined variables are read-write, and some are read-only. Le variabili definite dall'utente vengono configurate dall'utente.User-defined variables are variables that you define. Nella formula di esempio della sezione precedente $TargetDedicatedNodes e $PendingTasks sono variabili definite dal servizio.In the example formula shown in the previous section, $TargetDedicatedNodes and $PendingTasks are service-defined variables. Le variabili startingNumberOfVMs e maxNumberofVMs sono definite dall'utente.Variables startingNumberOfVMs and maxNumberofVMs are user-defined variables.

Nota

Le variabili definite dal servizio sono sempre precedute da un segno di dollaro ($).Service-defined variables are always preceded by a dollar sign ($). Per le variabili definite dall'utente il segno di dollaro è facoltativo.For user-defined variables, the dollar sign is optional.

Le tabelle seguenti includono sia le variabili di lettura/scrittura che di sola lettura definite dal servizio Batch.The following tables show both read-write and read-only variables that are defined by the Batch service.

È possibile ottenere e impostare i valori di queste variabili definite dal servizio per gestire il numero di nodi di calcolo in un pool:You can get and set the values of these service-defined variables to manage the number of compute nodes in a pool:

Variabili in lettura/scrittura definite dal servizioRead-write service-defined variables DescrizioneDescription
$TargetDedicatedNodes$TargetDedicatedNodes Numero di destinazione dei nodi di calcolo dedicati per il pool.The target number of dedicated compute nodes for the pool. Il numero di nodi dedicati viene specificato come destinazione, perché un pool potrebbe non ottenere sempre il numero desiderato di nodi.The number of dedicated nodes is specified as a target because a pool may not always achieve the desired number of nodes. Ad esempio, se il numero di nodi dedicati di destinazione viene modificato da una valutazione di scalabilità automatica prima che il pool raggiunga il valore di destinazione iniziale, è possibile che il pool non raggiunga il numero di nodi di destinazione.For example, if the target number of dedicated nodes is modified by an autoscale evaluation before the pool has reached the initial target, then the pool may not reach the target.

Un pool in un account creato con la configurazione del servizio Batch potrebbe non raggiungere il valore di destinazione se supera la quota di nodi o core di un account Batch.A pool in an account created with the Batch Service configuration may not achieve its target if the target exceeds a Batch account node or core quota. Un pool in un account creato con la configurazione di sottoscrizione utente potrebbe non raggiungere il valore di destinazione se supera la quota condivisa di nodi per la sottoscrizione.A pool in an account created with the User Subscription configuration may not achieve its target if the target exceeds the shared core quota for the subscription.
$TargetLowPriorityNodes$TargetLowPriorityNodes Numero di destinazione dei nodi di calcolo con priorità bassa per il pool.The target number of low-priority compute nodes for the pool. Il numero di nodi con priorità bassa viene specificato come destinazione, perché un pool potrebbe non ottenere sempre il numero desiderato di nodi.The number of low-priority nodes is specified as a target because a pool may not always achieve the desired number of nodes. Ad esempio, se il numero di nodi con priorità bassa di destinazione viene modificato da una valutazione di scalabilità automatica prima che il pool raggiunga il valore di destinazione iniziale, è possibile che il pool non raggiunga il numero di nodi di destinazione.For example, if the target number of low-priority nodes is modified by an autoscale evaluation before the pool has reached the initial target, then the pool may not reach the target. Un pool potrebbe anche non raggiungere il valore di destinazione se supera la quota di nodi o core di un account Batch.A pool may also not achieve its target if the target exceeds a Batch account node or core quota.

Per altre informazioni sui nodi calcolo con priorità bassa, vedere Usare le VM con priorità bassa in Batch (anteprima).For more information on low-priority compute nodes, see Use low-priority VMs with Batch (Preview).
$NodeDeallocationOption$NodeDeallocationOption L'azione che si verifica quando i nodi di calcolo vengono rimossi da un pool.The action that occurs when compute nodes are removed from a pool. I valori possibili sono:Possible values are:
  • requeue: termina immediatamente le attività e le reinserisce nella coda dei processi in modo che vengano ripianificate.requeue--Terminates tasks immediately and puts them back on the job queue so that they are rescheduled.
  • terminate: termina immediatamente le attività e le rimuove dalla coda dei processi.terminate--Terminates tasks immediately and removes them from the job queue.
  • taskcompletion: attende il completamento delle attività in esecuzione e quindi rimuove il nodo dal pool.taskcompletion--Waits for currently running tasks to finish and then removes the node from the pool.
  • retaineddata: attende che tutti i dati mantenuti per le attività locali nel nodo vengano ripuliti prima di rimuovere il nodo dal pool.retaineddata--Waits for all the local task-retained data on the node to be cleaned up before removing the node from the pool.

È possibile ottenere il valore di queste variabili definite dal servizio per eseguire adeguamenti basati sulla metrica del servizio Batch:You can get the value of these service-defined variables to make adjustments that are based on metrics from the Batch service:

Variabili di sola lettura definite dal servizioRead-only service-defined variables DescrizioneDescription
$CPUPercent$CPUPercent Percentuale media di utilizzo della CPU.The average percentage of CPU usage.
$WallClockSeconds$WallClockSeconds Numero di secondi utilizzati.The number of seconds consumed.
$MemoryBytes$MemoryBytes Numero medio di megabyte usati.The average number of megabytes used.
$DiskBytes$DiskBytes Numero medio di gigabyte usati sui dischi locali.The average number of gigabytes used on the local disks.
$DiskReadBytes$DiskReadBytes Numero di byte letti.The number of bytes read.
$DiskWriteBytes$DiskWriteBytes Numero di byte scritti.The number of bytes written.
$DiskReadOps$DiskReadOps Numero di operazioni di lettura del disco eseguite.The count of read disk operations performed.
$DiskWriteOps$DiskWriteOps Numero di operazioni di scrittura sul disco eseguite.The count of write disk operations performed.
$NetworkInBytes$NetworkInBytes Numero di byte in ingresso.The number of inbound bytes.
$NetworkOutBytes$NetworkOutBytes Numero di byte in uscita.The number of outbound bytes.
$SampleNodeCount$SampleNodeCount Conteggio dei nodi di calcolo.The count of compute nodes.
$ActiveTasks$ActiveTasks Numero di attività che sono pronte per l'esecuzione, ma non sono ancora in esecuzione.The number of tasks that are ready to execute but are not yet executing. Il conteggio $ActiveTasks include tutte le attività che si trovano in stato attivo e le cui dipendenze sono state soddisfatte.The $ActiveTasks count includes all tasks that are in the active state and whose dependencies have been satisfied. Tutte le attività che sono nello stato attivo, ma per le quali le dipendenze non sono state soddisfatte vengono escluse dal conteggio per $ActiveTasks.Any tasks that are in the active state but whose dependencies have not been satisfied are excluded from the $ActiveTasks count.
$RunningTasks$RunningTasks Numero di attività nello stato in corso di esecuzione.The number of tasks in a running state.
$PendingTasks$PendingTasks La somma di $ActiveTasks e $RunningTasks.The sum of $ActiveTasks and $RunningTasks.
$SucceededTasks$SucceededTasks Numero di attività completate correttamente.The number of tasks that finished successfully.
$FailedTasks$FailedTasks Numero di attività non riuscite.The number of tasks that failed.
$CurrentDedicatedNodes$CurrentDedicatedNodes Numero corrente di nodi di calcolo dedicati.The current number of dedicated compute nodes.
$CurrentLowPriorityNodes$CurrentLowPriorityNodes Numero corrente di nodi di calcolo con priorità bassa, inclusi eventuali nodi annullati.The current number of low-priority compute nodes, including any nodes that have been pre-empted.
$PreemptedNodeCount$PreemptedNodeCount Il numero di nodi nel pool che si trovano nello stato Annullato.The number of nodes in the pool that are in a pre-empted state.

Suggerimento

Le variabili di sola lettura definite dal servizio illustrate nella tabella precedente sono oggetti che offrono vari metodi per accedere ai dati associati a ognuno.The read-only, service-defined variables that are shown in the previous table are objects that provide various methods to access data associated with each. Per altre informazioni, vedere Ottenere dati di esempio più avanti in questo articolo.For more information, see Obtain sample data later in this article.

TipiTypes

Questi sono i tipi supportati in una formula:These types are supported in a formula:

  • doubledouble
  • doubleVecdoubleVec
  • doubleVecListdoubleVecList
  • stringstring
  • timestamp, è una struttura composta che contiene i membri seguenti:timestamp--timestamp is a compound structure that contains the following members:

    • yearyear
    • month (1-12)month (1-12)
    • day (1-31)day (1-31)
    • weekday (in formato numero, ad esempio 1 per lunedì)weekday (in the format of number; for example, 1 for Monday)
    • hour (in formato 24 ore, ad esempio 13 per indicare le ore 13.00)hour (in 24-hour number format; for example, 13 means 1 PM)
    • minute (00-59)minute (00-59)
    • second (00-59)second (00-59)
  • timeIntervaltimeinterval

    • TimeInterval_ZeroTimeInterval_Zero
    • TimeInterval_100nsTimeInterval_100ns
    • TimeInterval_MicrosecondTimeInterval_Microsecond
    • TimeInterval_MillisecondTimeInterval_Millisecond
    • TimeInterval_SecondTimeInterval_Second
    • TimeInterval_MinuteTimeInterval_Minute
    • TimeInterval_HourTimeInterval_Hour
    • TimeInterval_DayTimeInterval_Day
    • TimeInterval_WeekTimeInterval_Week
    • TimeInterval_YearTimeInterval_Year

OperazioniOperations

Queste operazioni sono consentite sui tipi elencati nella sezione precedente.These operations are allowed on the types that are listed in the previous section.

OperazioneOperation Operatori supportatiSupported operators Tipo di risultatoResult type
double operatore doubledouble operator double +, -, *, /+, -, *, / doubledouble
double operatore timeintervaldouble operator timeinterval * timeIntervaltimeinterval
doubleVec operatore doubledoubleVec operator double +, -, *, /+, -, *, / doubleVecdoubleVec
doubleVec operatore doubleVecdoubleVec operator doubleVec +, -, *, /+, -, *, / doubleVecdoubleVec
timeinterval operatore doubletimeinterval operator double , /, / timeIntervaltimeinterval
timeinterval operatore timeintervaltimeinterval operator timeinterval +, -+, - timeIntervaltimeinterval
timeinterval operatore timestamptimeinterval operator timestamp + timestamptimestamp
timestamp operatore timeintervaltimestamp operator timeinterval + timestamptimestamp
timestamp operatore timestamptimestamp operator timestamp - timeIntervaltimeinterval
operatoreedoubleoperatordouble -, !-, ! doubledouble
operatoreetimeIntervaloperatortimeinterval - timeIntervaltimeinterval
double operatore doubledouble operator double <, <=, ==, >=, >, !=<, <=, ==, >=, >, != doubledouble
string operatore stringstring operator string <, <=, ==, >=, >, !=<, <=, ==, >=, >, != doubledouble
timestamp operatore timestamptimestamp operator timestamp <, <=, ==, >=, >, !=<, <=, ==, >=, >, != doubledouble
timeinterval operatore timeintervaltimeinterval operator timeinterval <, <=, ==, >=, >, !=<, <=, ==, >=, >, != doubledouble
double operatore doubledouble operator double &&, ||&&, || doubledouble

Durante il test di un valore double con un operatore ternario (double ? statement1 : statement2), diverso da zero è true e zero è false.When testing a double with a ternary operator (double ? statement1 : statement2), nonzero is true, and zero is false.

FunzioniFunctions

Queste funzioni predefinite sono disponibili per consentire la definizione di una formula di ridimensionamento automatico.These predefined functions are available for you to use in defining an automatic scaling formula.

FunzioneFunction Tipo restituitoReturn type DescrizioneDescription
avg(doubleVecList)avg(doubleVecList) doubledouble Restituisce il valore medio per tutti i valori in doubleVecList.Returns the average value for all values in the doubleVecList.
len(doubleVecList)len(doubleVecList) doubledouble Restituisce la lunghezza del vettore creato da doubleVecList.Returns the length of the vector that is created from the doubleVecList.
lg(double)lg(double) doubledouble Restituisce il logaritmo in base 2 di double.Returns the log base 2 of the double.
lg(doubleVecList)lg(doubleVecList) doubleVecdoubleVec Restituisce il logaritmo in base 2 a livello di componente di doubleVecList.Returns the component-wise log base 2 of the doubleVecList. vec(double) deve essere passato in modo esplicito per il parametro.A vec(double) must be explicitly passed for the parameter. In caso contrario viene usata la versione double lg(double).Otherwise, the double lg(double) version is assumed.
ln(double)ln(double) doubledouble Restituisce il logaritmo naturale di double.Returns the natural log of the double.
ln(doubleVecList)ln(doubleVecList) doubleVecdoubleVec Restituisce il logaritmo in base 2 a livello di componente di doubleVecList.Returns the component-wise log base 2 of the doubleVecList. vec(double) deve essere passato in modo esplicito per il parametro.A vec(double) must be explicitly passed for the parameter. In caso contrario viene usata la versione double lg(double).Otherwise, the double lg(double) version is assumed.
log(double)log(double) doubledouble Restituisce il logaritmo in base 10 di double.Returns the log base 10 of the double.
log(doubleVecList)log(doubleVecList) doubleVecdoubleVec Restituisce il logaritmo in base 10 a livello di componente di doubleVecList.Returns the component-wise log base 10 of the doubleVecList. vec(double) deve essere passato in modo esplicito per il singolo parametro double.A vec(double) must be explicitly passed for the single double parameter. In caso contrario, viene usata la versione double log(double).Otherwise, the double log(double) version is assumed.
max(doubleVecList)max(doubleVecList) doubledouble Restituisce il valore massimo in doubleVecList.Returns the maximum value in the doubleVecList.
min(doubleVecList)min(doubleVecList) doubledouble Restituisce il valore minimo in doubleVecList.Returns the minimum value in the doubleVecList.
norm(doubleVecList)norm(doubleVecList) doubledouble Restituisce la norma 2 del vettore creato da doubleVecList.Returns the two-norm of the vector that is created from the doubleVecList.
percentile(doubleVec v, double p)percentile(doubleVec v, double p) doubledouble Restituisce l'elemento percentile del vettore v.Returns the percentile element of the vector v.
rand()rand() doubledouble Restituisce un valore casuale compreso tra 0,0 e 1,0.Returns a random value between 0.0 and 1.0.
range(doubleVecList)range(doubleVecList) doubledouble Restituisce la differenza tra i valori minimo e massimo in doubleVecList.Returns the difference between the min and max values in the doubleVecList.
std(doubleVecList)std(doubleVecList) doubledouble Restituisce la deviazione standard del campione dei valori in doubleVecList.Returns the sample standard deviation of the values in the doubleVecList.
stop()stop() Arresta la valutazione dell'espressione per il ridimensionamento automatico.Stops evaluation of the autoscaling expression.
sum(doubleVecList)sum(doubleVecList) doubledouble Restituisce la somma di tutti i componenti di doubleVecList.Returns the sum of all the components of the doubleVecList.
time(string dateTime="")time(string dateTime="") timestamptimestamp Restituisce il timestamp dell'ora corrente se non vengono passati parametri oppure il timestamp della stringa dateTime, se è stata passata.Returns the time stamp of the current time if no parameters are passed, or the time stamp of the dateTime string if it is passed. I formati dateTime supportati sono W3C-DTF e RFC 1123.Supported dateTime formats are W3C-DTF and RFC 1123.
val(doubleVec v, double i)val(doubleVec v, double i) doubledouble Restituisce il valore dell'elemento nella posizione i nel vettore v con un indice iniziale pari a zero.Returns the value of the element that is at location i in vector v, with a starting index of zero.

Alcune delle funzioni descritte nella tabella precedente possono accettare un elenco come argomento.Some of the functions that are described in the previous table can accept a list as an argument. L'elenco con valori delimitati da virgole è una combinazione qualsiasi di double e doubleVec.The comma-separated list is any combination of double and doubleVec. Ad esempio:For example:

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

Il valore doubleVecList viene convertito in un singolo doubleVec prima della valutazione.The doubleVecList value is converted to a single doubleVec before evaluation. Ad esempio, se v = [1,2,3], la chiamata di avg(v) equivale alla chiamata di avg(1,2,3).For example, if v = [1,2,3], then calling avg(v) is equivalent to calling avg(1,2,3). La chiamata di avg(v, 7) equivale alla chiamata di avg(1,2,3,7).Calling avg(v, 7) is equivalent to calling avg(1,2,3,7).

Ottenere dati di esempioObtain sample data

Le formule di ridimensionamento automatico agiscono sui dati di metrica (campioni) forniti dal servizio Batch.Autoscale formulas act on metrics data (samples) that is provided by the Batch service. Una formula aumenta o riduce le dimensioni del pool in base ai valori che ottiene dal servizio.A formula grows or shrinks pool size based on the values that it obtains from the service. Le variabili definite dal servizio descritte sopra sono oggetti che offrono vari metodi per accedere ai dati associati a un dato oggetto.The service-defined variables that were described previously are objects that provide various methods to access data that is associated with that object. Ad esempio, l'espressione seguente mostra una richiesta per recuperare gli ultimi 5 minuti di utilizzo della CPU:For example, the following expression shows a request to get the last five minutes of CPU usage:

$CPUPercent.GetSample(TimeInterval_Minute * 5)
MetodoMethod DescrizioneDescription
GetSample()GetSample() Il metodo GetSample() restituisce un vettore relativo ai campioni di dati.The GetSample() method returns a vector of data samples.

Un campione rappresenta 30 secondi di dati di metrica.A sample is 30 seconds worth of metrics data. In altre parole i campioni vengono raccolti ogni 30 secondi,In other words, samples are obtained every 30 seconds. ma come indicato di seguito si verifica un ritardo tra il momento in cui un campione viene raccolto e il momento in cui è disponibile per una formula.But as noted below, there is a delay between when a sample is collected and when it is available to a formula. Di conseguenza, i campioni per un determinato periodo di tempo potrebbero non essere tutti disponibili per la valutazione da parte di una formula.As such, not all samples for a given time period may be available for evaluation by a formula.
  • doubleVec GetSample(double count)
    Specifica il numero di campioni da ottenere tra quelli raccolti più di recente.Specifies the number of samples to obtain from the most recent samples that were collected.

    GetSample(1) restituisce l'ultimo campione disponibile.GetSample(1) returns the last available sample. Per le metriche come $CPUPercent non deve tuttavia essere usato perché non è possibile sapere quando è stato raccolto il campione.For metrics like $CPUPercent, however, this should not be used because it is impossible to know when the sample was collected. Potrebbe essere recente o risultare molto meno recente a causa di problemi di sistema.It might be recent, or, because of system issues, it might be much older. In questi casi è preferibile usare un intervallo di tempo, come illustrato di seguito.It is better in such cases to use a time interval as shown below.
  • doubleVec GetSample((timestamp or timeinterval) startTime [, double samplePercent])
    Specifica un intervallo di tempo per la raccolta di dati di esempio.Specifies a time frame for gathering sample data. Facoltativamente specifica anche la percentuale di campioni che deve essere disponibile nell'intervallo di tempo richiesto.Optionally, it also specifies the percentage of samples that must be available in the requested time frame.

    $CPUPercent.GetSample(TimeInterval_Minute * 10) restituisce 20 campioni se nella cronologia CPUPercent sono presenti tutti i campioni per gli ultimi 10 minuti.$CPUPercent.GetSample(TimeInterval_Minute * 10) would return 20 samples if all samples for the last 10 minutes are present in the CPUPercent history. Se l'ultimo minuto della cronologia non è disponibile, vengono tuttavia restituiti solo 18 campioni.If the last minute of history was not available, however, only 18 samples would be returned. In questo caso:In this case:

    $CPUPercent.GetSample(TimeInterval_Minute * 10, 95) avrà esito negativo poiché è disponibile solo il 90% dei campioni.$CPUPercent.GetSample(TimeInterval_Minute * 10, 95) would fail because only 90 percent of the samples are available.

    $CPUPercent.GetSample(TimeInterval_Minute * 10, 80) avrà esito positivo.$CPUPercent.GetSample(TimeInterval_Minute * 10, 80) would succeed.
  • 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.Specifies a time frame for gathering data, with both a start time and an end time.

    Come indicato in precedenza, si verifica un ritardo tra il momento in cui un campione viene raccolto e il momento in cui è disponibile per una formula.As mentioned above, there is a delay between when a sample is collected and when it is available to a formula. È necessario tenere presente questo ritardo quando si usa il metodo GetSample.Consider this delay when you use the GetSample method. Vedere GetSamplePercent di seguito.See GetSamplePercent below.
GetSamplePeriod()GetSamplePeriod() Restituisce il periodo dei campioni raccolti in un set di dati campione cronologici.Returns the period of samples that were taken in a historical sample data set.
Count()Count() Restituisce il numero totale di campioni nella cronologia dei dati di metrica.Returns the total number of samples in the metric history.
HistoryBeginTime()HistoryBeginTime() Restituisce il timestamp del campione di dati disponibile meno recente per la metrica.Returns the time stamp of the oldest available data sample for the metric.
GetSamplePercent()GetSamplePercent() Restituisce la percentuale di campioni disponibili per un determinato intervallo di tempo.Returns the percentage of samples that are available for a given time interval. Ad esempio:For example:

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.Because the GetSample method fails if the percentage of samples returned is less than the samplePercent specified, you can use the GetSamplePercent method to check first. È quindi possibile eseguire un'azione alternativa se non sono presenti campioni sufficienti, senza interrompere la valutazione del ridimensionamento automatico.Then you can perform an alternate action if insufficient samples are present, without halting the automatic scaling evaluation.

Campioni, percentuale di campioni e metodo GetSample()Samples, sample percentage, and the GetSample() method

L'operazione di base per il funzionamento di una formula di ridimensionamento automatico consiste nell'ottenere i dati di metrica relativi a risorse ed attività e quindi l'adeguamento delle dimensioni del pool in base a tali dati.The core operation of an autoscale formula is to obtain task and resource metric data and then adjust pool size based on that data. Di conseguenza, è importante conoscere a fondo la modalità di interazione delle formule di scalabilità automatica con i dati di metrica (campioni).As such, it is important to have a clear understanding of how autoscale formulas interact with metrics data (samples).

EsempiSamples

Il servizio Batch acquisisce periodicamente campioni di metriche relative a risorse e attività e li rende disponibili per le formule di scalabilità automatica.The Batch service periodically takes samples of task and resource metrics and makes them available to your autoscale formulas. Questi campioni vengono registrati ogni 30 secondi dal servizio Batch.These samples are recorded every 30 seconds by the Batch service. In genere si verifica un ritardo tra il momento in cui i campioni sono stati registrati e il momento in cui vengono resi disponibili e possono essere letti dalle formule di scalabilità automatica.However, there is typically a delay between when those samples were recorded and when they are made available to (and can be read by) your autoscale formulas. Inoltre, a causa di vari fattori, ad esempio problemi di rete o dell'infrastruttura, è possibile che i campioni non vengano registrati per un particolare intervallo.Additionally, due to various factors such as network or other infrastructure issues, samples may not be recorded for a particular interval.

Percentuale di campioniSample percentage

Quando si passa un oggetto samplePercent al metodo GetSample() o si chiama il metodo GetSamplePercent(), il termine percentuale si riferisce a un confronto tra il possibile numero totale di campioni registrati dal servizio Batch e il numero di campioni disponibili per la formula di scalabilità automatica.When samplePercent is passed to the GetSample() method or the GetSamplePercent() method is called, percent refers to a comparison between the total possible number of samples that are recorded by the Batch service and the number of samples that are available to your autoscale formula.

Come esempio, si esaminerà un intervallo di tempo di 10 minuti.Let's look at a 10-minute timespan as an example. Poiché i campioni vengono registrati ogni 30 secondi, in un intervallo di tempo di 10 minuti, il numero massimo totale di campioni registrati da Batch sarà di 20 campioni (2 al minuto).Because samples are recorded every 30 seconds within a 10-minute timespan, the maximum total number of samples that are recorded by Batch would be 20 samples (2 per minute). Tuttavia, a causa della latenza intrinseca del meccanismo di creazione di report e di altri problemi a all'interno di Azure, potrebbero essere disponibili solo 15 campioni per la lettura da parte della formula di scalabilità automatica.However, due to the inherent latency of the reporting mechanism and other issues within Azure, there may be only 15 samples that are available to your autoscale formula for reading. Per il periodo di 10 minuti, ad esempio, potrebbe essere quindi disponibile per la formula solo il 75% del numero totale di campioni registrati.So, for example, for that 10-minute period, only 75% of the total number of samples recorded may be available to your formula.

GetSample() e intervalli di campioniGetSample() and sample ranges

Le formule di scalabilità automatica+ aumentano e riducono i pool, aggiungendovi nodi o rimuovendoli.Your autoscale formulas are going to be growing and shrinking your pools — adding nodes or removing nodes. Poiché i nodi hanno un costo, si vuole garantire che le formule applichino decisioni intelligenti sulla base di dati sufficienti.Because nodes cost you money, you want to ensure that your formulas use an intelligent method of analysis that is based on sufficient data. È quindi consigliabile usare un tipo di analisi delle tendenze nelle formule,Therefore, we recommend that you use a trending-type analysis in your formulas. aumentando e riducendo i pool in base a un intervallo di campioni raccolti.This type grows and shrinks your pools based on a range of collected samples.

A tale scopo, usare GetSample(interval look-back start, interval look-back end) per restituire un vettore di campioni:To do so, use GetSample(interval look-back start, interval look-back end) to return a vector of samples:

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

Quando la riga precedente viene valutata da Batch, restituisce un intervallo di campioni come vettore di valori.When the above line is evaluated by Batch, it returns a range of samples as a vector of values. Ad esempio:For example:

$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.Once you've collected the vector of samples, you can then use functions like min(), max(), and avg() to derive meaningful values from the collected range.

Per maggiore sicurezza, è possibile fare in modo che la valutazione di una formula non riesca se per un determinato periodo di tempo è disponibile una quantità di campioni inferiore a una certa percentuale.For additional security, you can force a formula evaluation to fail if less than a certain sample percentage is available for a particular time period. L'impostazione di un esito negativo della valutazione della formula indica a Batch di interromperne l'ulteriore valutazione se la percentuale di campioni specificata non è disponibile.When you force a formula evaluation to fail, you instruct Batch to cease further evaluation of the formula if the specified percentage of samples is not available. In questo caso non viene apportata alcuna modifica alla dimensione del pool.In this case, no change is made to the pool size. Per specificare una percentuale di campioni obbligatoria perché la valutazione riesca, specificarla come terzo parametro in GetSample().To specify a required percentage of samples for the evaluation to succeed, specify it as the third parameter to GetSample(). Qui è specificato un requisito pari al 75% dei campioni:Here, a requirement of 75 percent of samples is specified:

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

Poiché si può verificare un ritardo nella disponibilità dei campioni, è importante specificare sempre un intervallo di tempo con un'ora di inizio antecedente di almeno un minuto.Because there may be a delay in sample availability, it is important to always specify a time range with a look-back start time that is older than one minute. La propagazione dei campioni attraverso il sistema richiede circa un minuto, quindi i campioni nell'intervallo (0 * TimeInterval_Second, 60 * TimeInterval_Second) possono non essere disponibili.It takes approximately one minute for samples to propagate through the system, so samples in the range (0 * TimeInterval_Second, 60 * TimeInterval_Second) may not be available. Anche in questo caso, è possibile usare il parametro percentuale di GetSample() per imporre uno specifico requisito di percentuale dei campioni.Again, you can use the percentage parameter of GetSample() to force a particular sample percentage requirement.

Importante

È consigliabile evitare di basarsi solo su GetSample(1) nelle formule di scalabilità automatica.We strongly recommend that you avoid relying only on GetSample(1) in your autoscale formulas. GetSample(1) indica infatti essenzialmente al servizio Batch di restituire l'ultimo campione disponibile, indipendentemente da quanto tempo prima è stato recuperato.This is because GetSample(1) essentially says to the Batch service, "Give me the last sample you have, no matter how long ago you retrieved it." Essendo solo un singolo campione, che potrebbe anche non essere recente, potrebbe non essere rappresentativo dell'immagine più ampia dello stato recente di attività o risorse.Since it is only a single sample, and it may be an older sample, it may not be representative of the larger picture of recent task or resource state. 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.If you do use GetSample(1), make sure that it's part of a larger statement and not the only data point that your formula relies on.

MetricheMetrics

Quando si definisce una formula, è possibile usare metriche di risorse e di attività.You can use both resource and task metrics when you're defining a formula. Adeguare il numero di destinazione di nodi dedicati nel pool in base ai dati di metrica ottenuti e valutati.You adjust the target number of dedicated nodes in the pool based on the metrics data that you obtain and evaluate. Per altre informazioni su ogni metrica, vedere la sezione Variabili precedente.See the Variables section above for more information on each metric.

MetricaMetric DescrizioneDescription
RisorsaResource

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.Resource metrics are based on the CPU, the bandwidth, the memory usage of compute nodes, and the number of nodes.

Queste variabili definite dal servizio sono utili per eseguire adeguamenti in base al conteggio dei nodi:These service-defined variables are useful for making adjustments based on node count:

  • $TargetDedicatedNodes$TargetDedicatedNodes
  • $TargetLowPriorityNodes$TargetLowPriorityNodes
  • $CurrentDedicatedNodes$CurrentDedicatedNodes
  • $CurrentLowPriorityNodes$CurrentLowPriorityNodes
  • $preemptedNodeCount$preemptedNodeCount
  • $SampleNodeCount$SampleNodeCount

Queste variabili definite dal servizio sono utili per eseguire adeguamenti in base all'utilizzo delle risorse dei nodi:These service-defined variables are useful for making adjustments based on node resource usage:

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

TaskTask

La metrica delle attività si basa sullo stato delle attività, ad esempio Attiva, In sospeso e Completata.Task metrics are based on the status of tasks, such as Active, Pending, and Completed. Le variabili definite dal servizio seguenti sono utili per gli adeguamenti delle dimensioni del pool basati sulla metrica delle attività:The following service-defined variables are useful for making pool-size adjustments based on task metrics:

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

Scrivere una formula di scalabilità automaticaWrite an autoscale formula

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.You build an autoscale formula by forming statements that use the above components, then combine those statements into a complete formula. In questa sezione si crea una formula di scalabilità automatica di esempio che può assumere alcune decisioni di scalabilità in scenari del mondo reale.In this section, we create an example autoscale formula that can perform some real-world scaling decisions.

In primo luogo, definire i requisiti per la nuova formula di scalabilità automatica.First, let's define the requirements for our new autoscale formula. La formula deve:The formula should:

  1. Aumentare il numero di destinazione dei nodi di calcolo dedicati in un pool se l'uso della CPU è elevato.Increase the target number of dedicated compute nodes in a pool if CPU usage is high.
  2. Ridurre il numero di destinazione dei nodi di calcolo dedicati in un pool se l'uso della CPU è basso.Decrease the target number of dedicated compute nodes in a pool when CPU usage is low.
  3. Limitare sempre il numero massimo di nodi dedicati a 400.Always restrict the maximum number of dedicated nodes to 400.

Per l'aumento del numero di nodi durante l'uso elevato della CPU, viene definita un'istruzione che popola una variabile definita dall'utente ($totalDedicatedNodes) con un valore pari al 110% dell'attuale numero di destinazione dei nodi dedicati, ma solo se l'uso minimo medio della CPU negli ultimi 10 minuti è superiore al 70%.To increase the number of nodes during high CPU usage, define the statement that populates a user-defined variable ($totalDedicatedNodes) with a value that is 110 percent of the current target number of dedicated nodes, but only if the minimum average CPU usage during the last 10 minutes was above 70 percent. In caso contrario, usare il valore per il numero corrente di nodi dedicati.Otherwise, use the value for the current number of dedicated nodes.

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

Per ridurre il numero di nodi dedicati durante l'uso non elevato della CPU, l'istruzione successiva nella formula imposta la stessa variabile $totalDedicatedNodes sul 90% dell'attuale numero di destinazione dei nodi dedicati, se l'uso medio della CPU negli ultimi 60 minuti è stato inferiore al 20%.To decrease the number of dedicated nodes during low CPU usage, the next statement in our formula sets the same $totalDedicatedNodes variable to 90 percent of the current target number of dedicated nodes if the average CPU usage in the past 60 minutes was under 20 percent. In caso contrario, usare il valore corrente di $totalDedicatedNodes, popolato nell'istruzione precedente.Otherwise, use the current value of $totalDedicatedNodes that we populated in the statement above.

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

Limitare ora il numero di destinazione dei nodi di calcolo dedicati a un massimo di 400:Now limit the target number of dedicated compute nodes to a maximum of 400:

$TargetDedicatedNodes = min(400, $totalDedicatedNodes)

Ecco la formula completa:Here's the complete formula:

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

Creare un pool abilitato per la scalabilità automatica con .NETCreate an autoscale-enabled pool with .NET

Per creare un pool con la scalabilità automatica abilitata in .NET, seguire questi passaggi:To create a pool with autoscaling enabled in .NET, follow these steps:

  1. Creare il pool con BatchClient.PoolOperations.CreatePool.Create the pool with BatchClient.PoolOperations.CreatePool.
  2. Impostare la proprietà CloudPool.AutoScaleEnabled su true.Set the CloudPool.AutoScaleEnabled property to true.
  3. Impostare la proprietà CloudPool.AutoScaleFormula con la formula di scalabilità automatica.Set the CloudPool.AutoScaleFormula property with your autoscale formula.
  4. (Facoltativo) Impostare la proprietà CloudPool.AutoScaleEvaluationInterval (valore predefinito è 15 minuti).(Optional) Set the CloudPool.AutoScaleEvaluationInterval property (default is 15 minutes).
  5. Eseguire il commit del pool con CloudPool.Commit o CommitAsync.Commit the pool with CloudPool.Commit or CommitAsync.

Il frammento di codice seguente crea un pool abilitato per la scalabilità automatica in .NET.The following code snippet creates an autoscale-enabled pool in .NET. La formula di scalabilità automatica del pool imposta il numero di destinazione dei nodi dedicati su 5 il lunedì e su 1 per tutti gli altri giorni della settimana.The pool's autoscale formula sets the target number of dedicated nodes to 5 on Mondays, and 1 on every other day of the week. L'intervallo di scalabilità automatica è impostato su 30 minuti.The automatic scaling interval is set to 30 minutes. In questo e in altri frammenti di codice C# in questo articolo, myBatchClient è un'istanza correttamente inizializzata della classe BatchClient.In this and the other C# snippets in this article, myBatchClient is a properly initialized instance of the BatchClient class.

CloudPool pool = myBatchClient.PoolOperations.CreatePool(
                    poolId: "mypool",
                    virtualMachineSize: "small", // single-core, 1.75 GB memory, 225 GB disk
                    cloudServiceConfiguration: new CloudServiceConfiguration(osFamily: "5"));    
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 targetDedicatedComputeNodes o il parametro targetLowPriorityComputeNodes nella chiamata a CreatePool.When you create an autoscale-enabled pool, do not specify the targetDedicatedComputeNodes parameter or the targetLowPriorityComputeNodes parameter on the call to CreatePool. Specificare invece le proprietà AutoScaleEnabled e AutoScaleFormula nel pool.Instead, specify the AutoScaleEnabled and AutoScaleFormula properties on the pool. I valori per queste proprietà determinano il numero di destinazione di ogni tipo di nodo.The values for these properties determine the target number of each type of node. Inoltre, per ridimensionare manualmente un pool abilitato per la scalabilità automatica, ad esempio con BatchClient.PoolOperations.ResizePoolAsync, è prima necessario disabilitare la scalabilità automatica nel pool e quindi ridimensionarlo.Also, to manually resize an autoscale-enabled pool (for example, with BatchClient.PoolOperations.ResizePoolAsync), first disable automatic scaling on the pool, then resize it.

Oltre a Batch .NET, è possibile usare qualsiasi altro SDK per Batch, l'API REST per Batch, i cmdlet di PowerShell per Batch e l'interfaccia della riga di comando di Batch per configurare la scalabilità automatica.In addition to Batch .NET, you can use any of the other Batch SDKs, Batch REST, Batch PowerShell cmdlets, and the Batch CLI to configure autoscaling.

Intervallo di ridimensionamento automaticoAutomatic scaling interval

Per impostazione predefinita, il servizio Batch adegua le dimensioni di un pool in base alla relativa formula di ridimensionamento automatico ogni 15 minuti.By default, the Batch service adjusts a pool's size according to its autoscale formula every 15 minutes. Questo intervallo è configurabile usando le proprietà del pool seguenti:This interval is configurable by using the following pool properties:

L'intervallo minimo è di 5 minuti e il massimo di 168 ore.The minimum interval is five minutes, and the maximum is 168 hours. Se viene specificato un intervallo che non rientra in questi valori, il servizio Batch restituisce un errore di richiesta non valida (400).If an interval outside this range is specified, the Batch service returns a Bad Request (400) error.

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.Autoscaling is not currently intended to respond to changes in less than a minute, but rather is intended to adjust the size of your pool gradually as you run a workload.

Abilitare la scalabilità automatica in un pool esistenteEnable autoscaling on an existing pool

Ogni SDK per Batch offre un modo per abilitare la scalabilità automatica,Each Batch SDK provides a way to enable autoscaling. ad esempio:For example:

Quando si abilita la scalabilità automatica in un pool esistente, tenere presente quanto segue:When you enable autoscaling on an existing pool, keep in mind the following points:

  • Se la scalabilità automatica è attualmente disabilitata nel pool quando si esegue la richiesta per l'abilitazione, è necessario specificare una formula di scalabilità automatica valida quando si esegue la richiesta.If automatic scaling is currently disabled on the pool when you issue the request to enable autoscaling, you must specify a valid autoscale formula when you issue the request. Facoltativamente, è possibile specificare un intervallo di valutazione della scalabilità automatica.You can optionally specify an autoscale evaluation interval. Se non si specifica un intervallo, viene applicato il valore predefinito, pari a 15 minuti.If you do not specify an interval, the default value of 15 minutes is used.
  • Se la scalabilità automatica è attualmente abilitata nel pool, è possibile specificare una formula di scalabilità automatica, un intervallo di valutazione o entrambi.If autoscale is currently enabled on the pool, you can specify an autoscale formula, an evaluation interval, or both. È necessario specificare almeno una di queste proprietà.You must specify at least one of these properties.

    • Se si specifica un nuovo intervallo per la valutazione della scalabilità automatica, la pianificazione esistente per la valutazione viene arrestata e viene avviata una nuova pianificazione.If you specify a new autoscale evaluation interval, then the existing evaluation schedule is stopped and a new schedule is started. L'ora di inizio della nuova pianificazione corrisponde al momento in cui è stata inviata la richiesta di abilitazione della scalabilità automatica.The new schedule's start time is the time at which the request to enable autoscaling was issued.
    • Se si omette la formula di scalabilità automatica o l'intervallo di valutazione, il servizio Batch continuerà a usare il valore corrente.If you omit either the autoscale formula or evaluation interval, the Batch service continues to use the current value of that setting.

Nota

Se si specificano valori per i parametri targetDedicatedComputeNodes o targetLowPriorityComputeNodes del metodo CreatePool al momento della creazione del pool in .NET, o per parametri analoghi in un altro linguaggio, questi valori vengono ignorati quando viene valutata la formula di scalabilità automatica.If you specified values for the targetDedicatedComputeNodes or targetLowPriorityComputeNodes parameters of the CreatePool method when you created the pool in .NET, or for the comparable parameters in another language, then those values are ignored when the automatic scaling formula is evaluated.

Questo frammento di codice C# usa la libreria Batch .NET per abilitare la scalabilità automatica in un pool esistente:This C# code snippet uses the Batch .NET library to enable autoscaling on an existing 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);

Aggiornare una formula di scalabilità automaticaUpdate an autoscale formula

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.To update the formula on an existing autoscale-enabled pool, call the operation to enable autoscaling again with the new 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.For example, if autoscaling is already enabled on myexistingpool when the following .NET code is executed, its autoscale formula is replaced with the contents of myNewFormula.

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

Aggiornare l'intervallo di scalabilità automaticaUpdate the autoscale interval

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.To update the autoscale evaluation interval of an existing autoscale-enabled pool, call the operation to enable autoscaling again with the new interval. 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:For example, to set the autoscale evaluation interval to 60 minutes for a pool that's already autoscale-enabled in .NET:

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

Valutare la formula di scalabilità automaticaEvaluate an autoscale formula

È possibile valutare la formula prima di applicarla a un pool.You can evaluate a formula before applying it to a pool. In questo modo, è possibile testare la formula per vedere in che modo le relative istruzioni vengono valutate prima di inserire la formula nell'ambiente di produzione.In this way, you can test the formula to see how its statements evaluate before you put the formula into production.

Per valutare una formula di scalabilità automatica, è necessario avere abilitato prima la scalabilità automatica nel pool con una formula valida.To evaluate an autoscale formula, you must first enable autoscaling on the pool with a valid formula. Per testare una formula in un pool che non dispone ancora di scalabilità automatica abilitata, usare la formula $TargetDedicatedNodes = 0 a una riga quando si abilita per la prima volta la scalabilità automatica.To test a formula on a pool that doesn't yet have autoscaling enabled, use the one-line formula $TargetDedicatedNodes = 0 when you first enable autoscaling. Usare quindi uno dei metodi seguenti per valutare la formula da testare:Then, use one of the following to evaluate the formula you want to test:

Questo frammento di codice Batch .NET valuta una formula di scalabilità automatica.In this Batch .NET code snippet, we evaluate an autoscale formula. Se il pool non dispone di scalabilità automatica abilitata, è necessario abilitarla prima.If the pool does not have autoscaling enabled, we enable it first.

// 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 non-autoscale-enabled pool.
if (pool.AutoScaleEnabled == false)
{
    // We need a valid autoscale formula to enable autoscaling on the
    // pool. This formula is valid, but won't resize the pool:
    await pool.EnableAutoScaleAsync(
        autoscaleFormula: "$TargetDedicatedNodes = {pool.CurrentDedicatedNodes};",
        autoscaleEvaluationInterval: TimeSpan.FromMinutes(5));

    // Batch limits EnableAutoScaleAsync calls to once every 30 seconds.
    // Because we want to apply our new autoscale formula below if it
    // evaluates successfully, and we *just* enabled autoscaling on
    // this pool, we pause here to ensure we pass that threshold.
    Thread.Sleep(TimeSpan.FromSeconds(31));

    // Refresh the properties of the pool so that we've got the
    // latest value for AutoScaleEnabled
    await pool.RefreshAsync();
}

// We must ensure that autoscaling is enabled on the pool prior to
// evaluating a formula
if (pool.AutoScaleEnabled == true)
{
    // The formula to evaluate - adjusts target number of nodes based on
    // day of week and time of day
    string myFormula = @"
        $curTime = time();
        $workHours = $curTime.hour >= 8 && $curTime.hour < 18;
        $isWeekday = $curTime.weekday >= 1 && $curTime.weekday <= 5;
        $isWorkingWeekdayHour = $workHours && $isWeekday;
        $TargetDedicatedNodes = $isWorkingWeekdayHour ? 20:10;
    ";

    // Perform the autoscale formula evaluation. Note that this code does not
    // actually apply the formula to the pool.
    AutoScaleRun eval =
        await batchClient.PoolOperations.EvaluateAutoScaleAsync(pool.Id, myFormula);

    if (eval.Error == null)
    {
        // Evaluation success - print the results of the AutoScaleRun.
        // This will display the values of each variable as evaluated by the
        // autoscale formula.
        Console.WriteLine("AutoScaleRun.Results: " +
            eval.Results.Replace("$", "\n    $"));

        // Apply the formula to the pool since it evaluated successfully
        await batchClient.PoolOperations.EnableAutoScaleAsync(pool.Id, myFormula);
    }
    else
    {
        // Evaluation failed, output the message associated with the error
        Console.WriteLine("AutoScaleRun.Error.Message: " +
            eval.Error.Message);
    }
}

La valutazione corretta della formula in questo frammento di codice produce risultati simili ai seguenti:Successful evaluation of the formula shown in this code snippet produces results similar to:

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à automaticaGet information about autoscale runs

Per garantire che la formula funzioni come previsto, è consigliabile controllare periodicamente i risultati delle operazioni di scalabilità automatica eseguite da Batch sul pool.To ensure that your formula is performing as expected, we recommend that you periodically check the results of the autoscaling runs that Batch performs on your pool. A tale scopo, ottenere o aggiornare un riferimento al pool ed esaminare le proprietà dell'ultima esecuzione di scalabilità automatica.To do so, get (or refresh) a reference to the pool, and examine the properties of its last autoscale run.

In .NET di Batch la proprietà CloudPool.AutoScaleRun presenta varie proprietà che forniscono informazioni sull'ultima esecuzione di scalabilità automatica sul pool:In Batch .NET, the CloudPool.AutoScaleRun property has several properties that provide information about the latest automatic scaling run performed on the 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.In the REST API, the Get information about a pool request returns information about the pool, which includes the latest automatic scaling run information in the autoScaleRun property.

Il frammento di codice C# seguente usa la libreria .NET di Batch per stampare informazioni sull'ultima esecuzione della scalabilità automatica nel pool myPool:The following C# code snippet uses the Batch .NET library to print information about the last autoscaling run on 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);

Esempio di output del frammento precedente:Sample output of the preceding snippet:

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:

Formule di scalabilità automatica di esempioExample autoscale formulas

Di seguito verranno esaminate alcune formule che mostrano diverse modalità per regolare la quantità di risorse di calcolo in un pool.Let's look at a few formulas that show different ways to adjust the amount of compute resources in a pool.

Esempio 1: Adeguamento basato sul tempoExample 1: Time-based adjustment

Si supponga di volte regolare le dimensioni del pool in base al giorno della settimana e all'ora del giorno.Suppose you want to adjust the pool size based on the day of the week and time of day. Questo esempio mostra come aumentare o ridurre il numero di nodi nel pool di conseguenza.This example shows how to increase or decrease the number of nodes in the pool accordingly.

La formula ottiene prima di tutto l'ora corrente.The formula first obtains the current time. 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.If it's a weekday (1-5) and within working hours (8 AM to 6 PM), the target pool size is set to 20 nodes. In caso contrario, vengono impostate su 10 nodi.Otherwise, it's set to 10 nodes.

$curTime = time();
$workHours = $curTime.hour >= 8 && $curTime.hour < 18;
$isWeekday = $curTime.weekday >= 1 && $curTime.weekday <= 5;
$isWorkingWeekdayHour = $workHours && $isWeekday;
$TargetDedicatedNodes = $isWorkingWeekdayHour ? 20:10;

Esempio 2: Adeguamento basato sulle attivitàExample 2: Task-based adjustment

In questo esempio le dimensioni del pool vengono regolate in base al numero di attività nella coda.In this example, the pool size is adjusted based on the number of tasks in the queue. Sia i commenti che le interruzioni di riga sono accettabili nelle stringhe della formula.Both comments and line breaks are acceptable in formula strings.

// Get pending tasks for the past 15 minutes.
$samples = $ActiveTasks.GetSamplePercent(TimeInterval_Minute * 15);
// If we have fewer than 70 percent data points, we use the last sample point,
// otherwise we use the maximum of last sample point and the history average.
$tasks = $samples < 70 ? max(0,$ActiveTasks.GetSample(1)) : max( $ActiveTasks.GetSample(1), avg($ActiveTasks.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 - keep nodes active only until tasks finish
$NodeDeallocationOption = taskcompletion;

Esempio 3: Considerazioni sulle attività paralleleExample 3: Accounting for parallel tasks

Questo esempio adegua le dimensioni del pool in base al numero di attività.This example adjusts the pool size based on the number of tasks. Questa formula considera anche il valore MaxTasksPerComputeNode impostato per il pool.This formula also takes into account the MaxTasksPerComputeNode value that has been set for the pool. Questo approccio è utile nelle situazioni in cui l'esecuzione di attività parallele è abilitata nel pool.This approach is useful in situations where parallel task execution has been enabled on your 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
// MaxTasksPerComputeNode 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 poolExample 4: Setting an initial pool size

Questo esempio mostra un frammento di codice 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.This example shows a C# code snippet with an autoscale formula that sets the pool size to a specified number of nodes for an initial time period. Adegua quindi le dimensioni del pool in base al numero di attività in esecuzione e attive dopo la scadenza del periodo di tempo iniziale.Then it adjusts the pool size based on the number of running and active tasks after the initial time period has elapsed.

La formula nel frammento di codice seguente:The formula in the following code snippet:

  • Imposta le dimensioni iniziali del pool su 4 nodi.Sets the initial pool size to four nodes.
  • Non modifica le dimensioni del pool nei primi 10 minuti del relativo ciclo di vita.Does not adjust the pool size within the first 10 minutes of the pool's lifecycle.
  • Dopo 10 minuti ottiene il valore massimo del numero di attività in esecuzione e attive negli ultimi 60 minuti.After 10 minutes, obtains the max value of the number of running and active tasks within the past 60 minutes.
    • Se entrambi i valori corrispondono a 0, ovvero nessuna attività era in esecuzione o attiva negli ultimi 60 minuti, le dimensioni del pool vengono impostate su 0.If both values are 0 (indicating that no tasks were running or active in the last 60 minutes), the pool size is set to 0.
    • Se uno dei valori è maggiore di zero, non viene apportata alcuna modifica.If either value is greater than zero, no change is made.
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 successiviNext steps

  • Ottimizzare l'uso delle risorse di calcolo di Azure Batch con attività dei nodi simultanee contiene informazioni dettagliate su come è possibile eseguire più attività contemporaneamente sui nodi di calcolo nel pool.Maximize Azure Batch compute resource usage with concurrent node tasks contains details about how you can execute multiple tasks simultaneously on the compute nodes in your pool. Oltre al ridimensionamento automatico, questa funzionalità può contribuire a ridurre la durata del processo per alcuni carichi di lavoro, riducendo i costi.In addition to autoscaling, this feature may help to lower job duration for some workloads, saving you money.
  • Per ottimizzare ulteriormente l'efficienza, assicurarsi che l'applicazione Batch esegua query sul servizio Batch in modo ottimale.For another efficiency booster, ensure that your Batch application queries the Batch service in the most optimal way. Vedere Eseguire query sul servizio Azure Batch in modo efficiente per informazioni su come limitare la quantità dei dati trasmessi in rete quando si esegue una query sullo stato potenzialmente di migliaia di nodi di calcolo o attività.See Query the Azure Batch service efficiently to learn how to limit the amount of data that crosses the wire when you query the status of potentially thousands of compute nodes or tasks.