分享方式:


自動調整中的擺盪

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

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

自動調整會評估擱置的縮減動作,以確認是否會造成擺盪。 在可能發生擺盪的情況下,自動調整可能會略過調整動作,並在下一次執行時重新評估該動作,或者,自動調整可能會以低於指定資源執行個體數目的值進行調整。 每當自動調整引擎執行時 (每 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 時縮減

此螢幕擷取畫面顯示在執行緒計數大於或等於 600 時擴增,並且在執行緒計數小於 600 時縮減的自動調整規則。

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

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

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

顯示自動調整執行歷程記錄索引標籤的螢幕擷取畫面,其中有記錄顯示了擺盪。

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

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

此螢幕擷取畫面顯示在執行緒計數大於或等於 600 時擴增,並且在執行緒計數小於 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 為單位進行縮減。

此螢幕擷取畫面顯示為範例設定了規則的自動調整預設調整條件。

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

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 

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

此螢幕擷取畫面顯示來自擺盪事件的記錄檔記錄。

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

下一步

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