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
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.
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
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.
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:
{
"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"
}
Nächste Schritte
Weitere Informationen zur Autoskalierung finden Sie in den folgenden Artikeln: