自動スケーリングでのフラッピング

この記事では、自動スケーリングでのフラッピングとその回避方法について説明します。

フラッピングとは、対立するスケール イベントが連続して発生するループ条件を指します。 フラッピングは、スケール イベントが反対のスケール イベントをトリガーしたときに発生します。

自動スケーリングでは、保留中のスケールイン アクションを評価して、フラッピングが発生するかどうかを確認します。 フラッピングが発生する可能性がある場合は、自動スケーリングによってスケール アクションがスキップされ、次回の実行時に再評価されたり、自動スケーリングでスケーリングするリソース インスタンス数が指定された数よりも少なくなる場合があります。 自動スケーリングの評価プロセスは、自動スケーリング エンジンが実行されるたび (リソースの種類に応じて 30 秒から 60 秒ごと) に発生します。

十分なリソースを確保するために、スケールアウト イベントでは潜在的なフラッピングのチェックは行われません。 自動スケーリングでは、フラッピングを回避するためにスケールイン イベントのみが延期されます。

たとえば、次のルールを想定してみます。

  • 平均 CPU 使用率が 50% を超えた場合、インスタンス数が 1 増加するスケールアウトを行う。
  • 平均 CPU 使用率が 30% 未満の場合、インスタンス数が 1 減少するスケールインを行う。

次の表では、T0 で使用量が 56% になったときに、スケールアウト アクションがトリガーされ、2 つのインスタンスでの CPU 使用率が 56% になります。 これにより、スケール セットの平均は 28% になります。 28% はスケールインしきい値より小さいため、自動スケーリングはスケール インする必要があります。 スケールインすると、スケール セットの CPU 使用率が 56% に戻り、スケールアウト アクションがトリガーされます。

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 インスタンス数 Thread count インスタンスあたりのスレッド数 スケール イベント 結果のインスタンス数
T0 2 1250 625 スケール アウト 3
T1 3 1250 417 スケールイン 2
  • T0 時に、2 つのインスタンスで 1,250 スレッド、つまりインスタンスあたり 625 スレッドを処理しています。 自動スケーリングにより 3 つのインスタンスにスケールアウトされます。
  • スケールアウト後、T1 では同じ 1,250 スレッドですが、インスタンス数は 3 であり、インスタンスあたり 417 スレッドしかありません。 スケールイン イベントがトリガーされます。
  • スケールインの前に、自動スケーリングでは、スケールイン イベントが発生した場合の結果が評価されます。 この例では、1250 / 2 = 625、つまりインスタンスあたり 625 スレッドです。 自動スケーリングは、スケールイン後にすぐに再びスケールアウトする必要があります。 もう一度スケールアウトした場合、プロセスが繰り返されてフラッピング ループが発生します。
  • この状況を避けるために、自動スケーリングでスケールインは行われません。 自動スケーリングでは、現在のスケール イベントがスキップされ、次の実行サイクルでルールが再評価されます。

この場合、スケール イベントが発生しないため、自動スケーリングが機能していないように見えます。 [自動スケーリング設定] ページの [実行履歴] タブで、フラッピングがあるかどうかを確認します。

フラッピングを示すレコードが表示された自動スケーリングの [実行履歴] タブを示すスクリーンショット。

しきい値間に十分なマージンを設定すると、上記のシナリオを回避できます。 たとえば、次のように入力します。

  • スレッド数 >= 600 の場合、スケールアウトする
  • スレッド数 < 400 の場合、スケールインする

スレッド数が 600 以上の場合にスケールアウトし、スレッド数が 400 未満の場合にスケールインする自動スケーリング ルールを示すスクリーンショット。

スケールイン スレッド数が 400 の場合、スケール イベントが発生するには、スレッド数の合計が 1,200 を下回る必要があります。 次の表を参照してください。

Time インスタンス数 Thread count インスタンスあたりのスレッド数 スケール イベント 結果のインスタンス数
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% 3,000 (インスタンスあたり 100) スケール イベントなし 30
T1 30 65 1500 3 インスタンスのスケールイン 27 10 インスタンスのスケールインを行うと、推定 CPU が 70% を超えて上昇し、スケールアウト イベントが発生します。

T0 時に、アプリはインスタンス数 30、合計要求数 3,000、インスタンスあたりの CPU 使用率 65% で実行されています。

T1 で、要求数が 1,500 要求 (インスタンスあたり 50 要求) に減少すると、自動スケーリングは 10 インスタンスのスケールインを行い、20 インスタンスにしようと試みます。 しかし、20 インスタンスの場合 CPU 負荷が 70% を超えるため、自動スケーリングはスケールアウト イベントの発生を推定します。

フラッピングを回避するために、自動スケーリング エンジンは、すべてのメトリックが定義されたしきい値内になるインスタンス数が見つかるまで、インスタンス数が 20 以上の CPU 使用率を推定します。

  • CPU を 70% 未満にする。
  • インスタンスあたりの要求数が 50 を超えないようにする。
  • インスタンス数を 30 未満に減らす。

このような状況では、ルールで 減少数を 10 に指定している場合でも、自動スケーリングはルールを満たすために、30 から 27 インスタンスに、3 スケールインする場合があります。 "フラッピングを回避するために更新されたインスタンス カウントでスケール ダウンが発生する" という説明を含むログ メッセージがアクティビティ ログに書き込まれます。

自動スケーリングで適切な数のインスタンスが見つからない場合、スケールイン イベントはスキップされ、次のサイクルで再評価されます。

Note

自動スケーリング エンジンは、インスタンスのターゲット数にスケーリングした結果として、フラッピングが発生する可能性があることを検出した場合、現在のインスタンス数とターゲット数との間でより少ないインスタンス数にスケーリングしようともします。 この範囲内でフラッピングが発生しなかった場合、新しいターゲットで自動スケーリングによるスケール操作が続行されます。

ログ ファイル

次のクエリを使用して、アクティビティ ログでフラッピングを見つけます。

// 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": "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"
}

次の手順

自動スケーリングの詳細については、次のリソースを参照してください。