本文介绍自动缩放中的波动现象及如何避免它。
波动是指一种循环条件,会导致一系列相互对立的缩放事件。 当一个缩放事件触发对立缩放事件时,就会发生波动。
自动缩放会评估挂起的横向缩减操作,以确定它是否会导致波动。 在可能发生波动的情况下,自动缩放可以跳过该缩放操作,并在下次运行时重新评估,或者自动缩放也可以按少于指定数量的资源实例进行缩放。 每当自动缩放引擎运行时(每隔 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 时横向缩减
下表显示了这些自动缩放规则的潜在结果:
时间 | 实例计数 | 线程计数 | 每个实例的线程计数 | 缩放事件 | 最终实例计数 |
---|---|---|---|---|---|
T0 | 2 | 1250 | 625 | 横向扩展 | 3 |
T1 | 3 | 1250 | 417 | 横向缩减 | 2 |
- 在时间 T0 处,有两个实例处理 1250 个线程,即每个实例处理 625 个线程。 自动缩放将横向扩展到三个实例。
- 在横向扩展之后,在时间点 T1,我们依然有 1250 个线程数,但由于有三个实例,每个实例只有 417 个线程。 触发横向缩减事件。
- 在进行横向缩减之前,自动缩放会评估在发生横向缩减事件时会出现的情况。 在此示例中,1250/2 = 625,即每个实例处理 625 个线程。 自动缩放在横向缩减后必须立即再次横向扩展。 如果再次横向扩展,该过程将会重复,从而导致循环波动。
- 为避免这种情况,自动缩放不会横向缩减。 自动缩放会跳过当前缩放事件,并在下一个执行周期重新评估规则。
在这种情况下,自动缩放看似未起作用,因为没有发生缩放事件。 检查自动缩放设置页上的“运行历史记录”选项卡,查看是否发生了任何波动。
在阈值之间设置足够的余量可以避免上述情况。 例如,
- 当线程计数 >=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"
}
后续步骤
若要了解有关自动缩放的详细信息,请参阅以下资源: