自动缩放中的波动

本文介绍自动缩放中的波动现象及如何避免它。

波动是指一种循环条件,会导致一系列相互对立的缩放事件。 当一个缩放事件触发对立缩放事件时,就会发生波动。

自动缩放会评估挂起的横向缩减操作,以确定它是否会导致波动。 在可能发生波动的情况下,自动缩放可以跳过该缩放操作,并在下次运行时重新评估,或者自动缩放也可以按少于指定数量的资源实例进行缩放。 每当自动缩放引擎运行时(每隔 30 到 60 秒运行一次,具体取决于资源类型),都会执行自动缩放评估过程。

为确保资源充足,不会针对横向扩展事件检查潜在的波动。 自动缩放只会推迟横向缩减事件以避免波动。

例如,让我们假设规则如下:

  • 当平均 CPU 使用率超过 50% 时,通过增加 1 个实例来横向扩展。
  • 当平均 CPU 使用率低于 30% 时,横向缩减操作会将实例数量减少 1 个实例。

在下表中的 T0 处,当使用率为 56% 时,将触发横向扩展操作,导致 2 个实例的 CPU 使用率为 56%。 这会使规模集的平均值为 28%。 由于 28% 小于横向缩减阈值,自动缩放应重新横向缩减。 横向缩减会将规模集的 CPU 使用率恢复到 56%,这会触发横向扩展操作。

时间 实例计数 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 时,将执行横向缩减。

下表显示了这些自动缩放规则的潜在结果:

时间 实例计数 线程计数 每个实例的线程计数 缩放事件 最终实例计数
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 以下,才会触发缩放事件。 请参阅下表。

时间 实例计数 线程计数 每个实例的线程计数 缩放事件 最终实例计数
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 个实例。

显示自动缩放默认缩放条件的屏幕截图,其中包含为示例配置的规则。

下表显示了这些自动缩放规则的潜在结果:

时间 实例数 中央处理器 (CPU) 请求次数 缩放事件 最终实例数 注释
T0 30 65% 3000,或每个实例 100。 无缩放事件 30
T1 30 65 1500 缩减 3 个实例 二十七 缩减 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"
}

后续步骤

若要了解有关自动缩放的详细信息,请参阅以下资源: