Flaxning i autoskalning

I den här artikeln beskrivs växling i autoskalning och hur du undviker det.

Växling refererar till ett loopvillkor som orsakar en serie motsatta skalningshändelser. Växling sker när en skalningshändelse utlöser den motsatta skalningshändelsen.

Autoskalning utvärderar en väntande inskalningsåtgärd för att se om det skulle orsaka växling. I fall där växling kan ske kan autoskalning hoppa över skalningsåtgärden och utvärderas igen vid nästa körning, eller så kan autoskalning skalas med mindre än det angivna antalet resursinstanser. Utvärderingsprocessen för autoskalning sker varje gång autoskalningsmotorn körs, vilket är var 30:e till 60:e sekund, beroende på resurstypen.

För att säkerställa tillräckliga resurser sker ingen kontroll av potentiella växlingar för utskalningshändelser. Autoskalning skjuter bara upp en inskalningshändelse för att undvika växling.

Vi antar till exempel följande regler:

  • Skala ut och öka med 1 instans när den genomsnittliga CPU-användningen är över 50 %.
  • Skala in och minska antalet instanser med 1 instans när den genomsnittliga CPU-användningen är lägre än 30 %.

När användningen är 56 % i tabellen nedan vid T0 utlöses en utskalningsåtgärd och ger 56 % CPU-användning över 2 instanser. Det ger ett genomsnitt på 28 % för skalningsuppsättningen. Eftersom 28 % är mindre än inskalningströskeln bör autoskalning skalas in igen. Om du skalar in returneras skalningsuppsättningen till 56 % CPU-användning, vilket utlöser en utskalningsåtgärd.

Tid Antal instanser CPU% CPU % per instans Skalningshändelse Resulterande antal instanser
T0 1 56% 56% Skala ut 2
T1 2 56% 28% Skala in 1
T2 1 56% 56% Skala ut 2
T3 2 56% 28% Skala in 1

Om det lämnas okontrollerat skulle det finnas en pågående serie skalningshändelser. I den här situationen skjuter dock autoskalningsmotorn upp inskalningshändelsen vid T1 och utvärderar om under nästa autoskalningskörning. Inskalningen sker bara när den genomsnittliga CPU-användningen är lägre än 30 %.

Flaxning orsakas ofta av:

  • Små eller inga marginaler mellan tröskelvärden
  • Skala med fler än en instans
  • Skala in och ut med olika mått

Små eller inga marginaler mellan tröskelvärden

För att undvika växling bör du ha tillräckliga marginaler mellan skalningströsklarna.

Följande regler där det inte finns någon marginal mellan tröskelvärden kan till exempel orsaka växling.

  • Skala ut när trådantal = >600
  • Skala in när antalet trådar är < 600

En skärmbild som visar regler för autoskalning med utskalning när antalet trådar är större än eller lika med 600 och skalas in när trådantalet är mindre än 600.

Tabellen nedan visar ett potentiellt resultat av dessa autoskalningsregler:

Tid Antal instanser Antal trådar Antal trådar per instans Skalningshändelse Resulterande antal instanser
T0 2 1250 625 Skala ut 3
T1 3 1250 417 Skala in 2
  • Vid tidpunkten T0 finns det två instanser som hanterar 1250 trådar eller 625 steg per instans. Autoskalning skalas ut till tre instanser.
  • Efter utskalningen, vid T1, har vi samma 1250 trådar, men med tre instanser är det bara 417 trådar per instans. En inskalningshändelse utlöses.
  • Innan du skalar in utvärderar autoskalning vad som skulle hända om inskalningshändelsen inträffar. I det här exemplet är 1250 / 2 = 625, det vill säga 625 trådar per instans. Autoskalning måste omedelbart skalas ut igen när den har skalats in. Om den skalades ut igen skulle processen upprepas, vilket leder till en växlingsloop.
  • För att undvika den här situationen skalas inte autoskalning in. Autoskalning hoppar över den aktuella skalningshändelsen och utvärderar regeln igen i nästa körningscykel.

I det här fallet verkar autoskalning inte fungera eftersom ingen skalningshändelse äger rum. Kontrollera fliken Körningshistorik på inställningssidan för autoskalning för att se om det finns några växlingar.

En skärmbild som visar fliken körningshistorik för autoskalning med poster som visar växling.

Om du anger en tillräcklig marginal mellan tröskelvärden undviker du ovanstående scenario. Exempel:

  • Skala ut när trådantal = >600
  • Skala in när trådantalet är < 400

En skärmbild som visar regler för automatisk skalning med utskalning när trådantalet är större än eller lika med 600 och skalas in när trådantalet är mindre än 400.

Om antalet inskalningstrådar är 400 måste det totala antalet trådar sjunka till under 1 200 innan en skalningshändelse äger rum. Se tabellen nedan.

Tid Antal instanser Antal trådar Antal trådar per instans Skalningshändelse Resulterande antal instanser
T0 2 1250 625 Skala ut 3
T1 3 1250 417 ingen skalningshändelse 3
T2 3 1180 394 skala in 2
T3 3 1180 590 ingen skalningshändelse 2

Skala med mer än en instans

För att undvika flaxning när du skalar in eller ut med mer än en instans kan autoskalning skalas med mindre än det antal instanser som anges i regeln.

Följande regler kan till exempel orsaka flaxning:

  • Skala ut med 20 när antalet förfrågningar >=200 per instans.
  • ELLER när CPU > 70 % per instans.
  • Skala in med 10 när antalet förfrågningar <=50 per instans.

En skärmbild som visar ett standardskalningsvillkor för automatisk skalning med regler som konfigurerats för exemplet.

Tabellen nedan visar ett potentiellt resultat av dessa regler för autoskalning:

Tid Antal instanser Processor Antal begäranden Skalningshändelse Resulterande instanser Kommentarer
T0 30 65% 3 000 eller 100 per instans. Ingen skalningshändelse 30
T1 30 65 1500 Skala in efter 3 instanser 27 Inskalning med 10 skulle orsaka en uppskattad CPU-ökning över 70 %, vilket leder till en utskalningshändelse.

Vid tidpunkten för T0 körs appen med 30 instanser, ett totalt antal begäranden på 3 000 och en CPU-användning på 65 % per instans.

Vid T1, när antalet begäranden sjunker till 1 500 begäranden eller 50 begäranden per instans, försöker autoskalningen skala in med 10 instanser till 20. Autoskalning beräknar dock att CPU-belastningen för 20 instanser kommer att vara över 70 %, vilket orsakar en utskalningshändelse.

För att undvika flaxning beräknar autoskalningsmotorn cpu-användningen för instansantal över 20 tills den hittar ett instansantal där alla mått finns i de definierade tröskelvärdena:

  • Håll PROCESSORn under 70 %.
  • Behåll att antalet begäranden per instans är över 50.
  • Minska antalet instanser under 30.

I den här situationen kan autoskalning skalas in med 3, från 30 till 27 instanser för att uppfylla reglerna, även om regeln anger en minskning på 10. Ett loggmeddelande skrivs till aktivitetsloggen med en beskrivning som inkluderar nedskalning sker med uppdaterat antal instanser för att undvika flaxning

Om autoskalning inte kan hitta ett lämpligt antal instanser hoppar den över skalan i händelse och utvärderar om under nästa cykel.

Anteckning

Om autoskalningsmotorn upptäcker att flaxning kan uppstå till följd av skalning till målantalet instanser försöker den också skala till ett lägre antal instanser mellan det aktuella antalet och målantalet. Om borttagningen inte sker inom det här intervallet fortsätter autoskalningen skalningsåtgärden med det nya målet.

Loggfiler

Hitta flapping i aktivitetsloggen med följande fråga:

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

Nedan visas ett exempel på en aktivitetsloggpost för flaxning:

En skärmbild som visar en loggpost från en flapping-händelse.

{
"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"
}

Nästa steg

Mer information om autoskalning finns i följande resurser: