Flapping in scalabilità automatica

Questo articolo descrive il flapping nella scalabilità automatica e come evitarlo.

Flapping fa riferimento a una condizione del ciclo che causa una serie di eventi di scala opposti. Il flapping si verifica quando un evento di scalabilità attiva l'evento di scala opposto.

La scalabilità automatica valuta un'azione di scalabilità in sospeso per verificare se provocherebbe l'instabilità. Nei casi in cui può verificarsi l'instabilità, la scalabilità automatica può ignorare l'azione di scalabilità e rivalutare l'esecuzione successiva oppure la scalabilità automatica può essere ridimensionata di meno del numero specificato di istanze di risorse. Il processo di valutazione della scalabilità automatica viene eseguito ogni volta che viene eseguito il motore di scalabilità automatica, ogni 30-60 secondi, a seconda del tipo di risorsa.

Per garantire risorse adeguate, il controllo del potenziale flapping non si verifica per gli eventi di aumento del numero di istanze. La scalabilità automatica rinvia solo un evento di ridimensionamento per evitare il flapping.

Si supponga, ad esempio, le regole seguenti:

  • Aumentare il numero di istanze di 1 istanza quando l'utilizzo medio della CPU è superiore al 50%.
  • Ridurre il numero di istanze di 1 istanza quando l'utilizzo medio della CPU è inferiore al 30%.

Nella tabella seguente in T0, quando l'utilizzo è al 56%, viene attivata un'azione di aumento del numero di istanze e viene generato un utilizzo della CPU del 56% in 2 istanze. Ciò dà una media del 28% per il set di scalabilità. Poiché il 28% è inferiore alla soglia di scalabilità orizzontale, la scalabilità automatica dovrebbe ridurre le prestazioni. Il ridimensionamento in restituirà il set di scalabilità al 56% dell'utilizzo della CPU, che attiva un'azione di aumento del numero di istanze.

Ora Numero di istanze % CPU % CPU per istanza Evento di scalabilità Numero di istanze risultanti
T0 1 56% 56% Aumentare il numero di istanze 2
T1 2 56% 28% Ridurre il numero di istanze 1
T2 1 56% 56% Aumentare il numero di istanze 2
T3 2 56% 28% Ridurre il numero di istanze 1

Se lasciato incontrollato, ci sarebbe una serie continuativa di eventi di scala. In questa situazione, tuttavia, il motore di scalabilità automatica rinvierà l'evento di scalabilità orizzontale in T1 e rivalutarà durante l'esecuzione successiva della scalabilità automatica. Il ridimensionamento avverrà solo una volta che l'utilizzo medio della CPU è inferiore al 30%.

Il flapping è spesso causato da:

  • Margini piccoli o non compresi tra le soglie
  • Ridimensionamento in base a più istanze
  • Aumento e riduzione delle prestazioni usando metriche diverse

Margini piccoli o non compresi tra le soglie

Per evitare il flapping, mantenere margini adeguati tra le soglie di ridimensionamento.

Ad esempio, le regole seguenti in cui non è presente alcun margine tra le soglie, causano il flapping.

  • Aumento del numero >di thread =600
  • Aumentare le prestazioni quando il numero di thread è < 600

Screenshot che mostra le regole di scalabilità automatica con aumento del numero di thread quando il numero di thread è maggiore o uguale a 600 e aumenta quando il numero di thread è minore di 600.

La tabella seguente illustra un potenziale risultato di queste regole di scalabilità automatica:

Ora Numero di istanze Numero thread Numero di thread per istanza Evento di scalabilità Numero di istanze risultanti
T0 2 1250 625 Aumentare il numero di istanze 3
T1 3 1250 417 Ridurre il numero di istanze 2
  • Al momento T0, sono presenti due istanze che gestiscono 1250 thread o 625 tapis per istanza. La scalabilità automatica aumenta fino a tre istanze.
  • Dopo la scalabilità orizzontale, in T1, sono presenti gli stessi 1250 thread, ma con tre istanze, solo 417 thread per istanza. Viene attivato un evento di scalabilità orizzontale.
  • Prima del ridimensionamento, la scalabilità automatica valuta cosa accadrebbe se si verifica l'evento di scalabilità orizzontale. In questo esempio 1250 / 2 = 625, ovvero 625 thread per istanza. La scalabilità automatica deve aumentare immediatamente il numero di istanze dopo il ridimensionamento. Se è stato ridimensionato di nuovo, il processo si ripete, causando un ciclo di instabilità.
  • Per evitare questa situazione, la scalabilità automatica non viene ridimensionata. La scalabilità automatica ignora l'evento di scalabilità corrente e rivaluta la regola nel ciclo di esecuzione successivo.

In questo caso, sembra che la scalabilità automatica non funzioni perché non viene eseguito alcun evento di scalabilità. Controllare la scheda Cronologia di esecuzione nella pagina delle impostazioni di scalabilità automatica per verificare se è presente un instabilità.

Screenshot che mostra la scheda cronologia di esecuzione della scalabilità automatica con i record che mostrano l'instabilità.

L'impostazione di un margine adeguato tra le soglie evita lo scenario precedente. Ad esempio,

  • Aumento del numero >di thread =600
  • Aumentare le prestazioni quando il numero di thread è < 400

Screenshot che mostra le regole di scalabilità automatica con aumento del numero di thread quando il numero di thread è maggiore o uguale a 600 e viene ridimensionato quando il numero di thread è minore di 400.

Se il numero di thread con scalabilità orizzontale è 400, il numero totale di thread deve essere inferiore a 1200 prima che venga eseguito un evento di scalabilità. Vedere la tabella riportata di seguito.

Ora Numero di istanze Numero thread Numero di thread per istanza Ridimensionare l'evento Numero di istanze risultanti
T0 2 1250 625 Aumentare il numero di istanze 3
T1 3 1250 417 nessun evento di scalabilità 3
T2 3 1180 394 scalabilità in 2
T3 3 1180 590 nessun evento di scalabilità 2

Ridimensionamento per più di un'istanza

Per evitare il flapping durante il ridimensionamento in o l'uscita da più di un'istanza, la scalabilità automatica può essere ridimensionata in base al numero di istanze specificate nella regola.

Ad esempio, le regole seguenti possono causare il flapping:

  • Ridimensionare il numero di richieste per 20 quando il numero >di richieste =200 per istanza.
  • OR quando CPU > 70% per istanza.
  • Ridimensionare in per 10 quando il numero <di richieste =50 per istanza.

Screenshot che mostra una condizione di scalabilità predefinita di scalabilità automatica con regole configurate per l'esempio.

La tabella seguente mostra un potenziale risultato di queste regole di scalabilità automatica:

Ora Numero di istanze CPU Numero di richieste Ridimensionare l'evento Istanze risultanti Commenti
T0 30 65% 3000 o 100 per istanza. Nessun evento di scalabilità 30
T1 30 65 1500 Ridimensionare in per 3 istanze 27 Il ridimensionamento in base a 10 causerebbe un aumento stimato della CPU superiore al 70%, causando un evento di scalabilità orizzontale.

Al momento T0, l'app è in esecuzione con 30 istanze, un numero totale di richieste pari a 3000 e un utilizzo della CPU del 65% per istanza.

In T1, quando il conteggio delle richieste scende a 1500 richieste o 50 richieste per istanza, la scalabilità automatica tenterà di ridimensionare in 10 istanze a 20. Tuttavia, la scalabilità automatica stima che il carico della CPU per 20 istanze sarà superiore al 70%, causando un evento di scalabilità orizzontale.

Per evitare il flapping, il motore di scalabilità automatica stima l'utilizzo della CPU per istanza superiore a 20 fino a quando non trova un numero di istanze in cui tutte le metriche sono con nelle soglie definite:

  • Mantenere la CPU inferiore al 70%.
  • Mantenere il numero di richieste per istanza superiore a 50.
  • Ridurre il numero di istanze inferiori a 30.

In questa situazione, la scalabilità automatica può essere ridimensionata in base a 3, da 30 a 27 istanze per soddisfare le regole, anche se la regola specifica una diminuzione di 10. Un messaggio di log viene scritto nel log attività con una descrizione che include Scale down si verificherà con il conteggio delle istanze aggiornato per evitare il flapping

Se la scalabilità automatica non riesce a trovare un numero appropriato di istanze, ignorare la scalabilità in caso di evento e rivalutare durante il ciclo successivo.

Nota

Se il motore di scalabilità automatica rileva che il flapping potrebbe verificarsi in seguito al numero di istanze di destinazione, tenterà anche di ridimensionare un numero inferiore di istanze tra il conteggio corrente e il conteggio di destinazione. Se il flapping non si verifica all'interno di questo intervallo, la scalabilità automatica continuerà l'operazione di scalabilità con la nuova destinazione.

File di log

Trovare il flapping nel log attività con la query seguente:

// Activity log, CategoryValue: Autoscale
// Lists latest Autoscale operations from the activity log, with OperationNameValue =="Microsoft.Insights/AutoscaleSettings/Flapping/Action
AzureActivity
|where CategoryValue =="Autoscale" and OperationNameValue =="Microsoft.Insights/AutoscaleSettings/Flapping/Action"
|sort by TimeGenerated desc 

Di seguito è riportato un esempio di record del log attività per il flapping:

Screenshot che mostra un record di log da un evento di flapping.

{
"eventCategory": "Autoscale",
"eventName": "FlappingOccurred",
"operationId": "ffd31c67-1438-47a5-bee4-1e3a102cf1c2",
"eventProperties": 
    "{"Description":"Scale down will occur with updated instance count to avoid flapping. 
     Resource: '/subscriptions/d1234567-9876-a1b2-a2b1-123a567b9f8767/  resourcegroups/ed-rg-001/providers/Microsoft.Web/serverFarms/  ScaleableAppServicePlan'.
     Current instance count: '6', 
     Intended new instance count: '1'.
     Actual new instance count: '4'",
    "ResourceName":"/subscriptions/d1234567-9876-a1b2-a2b1-123a567b9f8767/resourcegroups/ed-rg-001/providers/Microsoft.Web/serverFarms/ScaleableAppServicePlan",
    "OldInstancesCount":6,
    "NewInstancesCount":4,
    "ActiveAutoscaleProfile":{"Name":"Auto created scale condition",
    "Capacity":{"Minimum":"1","Maximum":"30","Default":"1"},
    "Rules":[{"MetricTrigger":{"Name":"Requests","Namespace":"microsoft.web/sites","Resource":"/subscriptions/d1234567-9876-a1b2-a2b1-123a567b9f8767/resourceGroups/ed-rg-001/providers/Microsoft.Web/sites/ScaleableWebApp1","ResourceLocation":"West Central US","TimeGrain":"PT1M","Statistic":"Average","TimeWindow":"PT1M","TimeAggregation":"Maximum","Operator":"GreaterThanOrEqual","Threshold":3.0,"Source":"/subscriptions/d1234567-9876-a1b2-a2b1-123a567b9f8767/resourceGroups/ed-rg-001/providers/Microsoft.Web/sites/ScaleableWebApp1","MetricType":"MDM","Dimensions":[],"DividePerInstance":true},"ScaleAction":{"Direction":"Increase","Type":"ChangeCount","Value":"10","Cooldown":"PT1M"}},{"MetricTrigger":{"Name":"Requests","Namespace":"microsoft.web/sites","Resource":"/subscriptions/d1234567-9876-a1b2-a2b1-123a567b9f8767/resourceGroups/ed-rg-001/providers/Microsoft.Web/sites/ScaleableWebApp1","ResourceLocation":"West Central US","TimeGrain":"PT1M","Statistic":"Max","TimeWindow":"PT1M","TimeAggregation":"Maximum","Operator":"LessThan","Threshold":3.0,"Source":"/subscriptions/d1234567-9876-a1b2-a2b1-123a567b9f8767/resourceGroups/ed-rg-001/providers/Microsoft.Web/sites/ScaleableWebApp1","MetricType":"MDM","Dimensions":[],"DividePerInstance":true},"ScaleAction":{"Direction":"Decrease","Type":"ChangeCount","Value":"5","Cooldown":"PT1M"}}]}}",
"eventDataId": "b23ae911-55d0-4881-8684-fc74227b2ddb",
"eventSubmissionTimestamp": "2022-09-13T07:20:41.1589076Z",
"resource": "scaleableappserviceplan",
"resourceGroup": "ED-RG-001",
"resourceProviderValue": "MICROSOFT.WEB",
"subscriptionId": "D1234567-9876-A1B2-A2B1-123A567B9F876",
"activityStatusValue": "Succeeded"
}

Passaggi successivi

Per altre informazioni sulla scalabilità automatica, vedere le risorse seguenti: