Function Computeのインスタンスには、オンデマンドモードとプロビジョニングモードの2つの使用モードがあります。 どちらのモードでも、インスタンス数とそのスケーリング速度に関連する制限に基づいて、自動スケーリングルールを設定できます。 プロビジョニングされたインスタンスでは、スケジュールされたスケーリングとしきい値ベースのスケーリングルールを設定できます。
インスタンススケーリングの動作
Function Computeは既存のインスタンスを優先的に使用してリクエストを処理します。 既存のインスタンスがフルキャパシティになると、Function Computeはリクエストを処理するために新しいインスタンスを作成します。 リクエストの数が増えると、Function Computeは、着信リクエストを処理するのに十分なインスタンスが作成されるか、インスタンスの数が上限に達するまで、新しいインスタンスを作成し続けます。 インスタンスのスケーリング速度は、許可されるバースト可能なインスタンスの最大数とインスタンスの最大成長率の両方によって制限されます。 異なるリージョンの制限の詳細については、「異なるリージョンのインスタンスのスケーリング速度の制限」をご参照ください。
このセクションでは、オンデマンドおよびプロビジョニングされたインスタンスのスケーリング動作について説明します。 関数のプロビジョニングされたインスタンスを設定すると、関数の呼び出し前に特定の数のインスタンスを予約できるため、コールドスタートを軽減できます。
オンデマンドインスタンスのスケーリング
インスタンス数またはスケーリング速度が制限を超えた場合、Function ComputeはHTTP 429のステータスコードを返し、スロットリングエラーが発生したことを示します。 次の図は、呼び出しが急増したときにFunction Computeがスロットリングを適用する方法を示しています。
①: Function Computeは、リクエストの急増に対応するインスタンスを即座に作成します。 このプロセス中にコールドスタートが発生します。 バースト可能インスタンスの数が上限に達していないため、スロットリングエラーは報告されません。
②: インスタンス数の増加は、バースト可能なインスタンスの上限に達したため、インスタンスの増加率によって制限されるようになりました。 一部のリクエストでは、スロットルエラーが報告されます。
③: インスタンス数が上限に達したため、一部のリクエストでスロットリングエラーが発生しました。
プロビジョニング済みインスタンスのスケーリング
突然の呼び出しの数が多すぎると、スロットリングエラーが避けられなくなります。 さらに、新しいインスタンスの作成によりコールドスタートが発生します。 どちらもリクエスト処理のレイテンシを増加させます。 遅延を軽減するために、事前にFunction Computeでインスタンスを予約できます。 これらのリザーブドインスタンスは、プロビジョニング済みインスタンスと呼ばれます。
次の図は、プロビジョニングされたインスタンスが設定され、オンデマンドモードの場合と同様に呼び出しが急増した場合に、Function Computeがどのようにスロットリングを適用するかを示しています。
①: すべての受信リクエストは、プロビジョニングされたインスタンスが全容量に達するまですぐに処理されます。 このプロセス中、コールドスタートは発生せず、スロットリングエラーは報告されません。
②: プロビジョニングされたインスタンスが完全に活用されました。 Function Computeは、バースト可能なインスタンスの数が上限に達するまで、後続のリクエストを処理するオンデマンドインスタンスの作成を開始します。 このプロセス中、コールドスタートが発生しますが、スロットリングエラーは報告されません。
異なるリージョンのインスタンスのスケーリング速度の制限
リージョン | バースト可能インスタンスの最大数 | 最大インスタンス成長率 |
中国 (杭州) 、中国 (上海) 、中国 (北京) 、中国 (張家口) 、中国 (深セン) | 300 | 1分あたりの300 |
他のリージョン | 100 | 100/ 分 |
同じリージョンでは、スケーリング速度制限はプロビジョニングインスタンスとオンデマンドインスタンスを区別しません。
GPU高速化インスタンスは、CPUインスタンスと比較してスケーリング速度が遅くなります。 そのため、事前にプロビジョニングモードを使用してGPU高速化インスタンスを予約することを推奨します。
より高速なスケーリングが必要な場合は、DingTalkグループ (グループID: 64970014484) に参加してテクニカルサポートを行います。
プロビジョニング済みインスタンスの自動スケーリング
プロビジョニングされたインスタンスの固定数の設定に加えて、スケジュールおよびしきい値ベースのスケーリングポリシーを設定することで、柔軟な調整を行うことができます。 これにより、インスタンスの使用率が向上します。
プロビジョニング済みインスタンスにスケジュールまたはしきい値ベースのスケーリングポリシーが設定されていない場合、プロビジョニング済みインスタンスの数は常にdefaultTargetパラメーターの値になります。
複数のスケジュールされたスケーリングポリシーが設定されている場合、任意の時点でプロビジョニングされたインスタンスの数は、アクティブポリシーで指定されたターゲットインスタンス数によって決まります。
スケジュールされたスケーリングポリシーとしきい値ベースのスケーリングポリシーの両方が設定されている場合、任意の時点でプロビジョニングされたインスタンスの数は、アクティブなポリシーの中で最も高いターゲットインスタンス数によって決まります。
詳細については、「例」をご参照ください。
スケジュールされたスケーリング
シナリオ
関数で明確な周期パターンや予測可能なトラフィックピークが発生した場合は、スケジュールスケーリングを選択します。 同時呼び出しの数がスケジュールされたスケーリングポリシーで定義された容量を超えると、すべての過剰なリクエストは処理のためにオンデマンドインスタンスに送信されます。
サンプル設定
次の図は、インスタンスのスケーリングの2つのスケジュールされたアクションを示しています。最初のアクションは、トラフィックのピーク前にプロビジョニングされたインスタンスをスケールアウトし、2番目のアクションはその後にインスタンスをスケールアウトします。
次のコードスニペットは、PutProvisionConfig操作を呼び出して、スケジュールされたスケーリングポリシーを設定する方法を示しています。 この例では、function_1という名前の関数は、タイムゾーンをAsia/Shanghai (UTC + 8) に設定して、自動的にスケールインおよびスケールアウトするように設定されています。 設定は、2024年8月1日の10:00:00から2024年8月30日の10:00:00 (UTC + 8) まで有効になります。 この期間中、プロビジョニングされたインスタンスの数は、毎日20:00 (UTC + 8) に50に増加し、22:00 (UTC + 8) に10に減少します。
"scheduledActions": [
{
"name": "scale_up_action",
"startTime": "2024-08-01T10:00:00",
"endTime": "2024-08-30T10:00:00",
"target": 50,
"scheduleExpression": "cron(0 0 20 * * *)",
"timeZone": "Asia/Shanghai"
},
{
"name": "scale_down_action",
"startTime": "2024-08-01T10:00:00",
"endTime": "2024-08-30T10:00:00",
"target": 10,
"scheduleExpression": "cron(0 0 22 * * *)",
"timeZone": "Asia/Shanghai"
}
]Cron式
しきい値ベースのスケーリング
シナリオ
しきい値ベースのスケーリングポリシーを設定すると、Function Computeはプロビジョニングされたインスタンスの同時実行性またはリソース使用率のメトリクスを定期的に収集します。 これらのメトリックと、指定したプロビジョニング済みインスタンスの最小数と最大数を使用して、インスタンスのスケーリングを制御し、インスタンスの数が実際のリソース使用量とより密接に一致するようにします。
サンプル設定
次の図は、インスタンス同時実行の使用率に基づくオートスケーリングの例を示しています。 トラフィック量が増加すると、スケールアウトしきい値がトリガーされ、Function Computeはプロビジョニングされたインスタンスの数を増やし始めます。 スケールアウトは、数値が設定した上限に達すると停止します。 過剰なリクエストは、処理のためにオンデマンドインスタンスに送信されます。
しきい値ベースのスケーリングポリシーを設定するには、まずインスタンスレベルのメトリックの収集を有効にする必要があります。 それ以外の場合、
400 InstanceMetricsRequiredエラーが報告されます。 詳細については、「インスタンスレベルのメトリックの収集の有効化」をご参照ください。同時実行利用率メトリックには、プロビジョニングされたインスタンスの同時実行のみが含まれます。
並行使用率メトリックは、すべてのプロビジョニング済みインスタンスが処理できる同時リクエストの最大数に対する、プロビジョニング済みインスタンスによって処理される同時リクエストの比率を評価します。 メトリックの値は0から1の範囲です。
次のコードスニペットは、PutProvisionConfig操作を呼び出してしきい値ベースのスケーリングポリシーを設定する方法を示しています。 この例では、function_1という名前の関数は、プロビジョニングされたインスタンスの同時使用率を追跡するProvisionedConcurrencyUtilizationメトリックに基づいて自動的にスケールインおよびスケールアウトするように構成されています。 タイムゾーンはAsia/Shanghai (UTC + 8) に設定されています。 設定は、2024年8月1日の10:00:00から2024年8月30日の10:00:00 (UTC + 8) まで有効になります。 この期間中、同時実行使用率が60% を超えると、プロビジョニングされたインスタンスの数は最大100まで増加します。 逆に、同時実行使用率が60% を下回ると、プロビジョニングされたインスタンスの数は最小10に減少します。
"targetTrackingPolicies": [
{
"name": "action_1",
"startTime": "2024-08-01T10:00:00",
"endTime": "2024-08-30T10:00:00",
"metricType": "ProvisionedConcurrencyUtilization",
"metricTarget": 0.6,
"minCapacity": 10,
"maxCapacity": 100,
"timeZone": "Asia/Shanghai"
}
]スケーリングの原則
インスタンスのスケールインがトリガーされると、Function Computeは、0 (除外) から1までのスケールイン係数に基づいて、プロビジョニングされたインスタンスの数を徐々に減らします。 スケールイン係数は、スケールイン速度を遅くするために使用されるシステムパラメータである。 手動設定は必要ありません。 スケーリングタスクのターゲット値は、次の計算結果以上の最小の整数です。
スケールアウト目標値=現在のプロビジョニング済みインスタンス × (現在のメトリック値 /指定された使用率しきい値)
スケールイン目標値=現在のプロビジョニング済みインスタンス × スケールイン係数 × (1 − 現在のメトリック値 /指定された利用率しきい値)
次の例は、スケールアウトターゲットの計算方法を示しています。 同様に、スケールインターゲットは、前述の原理および式を使用して決定することができる。
現在のメトリック値が80% であり、指定された利用しきい値が40% であり、プロビジョニングされたインスタンスの現在の数が100である場合、インスタンスのターゲット数は次のように計算されます。100 × (80%/40%) = 200。 プロビジョニングされたインスタンスの数が200に増加します (これが許容される最大値を超えない限り) 。これにより、使用率が約40% に維持されます。
例
次の例では、defaultTargetパラメーターとスケジュールされたスケーリングポリシーで指定されたターゲット値が、特定の時間にプロビジョニングされたインスタンスの数を決定する方法を明確にします。 この例では、defaultTargetパラメーターは5に設定され、アジア /上海タイムゾーン (UTC + 8) を使用して、2つのスケジュールされたスケーリングポリシーが設定されています。 設定は、2025年1月9日の10:00:00から2025年1月11日の00:00:00 (UTC + 8) まで有効になります。 この期間中、プロビジョニングされたインスタンスの数は、毎日10:00 (UTC + 8) に20に増加し、22:00 (UTC + 8) に10に減少します。 次のコードスニペットは、スケーリングポリシーの内容を示しています。
{
"defaultTarget": 5,
"scheduledActions": [
{
"name": "scale_up_action",
"startTime": "2025-01-09T10:00:00",
"endTime": "2025-01-11T00:00:00",
"target": 20,
"scheduleExpression": "cron(0 0 10 * * *)",
"timeZone": "Asia/Shanghai"
},
{
"name": "scale_down_action",
"startTime": "2025-01-09T10:00:00",
"endTime": "2025-01-11T00:00:00",
"target": 10,
"scheduleExpression": "cron(0 0 22 * * *)",
"timeZone": "Asia/Shanghai"
}
]
}次の図は、プロビジョニングされたインスタンス数の経時的な変化を示しています。
最大同時実行性
プロビジョニングされたすべてのインスタンスが処理できる同時リクエストの最大数、または最大同時実行性は、インスタンスの同時実行設定によって決まります。
各インスタンスは一度に単一のリクエストを処理します
最大同時実行数=インスタンス数
各インスタンスは一度に複数のリクエストを処理します
最大同時実行数=インスタンス数 × インスタンスによって同時に処理されたリクエスト数
インスタンス同時実行機能のシナリオ、利点、設定、および影響の詳細については、「Web 関数の作成」をご参照ください。
関連ドキュメント
オンデマンドモードとプロビジョニングモードの基本概念と課金方法の詳細については、「インスタンスタイプと使用モード」をご参照ください。
プロビジョニング済みインスタンスのリソース使用率を改善する方法の詳細については、「最小インスタンス数のエラスティックポリシーを設定する」をご参照ください。
デフォルトでは、同じリージョンのAlibaba Cloudアカウント内のすべての関数が同じスケーリング制限を共有します。 指定した関数のインスタンス数を制限する方法の詳細については、「インスタンスの最大数を設定する」をご参照ください。 実行中のインスタンスの数が指定された最大値を超えると、Function Computeはスロットリングエラーを返します。