Virtual Machine Scale Sets で予測自動スケーリングを使用して負荷が発生する前にスケールアウトする

予測自動スケーリングは、機械学習を使用して、周期的なワークロード パターンに基づく Azure Virtual Machine Scale Sets の管理とスケーリングを促すものです。 過去の CPU 使用率パターンから、仮想マシン スケール セットの全体的な CPU 負荷を予測します。 過去の使用状況を観察して学習することで、全体的な CPU 負荷を予測します。 このプロセスにより、需要を満たすためにスケールアウトが遅れずに実行されるようになります。

予測自動スケーリングでは、予測を提供するために最低 7 日間の履歴が必要になります。 最も正確な結果は、15 日間の履歴データから得られます。

予測自動スケーリングは、ユーザーが仮想マシン スケール セットに対して設定したスケーリング限度に従います。 仮想マシン スケール セットのCPU 使用率負荷がスケールアウトの限界を超えるとシステムによって予測された場合、ユーザーの指定に従って新しいインスタンスが追加されます。 予測されたワークロードの急増が発生するどのくらい前に新しいインスタンスをプロビジョニングするかを構成することもできます (最長 1 時間)。

[予測のみ] を使用すると、予測に基づくスケーリング操作をトリガーすることなく、予測される CPU 負荷を確認できます。 その後、実際のワークロード パターンと予測とを比較し、予測モデルが信頼に足ることを確認したうえで、予測自動スケーリング機能を有効にすることができます。

予測自動スケーリングのオファリング

  • 予測自動スケーリングは、周期的な CPU 使用率パターンを示すワークロード用です。
  • サポートは、仮想マシン スケール セットでのみ使用できます。
  • 集計の種類が "平均" である "CPU 使用率" メトリックのみが、現在サポートされているメトリックです。
  • 予測自動スケーリングでは、スケールアウトのみがサポートされています。 スケールインを管理するように標準の自動スケーリングを構成します。
  • 予測自動スケーリングは、Azure 商用クラウドでのみ使用できます。 Azure Government クラウドは現在サポートされていません。

Azure portal で予測自動スケーリングまたは予測のみを有効にする

  1. [仮想マシン スケール セット] 画面に移動し、[スケーリング] を選択します。

    Azure portal の左側のメニューで [スケーリング] を選択する場面のスクリーンショット。

  2. [カスタム自動スケーリング] セクションに、[Predictive autoscale] (予測自動スケーリング) が表示されます。

    Azure portal で [カスタム自動スケーリング] と [Predictive autoscale] (予測自動スケーリング) オプションを選択する場面のスクリーンショット。

    ドロップダウンの選択により、次の操作を実行できます。

    • 予測自動スケーリングを無効にする。 初めて予測自動スケーリングのページにアクセスしたときは、既定で [無効] が選択されています。
    • 予測のみモードを有効にする。
    • 予測自動スケーリングを有効にする。

    注意

    予測自動スケーリングまたは予測のみモードを有効にするためには、あらかじめ標準の事後対応型の自動スケーリング条件を設定しておく必要があります。

  3. 予測のみモードを有効にするには、ドロップダウンからそれを選択します。 "CPU 使用率" に基づくスケールアウト トリガーを定義します。 その後、 [保存] を選びます。 予測自動スケーリングを有効にする場合も手順は同じです。 予測自動スケーリングまたは予測のみモードを無効にするには、ドロップダウンから [無効] を選択します。

    予測のみモードの有効化を示すスクリーンショット。

  4. 実際に必要となる前にインスタンスをフル稼動状態にするために、必要に応じて事前起動時間を指定します。 必要な予測時刻の 5 分から 60 分前にインスタンスを事前起動できます。

    予測自動スケーリングの事前起動設定を示すスクリーンショット。

  5. 予測自動スケーリングまたは予測のみモードを有効にして保存したら、[予測グラフ] を選択します。

    [予測グラフ] メニュー オプションの選択を示すスクリーンショット。

  6. 次の 3 つのグラフを確認できます。

    予測自動スケーリングの 3 つのグラフを示すスクリーンショット。

    • 一番上のグラフは、合計 CPU 使用率の実績と予測の比較結果を重ねて表示したものです。 表示されるグラフの期間は、過去 7 日から今後 24 時間です。
    • 中央のグラフは、過去 7 日に実行されているインスタンスの最大数を示しています。
    • 一番下のグラフは、過去 7 日のそのときどきの平均 CPU 使用率を示しています。

Azure Resource Manager テンプレートを使用して有効にする

  1. 仮想マシン スケール セットのリソース ID と仮想マシン スケール セットのリソース グループを取得します。 (例: /subscriptions/e954e48d-abcd-abcd-abcd-3e0353cb45ae/resourceGroups/patest2/providers/Microsoft.Compute/virtualMachineScaleSets/patest2)。

  2. 仮想マシン スケール セットのリソース ID と自動スケーリング設定パラメーターで autoscale_only_parameters ファイルを更新します。

  3. PowerShell コマンドを使って、自動スケーリング設定を含むテンプレートをデプロイします。 次に例を示します。

PS G:\works\kusto_onboard\test_arm_template> new-azurermresourcegroupdeployment -name binzAutoScaleDeploy -resourcegroupname cpatest2 -templatefile autoscale_only.json -templateparameterfile autoscale_only_parameters.json

Azure Resource Manager テンプレートを実行して予測自動スケーリングをデプロイしたときの、上記のコマンドからの PowerShell コマンド出力を示すスクリーンショット。

autoscale_only.json

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
	"parameters": {
		"targetVmssResourceId": {
			"type": "string"
		},
		"location": {
			"type": "string"
		},
		"minimumCapacity": {
			"type": "Int",
			"defaultValue": 2,
			"metadata": {
				"description": "The minimum capacity.  Autoscale engine will ensure the instance count is at least this value."
			}
		},
		"maximumCapacity": {
			"type": "Int",
			"defaultValue": 5,
			"metadata": {
				"description": "The maximum capacity.  Autoscale engine will ensure the instance count is not greater than this value."
			}
		},
		"defaultCapacity": {
			"type": "Int",
			"defaultValue": 3,
			"metadata": {
				"description": "The default capacity.  Autoscale engine will preventively set the instance count to be this value if it can not find any metric data."
			}
		},
		"metricThresholdToScaleOut": {
			"type": "Int",
			"defaultValue": 30,
			"metadata": {
				"description": "The metric upper threshold.  If the metric value is above this threshold then autoscale engine will initiate scale out action."
			}
		},
		"metricTimeWindowForScaleOut": {
			"type": "string",
			"defaultValue": "PT5M",
			"metadata": {
				"description": "The metric look up time window."
			}
		},
		"metricThresholdToScaleIn": {
			"type": "Int",
			"defaultValue": 20,
			"metadata": {
				"description": "The metric lower threshold.  If the metric value is below this threshold then autoscale engine will initiate scale in action."
			}
		},
		"metricTimeWindowForScaleIn": {
			"type": "string",
			"defaultValue": "PT5M",
			"metadata": {
				"description": "The metric look up time window."
			}
		},
		"changeCountScaleOut": {
			"type": "Int",
			"defaultValue": 1,
			"metadata": {
				"description": "The instance count to increase when autoscale engine is initiating scale out action."
			}
		},
		"changeCountScaleIn": {
			"type": "Int",
			"defaultValue": 1,
			"metadata": {
				"description": "The instance count to decrease the instance count when autoscale engine is initiating scale in action."
			}
		},
        "predictiveAutoscaleMode": {
            "type": "String",
            "defaultValue": "ForecastOnly",
            "metadata": {
                "description": "The predictive Autoscale mode."
            }
        }
	},
	"variables": {
	},
	"resources": [{
			"type": "Microsoft.Insights/autoscalesettings",
			"name": "cpuPredictiveAutoscale",
			"apiVersion": "2022-10-01",
			"location": "[parameters('location')]",
			"properties": {
				"profiles": [{
						"name": "DefaultAutoscaleProfile",
						"capacity": {
							"minimum": "[parameters('minimumCapacity')]",
							"maximum": "[parameters('maximumCapacity')]",
							"default": "[parameters('defaultCapacity')]"
						},
						"rules": [{
								"metricTrigger": {
									"metricName": "Percentage CPU",
									"metricNamespace": "",
									"metricResourceUri": "[parameters('targetVmssResourceId')]",
									"timeGrain": "PT1M",
									"statistic": "Average",
									"timeWindow": "[parameters('metricTimeWindowForScaleOut')]",
									"timeAggregation": "Average",
									"operator": "GreaterThan",
									"threshold": "[parameters('metricThresholdToScaleOut')]"
								},
								"scaleAction": {
									"direction": "Increase",
									"type": "ChangeCount",
									"value": "[parameters('changeCountScaleOut')]",
									"cooldown": "PT5M"
								}
							}, {
								"metricTrigger": {
									"metricName": "Percentage CPU",
									"metricNamespace": "",
									"metricResourceUri": "[parameters('targetVmssResourceId')]",
									"timeGrain": "PT1M",
									"statistic": "Average",
									"timeWindow": "[parameters('metricTimeWindowForScaleIn')]",
									"timeAggregation": "Average",
									"operator": "LessThan",
									"threshold": "[parameters('metricThresholdToScaleIn')]"
								},
								"scaleAction": {
									"direction": "Decrease",
									"type": "ChangeCount",
									"value": "[parameters('changeCountScaleOut')]",
									"cooldown": "PT5M"
								}
							}
						]
					}
				],
				"enabled": true,
				"targetResourceUri": "[parameters('targetVmssResourceId')]",
                "predictiveAutoscalePolicy": {
                    "scaleMode": "[parameters('predictiveAutoscaleMode')]"
                }
			}
		}
	],
	"outputs": {
        "targetVmssResourceId" : {
            "type" : "string",
            "value" : "[parameters('targetVmssResourceId')]"
        },
        "settingLocation" : {
            "type" : "string",
            "value" : "[parameters('location')]"
        },
        "predictiveAutoscaleMode" : {
            "type" : "string",
            "value" : "[parameters('predictiveAutoscaleMode')]"
        }
    }
}

autoscale_only_parameters.json

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
	"parameters": {
		"targetVmssResourceId": {
			"value": "/subscriptions/e954e48d-b252-b252-b252-3e0353cb45ae/resourceGroups/patest2/providers/Microsoft.Compute/virtualMachineScaleSets/patest2"
		},
		"location": {
			"value": "East US"
		},
		"minimumCapacity": {
			"value": 1
		},
		"maximumCapacity": {
			"value": 4
		},
		"defaultCapacity": {
		  "value": 4
		},
		"metricThresholdToScaleOut": {
		  "value": 50
		},
		"metricTimeWindowForScaleOut": {
		  "value": "PT5M"
		},
		"metricThresholdToScaleIn": {
		  "value": 30
		},
		"metricTimeWindowForScaleIn": {
		  "value": "PT5M"
		},
		"changeCountScaleOut": {
		  "value": 1
		},
		"changeCountScaleIn": {
		  "value": 1
		},
		"predictiveAutoscaleMode": {
		  "value": "Enabled"
		}
	}
}

Azure Resource Manager テンプレートの詳細については、Resource Manager テンプレートの概要に関する記事を参照してください。

よく寄せられる質問

このセクションでは、よく寄せられる質問にご回答します。

予測グラフの CPU 使用率が 100% を超えるのはなぜですか?

予測グラフには、スケール セット内のすべてのマシンの累積負荷が表示されます。 スケール セットに 5 つの VM がある場合、すべての VM の最大累積負荷は 500% になります。つまり、各 VM の最大 CPU 負荷の 100% の 5 倍になります。

仮想マシン スケール セットの予測自動スケーリングを有効にすると、やがて何が起こりますか?

予測自動スケーリングでは、実行中の仮想マシン スケール セットの履歴が使用されます。 スケール セットの実行期間が 7 日間に満たない場合、モデルをトレーニング中であるというメッセージが表示されます。 詳細については、予測データがないメッセージに関する記事を参照してください。 予測は時間と共に改善され、仮想マシン スケール セットが作成されてから 15 日後に最大精度に達します。

ワークロード パターンに (周期性を保ちつつも) 変化が生じた場合、モデルはその変化を認識し、予測の調整を開始します。 時が経つにつれて予測精度は向上します。 精度は、トラフィック パターンに変化が生じてから 15 日後に最大に達します。 標準の自動スケーリング ルールは依然として適用されることに注意してください。 予測されていない新たなトラフィック増加が発生した場合、その需要を満たすために仮想マシン スケール セットがスケールアウトされます。

モデルがうまく機能していないと思われるときはどうすればいいですか?

モデルリングは、周期性を示すワークロードで最適に機能します。 まず、"予測のみ" を有効にして予測を評価することをお勧めします。スケール セットの予測 CPU 使用率が実績値 (観察された使用率) にオーバーレイされます。 その結果を比較して評価した後、モデルの予測が実際のシナリオに十分近ければ、予測メトリックに基づいてスケーリングを有効にすることを選択してください。

予測自動スケーリングを有効にする前に標準の自動スケーリングを有効にする必要があるのはなぜですか?

標準の自動スケーリングは、お客様のシナリオで予測モデルがうまく機能しない場合に必要なフォールバックです。 通常の CPU 負荷パターンを逸脱した予期しない負荷の急増には、標準の自動スケーリングが対応します。 また、予測データの取得中にエラーが発生した場合にもフォールバックを提供します。

予測と標準の自動スケーリング ルールの両方が設定されている場合、どのルールが有効になりますか?

標準の自動スケール ルールは、CPU 負荷に予期しないスパイクが発生した場合、または予測データの取得時にエラーが発生した場合に使用されます

標準の自動スケール ルールで設定されたしきい値を使用して、スケールアウトするタイミングとインスタンスの数を把握します。 CPU 使用率が 70% を超えたときに VM スケール セットをスケールアウトし、実際のデータまたは予測データで CPU 使用率が 70% を超えているか、70% を超えそうな場合に、スケールアウトが発生します。

エラーと警告

このセクションでは、一般的なエラーと警告について説明します。

標準の自動スケーリングが有効にならない

次のエラー メッセージが表示されます。

予測自動スケーリングを有効にするには、"CPU 使用率" メトリックに基づいてスケールアウト ルールを作成します。 ここをクリックして [構成] タブに移動し、自動スケーリングルールを設定します。

予測自動スケーリングが現在のリソースのメトリック CPU 使用率に基づいているというエラー メッセージを示すスクリーンショット。

このメッセージは、標準の自動スケーリングを有効にして、集計の種類が [平均] である [CPU 使用率] メトリックを使用するよう設定する前に予測自動スケーリングを有効にしようとしたことを意味します。

予測データがない

特定の条件下では、予測グラフにデータが表示されません。 この動作はエラーではなく、意図的な動作です。

予測自動スケーリングが無効になっている場合は、代わりに、"表示するデータはありません..." で始まるメッセージが表示されます。その後、予測グラフを表示するために有効にすべき設定についての指示が表示されます。

表示するデータはありませんというメッセージを示すスクリーンショット。

最初に仮想マシン スケール セットを作成し、予測のみモードを有効にした場合は、"予測データをトレーニングしています..." というメッセージと、グラフが表示されるまでの待ち時間が表示されます。

予測データをトレーニングしていますというメッセージを示すスクリーンショット。

次のステップ

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