Fluktuation bei der Autoskalierung

In diesem Artikel wird die Fluktuation bei der Autoskalierung und deren Vermeidung beschrieben.

Fluktuation bezieht sich auf eine Schleifenbedingung, die eine Reihe von entgegengesetzten Skalierungsereignissen verursacht. Fluktuation erfolgt, wenn ein Skalierungsereignis das gegenteilige Skalierungsereignis auslöst.

Die Autoskalierung wertet eine ausstehende Abskalierungsaktion aus, um festzustellen, ob sie zu Fluktuation führen würde. In Fällen, in denen Fluktuation auftreten könnte, kann die Autoskalierung die Skalierungsaktion überspringen und bei der nächsten Ausführung eine erneute Auswertung vornehmen, oder die automatische Skalierung erfolgt um weniger als die angegebene Anzahl von Ressourceninstanzen. Der Auswertungsprozess für automatische Skalierung erfolgt jedes Mal, wenn die Autoskalierungs-Engine ausgeführt wird.Dies geschieht je nach Ressourcentyp alle 30 bis 60 Sekunden.

Um angemessene Ressourcen zu gewährleisten, tritt die Überprüfung auf potenzielle Fluktuation für horizontale Skalierungsereignisse nicht auf. Die Autoskalierung verzögert nur ein Abskalierungsereignis, um Fkuktuation zu vermeiden.

Nehmen Sie beispielsweise die folgenden Regeln an:

  • Horizontale Skalierung um 1 Instanz, wenn die durchschnittliche CPU-Auslastung über 50 % liegt.
  • Abskalierung der Anzahl der Instanzen um 1 Instanz, wenn die durchschnittliche CPU-Auslastung niedriger als 30 % ist.

In der nachstehenden Tabelle bei T0 wird bei einer Auslastung von 56 % eine horizontale Skalierungsaktion ausgelöst und führt zu 56 % CPU-Auslastung über 2 Instanzen hinweg. Das ergibt einen Durchschnitt von 28 % für die Skalierungsgruppe. Da 28 % kleiner als der Schwellenwert für Abskalierung ist, sollte die Autoskalierung eine erneute Skalierung vornehmen. Abskalierung würde die CPU-Auslastung der Skalierungsgruppe auf 56 % CPU-Auslastung zurücksetzen, wodurch eine horizontale Skalierungsaktion ausgelöst wird.

Zeit Anzahl von Instanzen CPU% CPU% pro Instanz Skalierungsereignis Sich ergebende Instanzanzahl
T0 1 56 % 56 % Aufskalieren 2
T1 2 56 % 28 % Horizontales Herunterskalieren 1
T2 1 56 % 56 % Aufskalieren 2
T3 2 56 % 28 % Horizontales Herunterskalieren 1

Wenn keine Steuerung erfolgt, tritt eine fortlaufende Reihe von Skalierungsereignissen auf. In dieser Situation stellt die Autoskalierungs-Engine das Skalierungsereignis jedoch bei T1 zurück und nimmt während der nächsten Autoskalierungsausführung eine erneute Bewertung vor. Die horizontale Herunterskalierung erfolgt nur, wenn die durchschnittliche CPU-Auslastung unter 30 % liegt.

Häufige Ursachen für Fluktuation sind:

  • Geringe oder keine Spannen zwischen den Schwellenwerten
  • Skalierung um mehr als eine Instanz
  • Abskalieren und horizontales Herunterskalieren mit unterschiedlichen Metriken

Geringe oder keine Spannen zwischen den Schwellenwerten

Um Fluktuation zu vermeiden, halten Sie zwischen Skalierungsschwellenwerten angemessene Spannen bei.

Beispielsweise führen die folgenden Regeln, in denen keine Spanne zwischen Schwellenwerten vorhanden ist, zu Fluktuation.

  • Aufskalieren, wenn die Threadanzahl >= 600 ist
  • Abskalieren, wenn die Threadanzahl < 600 ist

Screenshot: Regeln für Autoskalierung mit Aufskalierung, wenn die Threadanzahl größer oder gleich 600 ist, und Abskalierung, wenn die Threadanzahl kleiner als 600 ist.

Die folgende Tabelle zeigt ein mögliches Ergebnis dieser Autoskalierungsregeln:

Zeit Anzahl von Instanzen Threadanzahl Threadanzahl pro Instanz Skalierungsereignis Sich ergebende Instanzanzahl
T0 2 1250 625 Aufskalieren 3
T1 3 1250 417 Horizontales Herunterskalieren 2
  • Zum Zeitpunkt T0 gibt es zwei Instanzen, die 1.250 Threads verarbeiten, oder 625 Treads pro Instanz. Die Autoskalierung führt eine Aufskalierung auf drei Instanzen aus.
  • Nach der horizontalen Skalierung liegen bei T1 dieselben 1.250 Threads vor, aber mit drei Instanzen: nur 417 Threads pro Instanz. Ein Abskalierungsereignis wird ausgelöst.
  • Vor der Abskalierung bewertet die Autoskalierung, was passieren würde, wenn das Abskalierungsereignis auftritt. In diesem Beispiel 1.250 / 2 = 625, also 625 Threads pro Instanz. Die Autoskalierung müsste sofort nach der Abskalierung eine Aufskalierung vornehmen. Wenn erneut aufskaliert wird, würde sich der gesamte Prozess wiederholen, was zu einer Fluktuationsschleife führen würde.
  • Um diese Situation zu vermeiden, führt die Autoskalierung keine Abskalierung durch. Die Autoskalierung überspringt das aktuelle Skalierungsereignis und wertet die Regel im nächsten Ausführungszyklus erneut aus.

In diesem Fall scheint die Autoskala nicht zu funktionieren, weil kein Skalierungsereignis stattfindet. Überprüfen Sie die Registerkarte Ausführungsverlauf auf der Seite „Autoskalierungseinstellung“, um zu überprüfen, ob Fluktuation auftritt.

Screenshot: Registerkarte mit dem Ausführungsverlauf der Autoskalierung mit Einträgen, die Fluktuation zeigen.

Das Festlegen einer angemessenen Spanne zwischen Schwellenwerten verhindert das oben beschriebene Szenario. Beispiel:

  • Aufskalieren, wenn die Threadanzahl >= 600 ist
  • Abskalieren, wenn die Threadanzahl < 400 ist

Screenshot: Regeln für Autoskalierung mit Aufskalierung, wenn die Threadanzahl größer oder gleich 600 ist, und Abskalierung, wenn die Threadanzahl kleiner als 400 ist.

Wenn die Abskalierungsthreadanzahl 400 beträgt, muss die Gesamtthreadanzahl auf unter 1.200 fallen, bevor ein Skalierungsereignis stattfindet. Siehe Tabelle unten.

Zeit Anzahl von Instanzen Threadanzahl Threadanzahl pro Instanz Skalierungsereignis Sich ergebende Instanzanzahl
T0 2 1250 625 Aufskalieren 3
T1 3 1250 417 Kein Skalierungsereignis 3
T2 3 1180 394 Abskalierung 2
T3 3 1180 590 Kein Skalierungsereignis 2

Skalierung um mehr als eine Instanz

Um beim Auf- oder Abskalieren um mehr als eine Instanz Fluktuation zu vermeiden, kann die Autoskalierung eine Skalierung um weniger als die Anzahl der in der Regel angegebenen Instanzen ausführen.

Beispielsweise können die folgenden Regeln Fluktuation verursachen:

  • Aufskalieren um 20, wenn die Anforderungsanzahl >= 200 pro Instanz ist.
  • ODER wenn CPU > 70 % pro Instanz.
  • Abskalieren um 10, wenn die Anforderungsanzahl <= 50 pro Instanz ist.

Screenshot: Standardskalierungsbedingung der Autoskalierung mit für das Beispiel konfigurierten Regeln.

Die folgende Tabelle zeigt ein mögliches Ergebnis dieser Autoskalierungsregeln:

Zeit Anzahl von Instanzen CPU Anforderungsanzahl Skalierungsereignis Sich ergebende Instanzen Kommentare
T0 30 65% 3.000 oder 100 pro Instanz Kein Skalierungsereignis 30
T1 30 65 1500 Abskalieren um 3 Instanzen 27 Die Abskalierung um 10 würde zu einem geschätzten CPU-Anstieg über 70 % führen, was zu einem horizontalen Skalierungsereignis führt.

Zum Zeitpunkt T0 wird die App mit 30 Instanzen ausgeführt und weist eine Gesamtanforderungsanzahl von 3.000 und eine CPU-Auslastung von 65 % pro Instanz auf.

Wenn die Anforderungsanzahl bei T1 auf 1.500 Anforderungen oder 50 Anforderungen pro Instanz fällt, versucht die Autoskalierung, Abskalierung um 10 Instanzen auf 20 auszuführen. Die Autoskalierung schätzt jedoch, dass die CPU-Auslastung für 20 Instanzen über 70 % liegen würde, was zu einem horizontalen Skalierungsereignis führt.

Um Fluktuation zu vermeiden, schätzt die Autoskalierungs-Engine die CPU-Auslastung für Instanzanzahlen über 20, bis eine Instanzanzahl gefunden wird, bei der sich alle Metriken innerhalb der definierten Schwellenwerte befinden:

  • Halten Sie die CPU-Auslastung unter 70 %.
  • Halten Sie die Anzahl der Anforderungen pro Instanz bei über 50.
  • Verringern Sie die Anzahl der Instanzen auf unter 30.

In dieser Situation kann die Autoskalierung eine Abskalierung um 3 Instanzen (von 30 auf 27) ausführen, um die Regeln zu erfüllen, auch wenn die Regel eine Abnahme von 10 angibt. Eine Protokollnachricht wird in das Aktivitätsprotokoll mit einer Beschreibung geschrieben, die Folgendes besagt: Abskalierung erfolgt mit aktualisierter Instanzanzahl, um Fluktuation zu vermeiden.

Wenn die Autoskalierung keine geeignete Anzahl von Instanzen finden kann, wird das Abskalierungsereignis übersprungen, und während des nächsten Zyklus erfolgt eine erneute Auswertung.

Hinweis

Wenn die Autoskalierung erkennt, dass als Folge der Skalierung auf die Zielanzahl von Instanzen Fluktuation auftreten könnte, wird zudem versucht, eine Skalierung auf eine geringere Anzahl von Instanzen durchzuführen, die zwischen der aktuellen Anzahl und der Zielanzahl liegt. Wenn innerhalb dieses Bereichs keine Fluktuation auftritt, setzt die automatische Skalierung den Vorgang mit dem neuen Ziel fort.

Protokolldateien

Suchen Sie im Aktivitätsprotokoll mit der folgenden Abfrage nach Fluktuationen:

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

Nachfolgend finden Sie ein Beispiel für einen Aktivitätsprotokolleintrag zu Fluktuationen:

Screenshot: Protokolleintrag zu einem Fluktuationsereignis.

{
"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ächste Schritte

Weitere Informationen zur Autoskalierung finden Sie in den folgenden Artikeln: