Condividi tramite


Flapping nella scalabilità automatica

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

Il flapping si riferisce a una condizione del ciclo che causa una serie di eventi di ridimensionamento opposti. Il flapping si verifica quando un evento di ridimensionamento attiva l'evento di ridimensionamento opposto.

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

Per garantire risorse adeguate, il controllo del flapping potenziale non avviene per eventi di aumento. La scalabilità automatica rinvierà solo un evento di riduzione per evitare il flapping.

Si supponga, ad esempio, di assumere 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 a T0, quando l'utilizzo è al 56%, viene attivata un'azione di scale-out e si ottiene un utilizzo della CPU del 56% su 2 istanze. In questo modo si ottiene 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. La diminuzione restituirà il set di scalabilità al 56% dell'utilizzo della CPU, che attiva un'azione di aumento.

Tempo Numero di istanze % CPU % CPU per istanza Evento di scalabilità Numero di istanze risultanti
T0 1 56% 56% Aumento 2
T1 2 56% 28% Riduzione 1
T2 1 56% 56% Aumento 2
T3 2 56% 28% Riduzione 1

Se lasciato incontrollato, ci sarebbe una serie continua di eventi su larga scala. Tuttavia, in questa situazione il motore di scalabilità automatica posticiperà l'evento di riduzione in T1 e lo rivaluterà 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 nulli tra le soglie
  • Ridimensionamento in base a più istanze
  • Aumento e riduzione usando metriche diverse

Margini piccoli o nulli tra le soglie

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

Ad esempio, le regole seguenti in cui non esiste alcun margine tra le soglie, causano oscillazioni.

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

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

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

Tempo Numero di istanze Conteggio thread Numero di thread per istanza Evento di scalabilità Numero di istanze risultanti
T0 2 1250 625 Aumento 3
T1 3 1250 417 Riduzione 2
  • Al momento T0, sono presenti due istanze che gestiscono 1250 thread o 625 thread per istanza. La scalabilità automatica aumenta fino a tre istanze.
  • Dopo il ridimensionamento 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 verificasse l'evento di scalabilità orizzontale. In questo esempio, 1250 / 2 = 625, ovvero 625 thread per istanza. La scalabilità automatica deve aumentare immediatamente le istanze dopo il ridimensionamento. Se è stato nuovamente ridimensionato, il processo viene ripetuto, causando un ciclo di instabilità.
  • Per evitare questa situazione, la scalabilità automatica non viene ridimensionata. La scalabilità automatica ignora l'evento di ridimensionamento 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 c'è un'oscillazione.

Screenshot che mostra la scheda cronologia di esecuzione della scalabilità automatica con i record che mostrano il flapping.

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

  • Aumentare quando il numero di thread >=600
  • Ridurre quando il conteggio dei di thread è < 400

Una screenshot che mostra le regole di scalabilità automatica con scalare verso l'esterno quando il numero di thread è maggiore o uguale a 600 e scalare verso l'interno quando il numero di thread è minore di 400.

Se il numero di thread con scalabilità orizzontale è 400, il numero totale di thread dovrebbe scendere al di sotto di 1200 prima che venga eseguito un evento di scala. Vedere la tabella riportata di seguito.

Tempo Numero di istanze Conteggio thread Numero di thread per istanza Evento di scalabilità Numero di istanze risultanti
T0 2 1250 625 Aumento 3
T1 3 1250 417 nessun evento su scala 3
T2 3 1180 394 riduzione 2
T3 3 1180 590 nessun evento su scala 2

Ridimensionamento in base a più istanze

Per evitare il flapping durante la riduzione o l'aumento di più istanze, la scalabilità automatica può eseguire il ridimensionamento di un numero di istanze inferiore a quello specificato nella regola.

Ad esempio, le regole seguenti possono causare il fenomeno di flapping:

  • Aumentare di 20 quando il numero di richieste >=200 per istanza.
  • OPPURE quando la CPU > 70% per istanza.
  • Ridurre di 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 illustra un potenziale risultato di queste regole di scalabilità automatica:

Tempo Numero di istanze CPU (Unità Centrale di Elaborazione) Conteggio delle richieste Evento di scalabilità Istanze risultanti Commenti
T0 30 65% 3000 o 100 per istanza. Nessun evento di ridimensionamento 30
T1 30 65 anno 1500 Ridurre di 3 istanze 27 La riduzione di 10 causerebbe un aumento stimato della CPU superiore al 70%, causando un evento di aumento.

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.

A T1, quando il conteggio delle richieste scende a 1500 richieste o 50 richieste per istanza, il sistema di scalabilità automatica tenterà di ridurre di 10 istanze fino a portare a 20. Tuttavia, la scalabilità automatica stima che il carico della CPU per 20 istanze sarà superiore al 70%, causando un evento di aumento.

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

  • Mantenere la CPU inferiore al 70%.
  • Assicurarsi di mantenere il numero delle richieste per istanza al di sopra di 50.
  • Ridurre il numero di istanze a meno di 30.

In questo caso, la scalabilità automatica può essere ridimensionata di 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 La riduzione del numero di istanze avverrà con il numero di istanze aggiornato per evitare il flapping

Se la scalabilità automatica non riesce a trovare un numero appropriato di istanze, ignora la scalabilità nell'evento e rivaluta durante il ciclo successivo.

Nota

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

File di registro

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 registro delle attività per il flapping.

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

{
"eventCategory": "Autoscale",
"eventName": "FlappingOccurred",
"operationId": "1111bbbb-22cc-dddd-ee33-ffffff444444",
"eventProperties": 
    "{"Description":"Scale down will occur with updated instance count to avoid flapping. 
     Resource: '/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/ed-rg-001/providers/Microsoft.Web/sites/ScaleableWebApp1","MetricType":"MDM","Dimensions":[],"DividePerInstance":true},"ScaleAction":{"Direction":"Decrease","Type":"ChangeCount","Value":"5","Cooldown":"PT1M"}}]}}",
"eventDataId": "dddd3333-ee44-5555-66ff-777777aaaaaa",
"eventSubmissionTimestamp": "2022-09-13T07:20:41.1589076Z",
"resource": "scaleableappserviceplan",
"resourceGroup": "RG-001",
"resourceProviderValue": "MICROSOFT.WEB",
"subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
"activityStatusValue": "Succeeded"
}

Passaggi successivi

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