自動調整中的擺盪

本文說明自動調整中的擺盪,和如何加以避免。

擺盪是指造成一系列反向調整事件的迴圈條件。 當某個調整事件觸發了反向調整事件時,就會發生擺盪。

自動調整會評估擱置的縮減動作,以確認是否會造成擺盪。 在可能發生擺盪的情況下,自動調整可能會略過調整動作,並在下一次執行時重新評估該動作,或者,自動調整可能會以低於指定資源執行個體數目的值進行調整。 每當自動調整引擎執行時 (每 30 到 60 秒執行一次,視資源類型而定),就會執行自動調整評估程序。

若要確保有足夠的資源,將不會對擴增事件檢查是否有潛在的擺盪。 自動調整只會延遲縮減事件以避免擺盪。

例如,我們假設有下列規則:

  • 在平均 CPU 使用率高於 50% 時,以 1 個執行個體為遞增量進行擴增。
  • 在平均 CPU 使用率低於 30% 時,以 1 個執行個體遞減執行個體計數,進行縮減。

在下表的 T0 上,當使用率為 56% 時,就會觸發擴增動作,並致使 2 個執行個體的 CPU 使用率皆為 56%。 據此,擴展集的平均值為 28%。 由於 28% 小於縮減閾值,自動調整應重新縮減。 縮減會使擴展集回復為 56% 的 CPU 使用率,因而觸發擴增動作。

Time 執行個體計數 CPU% 每個執行個體的 CPU% 調整事件 最終執行個體計數
T0 1 56% 56% 橫向擴增 2
T1 2 56% 28% 縮減 1
T2 1 56% 56% 橫向擴增 2
T3 2 56% 28% 縮減 1

如果保持為未受控制,後續就會有一系列的調整事件。 不過,在此情況下,自動調整引擎會將縮減事件延遲到 T1,並在下一次自動調整執行期間重新評估。 只有在平均 CPU 使用率低於 30% 後,才會進行縮減。

發生擺盪的常見原因如下:

  • 閾值之間的緩衝值太小或沒有緩衝值
  • 調整幅度為多個執行個體
  • 使用不同的計量進行縮減和擴增

閾值之間的緩衝值太小或沒有緩衝值

若要避免擺盪,請在調整閾值之間保有適當的緩衝值。

例如,在下列規則中,閾值之間沒有緩衝值,因而造成擺盪。

  • 在執行緒計數 >=600 時擴增
  • 在執行緒計數 < 600 時縮減

A screenshot showing autoscale rules with scale out when thread count is greater than or equal to 600 and scale in when thread count less than 600.

下表顯示這些自動調整規則的潛在結果:

Time 執行個體計數 執行緒計數 每個執行個體的執行緒計數 調整事件 最終執行個體計數
T0 2 1250 625 橫向擴增 3
T1 3 1250 417 縮減 2
  • 在 T0 時間點,有兩個執行個體處理了 1250 個執行緒,或每個執行個體有 625 個執行緒。 自動調整會擴增至三個執行個體。
  • 擴增之後,在 T1 上,我們同樣有 1250 個執行緒,但有三個執行個體,因此每個執行個體只有 417 個執行緒。 此時會觸發縮減事件。
  • 在縮減之前,自動調整會評估縮減事件發生時將有何狀況。 在此範例中,1250 / 2 = 625,也就是說,每個執行個體有 625 個執行緒。 自動調整在縮減之後,必須立即再次擴增。 如果再次擴增,程序將會重複執行,進而產生擺盪迴圈。
  • 為了避免發生這種情況,自動調整不會縮減。 自動調整會略過目前的調整事件,並在下一個執行週期內重新評估規則。

在此情況下,自動調整似乎無法運作,因為沒有任何調整事件發生。 檢查 [自動調整設定] 頁面上的 [執行歷程記錄] 索引標籤,以確認是否有任何擺盪。

A screenshot showing the autoscale run history tab with records showing flapping.

在閾值之間設定適當的緩衝值,可避免發生上述狀況。 例如,

  • 在執行緒計數 >=600 時擴增
  • 在執行緒計數 < 400 時縮減

A screenshot showing autoscale rules with scale out when thread count greater than or equal to 600 and scale in when thread count less than 400.

如果縮減執行緒計數為 400,則執行緒總數必須降到 1200 以下,才會發生調整事件。 請參閱下表。

Time 執行個體計數 執行緒計數 每個執行個體的執行緒計數 調整事件 最終執行個體計數
T0 2 1250 625 橫向擴增 3
T1 3 1250 417 無調整事件 3
T2 3 1180 394 縮減 2
T3 3 1180 590 無調整事件 2

調整幅度為多個執行個體

為了在以多個執行個體縮減或擴增時發生擺盪,自動調整可能會以低於規則中指定值的執行個體數目進行調整。

例如,下列規則可能會造成擺盪:

  • 在每個執行個體的要求計數 >=200 時,以 20 為單位進行擴增。
  • 或者,在每個執行個體的 CPU > 70% 時擴增。
  • 在每個執行個體的要求計數 <=50 時,以 10 為單位進行縮減。

A screenshot showing an autoscale default scale condition with rules configured for the example.

下表顯示這些自動調整規則的潛在結果:

Time 執行個體數目 CPU 要求計數 調整事件 最終的執行個體 註解
T0 30 65% 3000 個,或每個執行個體 100 個。 無調整事件 30
T1 30 65 1500 以 3 個執行個體進行縮減 27 以 10 為單位縮減會導致預估的 CPU 上升至 70% 以上,而導致擴增事件。

在 T0 時,應用程式以 30 個執行個體執行,要求總數為 3000,每個執行個體的 CPU 使用率為 65%。

在 T1,當要求計數下降到 1500 個要求,或每個執行個體 50 個要求時,自動調整將會嘗試以 10 個執行個體為單位縮減至 20 個。 不過,自動調整估計 20 個執行個體的 CPU 負載會高於 70%,因而導致擴增事件。

為避免發生擺盪,自動調整引擎會估計執行個體計數超過 20 時的 CPU 使用率,直到確認所有計量都在已定義閾值內的執行個體計數:

  • 將 CPU 保持在 70% 以下。
  • 將每個執行個體的要求數目保持在 50 以上。
  • 將執行個體數目縮減到 30 以下。

在此情況下,自動調整可能會縮減 3 個執行個體 (從 30 到 27 個) 以符合規則,即使規則指定的遞減值為 10 亦然。 記錄訊息會寫入活動記錄中,且有描述包含將以更新的執行個體計數進行縮小以避免發生擺盪

自動調整若找不到適當的執行個體數目,則會略過縮減事件,並在下一個週期內重新評估。

注意

自動調整引擎若偵測到因為縮減至目標執行個體數而可能發生擺盪,將會嘗試調整到介於目前計數與目標計數之間的較低執行個體數目。 如果在此範圍內未發生搖擺不定的情況,則自動調整將會繼續新目標的縮放操作。

記錄檔

使用下列查詢在活動記錄中尋找擺盪:

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

以下範例顯示擺盪的活動記錄檔記錄:

A screenshot showing a log record from a flapping event.

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

下一步

若要深入了解自動調整規模,請參閱下列資源: