Batch プール内のコンピューティング ノードを拡張するための自動スケールの数式の作成Create an automatic scaling formula for scaling compute nodes in a Batch pool

Azure Batch は定義したパラメーターに基づいてプールを自動的にスケールできます。Azure Batch can automatically scale pools based on parameters that you define. 自動スケールにより、Batch はタスクの需要が増えるとノードを動的にプールに追加し、需要が減ると計算ノードを削除します。With automatic scaling, Batch dynamically adds nodes to a pool as task demands increase, and removes compute nodes as they decrease. Batch アプリケーションで使用される計算ノードの数を自動的に調整することで、時間とコストの両方を節約できます。You can save both time and money by automatically adjusting the number of compute nodes used by your Batch application.

計算ノード プールの自動スケーリングは、ユーザーが定義した自動スケールの数式をプールに関連付けることによって有効にします。You enable automatic scaling on a pool of compute nodes by associating with it an autoscale formula that you define. Batch サービスでは、自動スケーリングの数式を使用して、ワークロードを実行するために必要な計算ノードの数を決定します。The Batch service uses the autoscale formula to determine the number of compute nodes that are needed to execute your workload. 計算ノードは、専用ノードまたは優先順位の低いノードのいずれかです。Compute nodes may be dedicated nodes or low-priority nodes. Batch は、定期的に収集されるサービス メトリック データに応答します。Batch responds to service metrics data that is collected periodically. Batch はこのメトリック データを使用して、数式と構成可能な間隔に基づいて、プール内の計算ノードの数を調整します。Using this metrics data, Batch adjusts the number of compute nodes in the pool based on your formula and at a configurable interval.

自動スケールは、プールの作成時のほか、既存のプールに対して有効にできます。You can enable automatic scaling either when a pool is created, or on an existing pool. また、自動スケールが構成されているプールの既存の数式を変更することもできます。You can also change an existing formula on a pool that is configured for autoscaling. Batch では、数式をプールに割り当てる前に数式の評価を行うことができるほか、自動スケールの実行状態を監視することができます。Batch enables you to evaluate your formulas before assigning them to pools and to monitor the status of automatic scaling runs.

この記事では、変数、演算子、操作、関数など、自動スケールの数式を構成するさまざまな要素について説明します。This article discusses the various entities that make up your autoscale formulas, including variables, operators, operations, and functions. Batch 内の各種計算リソースとタスクのメトリックを取得する方法について取り上げます。We discuss how to obtain various compute resource and task metrics within Batch. これらのメトリックを使用すると、リソースの使用状況やタスクの状態に応じて、プールのノード数を調整できます。You can use these metrics to adjust your pool's node count based on resource usage and task status. その後、数式を作成する方法や、Batch の REST API と .NET API を使用してプールの自動スケールを有効にする方法について説明します。We then describe how to construct a formula and enable automatic scaling on a pool by using both the Batch REST and .NET APIs. 最後に、数式の例をいくつか紹介します。Finally, we finish up with a few example formulas.

重要

Batch アカウントを作成する際に、アカウント構成を指定できます。アカウント構成は、プールが Batch Service サブスクリプションに割り当てられる (既定) か、ユーザー サブスクリプションに割り当てられるかを決定します。When you create a Batch account, you can specify the account configuration, which determines whether pools are allocated in a Batch service subscription (the default), or in your user subscription. Batch Service の既定の構成で Batch アカウントを作成した場合、アカウントは処理に使用できるコアの最大数に制限されます。If you created your Batch account with the default Batch Service configuration, then your account is limited to a maximum number of cores that can be used for processing. そのコア数が、Batch サービスでスケール可能な計算ノードの最大数になります。The Batch service scales compute nodes only up to that core limit. このことにより、Batch サービスが自動スケールの数式によって指定された目標数に到達しない場合があります。For this reason, the Batch service may not reach the target number of compute nodes specified by an autoscale formula. アカウントのクォータを表示する方法および増やす方法については、「 Azure Batch サービスのクォータと制限 」を参照してください。See Quotas and limits for the Azure Batch service for information on viewing and increasing your account quotas.

ユーザー サブスクリプションの構成でアカウントを作成した場合、アカウントはそのサブスクリプションのコア クォータで共有します。If you created your account with the User Subscription configuration, then your account shares in the core quota for the subscription. 詳細については、「Azure サブスクリプションとサービスの制限、クォータ、制約」の「Virtual Machines の制限」をご覧ください。For more information, see Virtual Machines limits in Azure subscription and service limits, quotas, and constraints.

自動スケールの数式Automatic scaling formulas

自動スケーリングの数式は、ユーザーが定義する文字列値であり、1 つまたは複数のステートメントが含まれています。An automatic scaling formula is a string value that you define that contains one or more statements. 自動スケーリングの数式は、プールの autoScaleFormula 要素 (Batch REST) または CloudPool.AutoScaleFormula プロパティ (Batch .NET) に割り当てられます。The autoscale formula is assigned to a pool's autoScaleFormula element (Batch REST) or CloudPool.AutoScaleFormula property (Batch .NET). Batch サービスは、定義された数式を使用して、次の処理期間中のプール内の計算ノードの目標数を決定します。The Batch service uses your formula to determine the target number of compute nodes in the pool for the next interval of processing. この数式は 8 KB 以下の文字列で、最大 100 個のステートメントをセミコロンで区切って指定できます。また、改行やコメントを使用することもできます。The formula string cannot exceed 8 KB, can include up to 100 statements that are separated by semicolons, and can include line breaks and comments.

自動スケールの数式は、Batch 自動スケール "言語" と捉えることができます。You can think of automatic scaling formulas as a Batch autoscale "language." 数式は自由形式のステートメントになっていて、サービス定義の変数 (Batch サービスによって定義された変数) とユーザー定義の変数 (ユーザーによって定義された変数) の両方を含めることができます。Formula statements are free-formed expressions that can include both service-defined variables (variables defined by the Batch service) and user-defined variables (variables that you define). 組み込みの型、演算子、関数を使用して、これらの値に対する各種の操作を実行できます。They can perform various operations on these values by using built-in types, operators, and functions. たとえば、ステートメントは次の形式を使用する場合があります。For example, a statement might take the following form:

$myNewVariable = function($ServiceDefinedVariable, $myCustomVariable);

一般に、数式には複数のステートメントが存在し、先行するステートメントで取得された値に対してさまざまな操作が実行されます。Formulas generally contain multiple statements that perform operations on values that are obtained in previous statements. たとえば variable1 の値を取得しておき、それを関数に渡して variable2 に代入します。For example, first we obtain a value for variable1, then pass it to a function to populate variable2:

$variable1 = function1($ServiceDefinedVariable);
$variable2 = function2($OtherServiceDefinedVariable, $variable1);

計算ノードが目標の数に到達するように、自動スケールの数式にこれらのステートメントを含めます。Include these statements in your autoscale formula to arrive at a target number of compute nodes. 専用ノードと優先順位の低いノードにはそれぞれ独自の目標設定があるため、ノードの種類ごとに目標を設定できます。Dedicated nodes and low-priority nodes each have their own target settings, so that you can define a target for each type of node. 自動スケールの数式には、専用ノード、優先順位の低いノード、またはその両方に対して目標値を含めることができます。An autoscale formula can include a target value for dedicated nodes, a target value for low-priority nodes, or both.

ノードの目標数は、現在のプール内のその種類のノードの数より多くなることも、少なくなることも、同じになることもあります。The target number of nodes may be higher, lower, or the same as the current number of nodes of that type in the pool. プールの自動スケールの数式は、Batch によって一定間隔で評価されます (「自動スケールの間隔」をご覧ください)。Batch evaluates a pool's autoscale formula at a specific interval (see automatic scaling intervals). Batch はプール内の各種類のノードの目標数を、自動スケールの数式の評価時に割り出されたノード数と一致するように調整します。Batch adjusts the target number of each type of node in the pool to the number that your autoscale formula specifies at the time of evaluation.

自動スケールの数式の例Sample autoscale formulas

ほとんどのシナリオで機能するように調整できる 2 つの自動スケールの数式の例を次に示します。Below are examples of two autoscale formulas, which can be adjusted to work for most scenarios. 必要に応じて、例の式の startingNumberOfVMs 変数と maxNumberofVMs 変数を調整できます。The variables startingNumberOfVMs and maxNumberofVMs in the example formulas can be adjusted to your needs.

保留中のタスクPending tasks

startingNumberOfVMs = 1;
maxNumberofVMs = 25;
pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second);
pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second));
$TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);

この自動スケールの数式では、プールは最初は 1 つの VM で作成されます。With this autoscale formula, the pool is initially created with a single VM. $PendingTasks メトリックにより、実行中またはキューに置かれているタスクの数が定義されます。The $PendingTasks metric defines the number of tasks that are running or queued. この数式により、最後の 180 秒間の保留タスク平均数が判明し、$TargetDedicatedNodes 変数が適宜設定されます。The formula finds the average number of pending tasks in the last 180 seconds and sets the $TargetDedicatedNodes variable accordingly. この数式により、専用ノードの目標数が 25 台の VM を超えることはありません。The formula ensures that the target number of dedicated nodes never exceeds 25 VMs. 新しいタスクが送信されると、プールは自動的に拡大します。As new tasks are submitted, the pool automatically grows. タスクが完了すると、VM が 1 台ずつ解放され、自動スケーリングの数式によってプールが縮小します。As tasks complete, VMs become free one by one and the autoscaling formula shrinks the pool.

この数式は専用ノードをスケールしますが、優先順位の低いノードのスケールにも適用されるように変更できます。This formula scales dedicated nodes, but can be modified to apply to scale low-priority nodes as well.

Preempted Node (割り込まれたノード)Preempted nodes

maxNumberofVMs = 25;
$TargetDedicatedNodes = min(maxNumberofVMs, $PreemptedNodeCount.GetSample(180 * TimeInterval_Second));
$TargetLowPriorityNodes = min(maxNumberofVMs , maxNumberofVMs - $TargetDedicatedNodes);

この例では、25 個の優先順位の低いノードから始まるプールを作成します。This example creates a pool that starts with 25 low-priority nodes. 優先順位の低いノードが割り込まれるたびに、専用のノードに置き換えられます。Every time a low-priority node is preempted, it is replaced with a dedicated node. 最初の例と同様に、maxNumberofVMs 変数は、プールが 25 台の VM を超過することを防ぎます。As with the first example, the maxNumberofVMs variable prevents the pool from exceeding 25 VMs. この例は、優先順位の低い VM を活用する場合に役立ちます。また、プールの有効期間中、割り込みが一定数に留まるようにします。This example is useful for taking advantage of low-priority VMs while also ensuring that only a fixed number of preemptions will occur for the lifetime of the pool.

変数Variables

自動スケールの数式には、サービス定義の変数とユーザー定義の変数の両方を使用できます。You can use both service-defined and user-defined variables in your autoscale formulas. サービス定義の変数は Batch サービスに組み込まれています。The service-defined variables are built in to the Batch service. サービス定義の変数には、読み取り/書き込み可能な変数と読み取り専用の変数があります。Some service-defined variables are read-write, and some are read-only. ユーザー定義の変数は、ユーザーが定義する変数です。User-defined variables are variables that you define. 前のセクションで示した例の数式では、$TargetDedicatedNodes$PendingTasks がサービス定義の変数です。In the example formula shown in the previous section, $TargetDedicatedNodes and $PendingTasks are service-defined variables. startingNumberOfVMsmaxNumberofVMs がユーザー定義の変数です。Variables startingNumberOfVMs and maxNumberofVMs are user-defined variables.

注意

サービス定義の変数は、常にドル記号 ($) が前に付きます。Service-defined variables are always preceded by a dollar sign ($). ユーザー定義の変数では、ドル記号は省略可能です。For user-defined variables, the dollar sign is optional.

次の表に、Batch サービスで定義されている読み取り/書き込み変数と読み取り専用変数の両方を示します。The following tables show both read-write and read-only variables that are defined by the Batch service.

これらのサービス定義の変数の値を取得および設定することで、プール内の計算ノードの数を管理できます。You can get and set the values of these service-defined variables to manage the number of compute nodes in a pool:

読み取り/書き込み可能なサービス定義変数Read-write service-defined variables 説明Description
$TargetDedicatedNodes$TargetDedicatedNodes プールの専用計算ノードの目標数。The target number of dedicated compute nodes for the pool. プールが目的の数のノードに常に到達するとは限らないため、専用ノードの数は目標として指定されます。The number of dedicated nodes is specified as a target because a pool may not always achieve the desired number of nodes. たとえば、自動スケール評価によって専用ノードの目標数がプールが最初に設定された目標に達する前に変更された場合、そのプールは目標に到達しない可能性があります。For example, if the target number of dedicated nodes is modified by an autoscale evaluation before the pool has reached the initial target, then the pool may not reach the target.

Batch Service 構成で作成されたアカウント内のプールの目標が Batch アカウント ノードまたはコア クォータを超える場合、その目標に到達しない可能性があります。A pool in an account created with the Batch Service configuration may not achieve its target if the target exceeds a Batch account node or core quota. ユーザー サブスクリプション構成で作成されたアカウント内のプールの目標がそのサブスクリプションの共有コア クォータを超える場合、その目標に到達しない可能性があります。A pool in an account created with the User Subscription configuration may not achieve its target if the target exceeds the shared core quota for the subscription.
$TargetLowPriorityNodes$TargetLowPriorityNodes プールの優先順位の低い計算ノードの目標数。The target number of low-priority compute nodes for the pool. プールが目的の数のノードに常に到達するとは限らないため、優先順位の低いノードの数は目標として指定されます。The number of low-priority nodes is specified as a target because a pool may not always achieve the desired number of nodes. たとえば、自動スケール評価によって優先順位の低いノードの目標数がプールが最初に設定された目標に達する前に変更された場合、プールは目標に到達しない可能性があります。For example, if the target number of low-priority nodes is modified by an autoscale evaluation before the pool has reached the initial target, then the pool may not reach the target. また、目標が Batch アカウント ノードまたはコア クォータを超える場合、プールはその目標に到達しない可能性があります。A pool may also not achieve its target if the target exceeds a Batch account node or core quota.

優先順位の低い計算ノードについて詳しくは、「優先順位の低い VM で Batch を使用する (プレビュー)」をご覧ください。For more information on low-priority compute nodes, see Use low-priority VMs with Batch (Preview).
$NodeDeallocationOption$NodeDeallocationOption コンピューティング ノードがプールから削除されるときに発生するアクション。The action that occurs when compute nodes are removed from a pool. 次のいずれかの値になります。Possible values are:
  • requeue – すぐにタスクを終了し、再スケジュールされるようにジョブ キューに戻します。requeue--Terminates tasks immediately and puts them back on the job queue so that they are rescheduled.
  • terminate – すぐにタスクを終了し、ジョブ キューから削除します。terminate--Terminates tasks immediately and removes them from the job queue.
  • taskcompletion – 現在実行中のタスクの完了を待ち、プールからノードを削除します。taskcompletion--Waits for currently running tasks to finish and then removes the node from the pool.
  • retaineddata - ノードでローカル タスクによって保持されているすべてのデータがクリーンアップされるまで待機してから、ノードをプールから削除します。retaineddata--Waits for all the local task-retained data on the node to be cleaned up before removing the node from the pool.

これらのサービス定義変数の値を取得して、Batch サービスのメトリックに基づいて調整できます。You can get the value of these service-defined variables to make adjustments that are based on metrics from the Batch service:

読み取り専用のサービス定義変数Read-only service-defined variables 説明Description
$CPUPercent$CPUPercent 平均 CPU 使用率。The average percentage of CPU usage.
$WallClockSeconds$WallClockSeconds 使用された秒数。The number of seconds consumed.
$MemoryBytes$MemoryBytes 使用された平均メガバイト数。The average number of megabytes used.
$DiskBytes$DiskBytes ローカル ディスクで使用された平均ギガバイト数。The average number of gigabytes used on the local disks.
$DiskReadBytes$DiskReadBytes 読み取られたバイト数。The number of bytes read.
$DiskWriteBytes$DiskWriteBytes 書き込まれたバイト数。The number of bytes written.
$DiskReadOps$DiskReadOps 実行された読み取りディスク操作の数。The count of read disk operations performed.
$DiskWriteOps$DiskWriteOps 実行された書き込みディスク操作の数。The count of write disk operations performed.
$NetworkInBytes$NetworkInBytes 受信バイト数。The number of inbound bytes.
$NetworkOutBytes$NetworkOutBytes 送信バイト数。The number of outbound bytes.
$SampleNodeCount$SampleNodeCount 計算ノードの数。The count of compute nodes.
$ActiveTasks$ActiveTasks 実行する準備はできているがまだ実行されていないタスクの数。The number of tasks that are ready to execute but are not yet executing. $ActiveTasks の数には、アクティブ状態にあり、依存関係が満たされているすべてのタスクが含まれます。The $ActiveTasks count includes all tasks that are in the active state and whose dependencies have been satisfied. アクティブ状態にあるものの、依存関係が満たされていないタスクはすべて $ActiveTasks の数から除外されます。Any tasks that are in the active state but whose dependencies have not been satisfied are excluded from the $ActiveTasks count.
$RunningTasks$RunningTasks 実行状態のタスクの数。The number of tasks in a running state.
$PendingTasks$PendingTasks $ActiveTasks と $RunningTasks の合計。The sum of $ActiveTasks and $RunningTasks.
$SucceededTasks$SucceededTasks 正常に完了したタスクの数。The number of tasks that finished successfully.
$FailedTasks$FailedTasks 失敗したタスクの数。The number of tasks that failed.
$CurrentDedicatedNodes$CurrentDedicatedNodes 専用コンピューティング ノードの現在の数。The current number of dedicated compute nodes.
$CurrentLowPriorityNodes$CurrentLowPriorityNodes 優先順位の低い計算ノードの現在の数。割り込まれているノードも含まれます。The current number of low-priority compute nodes, including any nodes that have been pre-empted.
$PreemptedNodeCount$PreemptedNodeCount 割り込み状態にあるプール内のノードの数。The number of nodes in the pool that are in a pre-empted state.

ヒント

前の表の読み取り専用のサービス定義変数は、それぞれに関連付けられたデータにアクセスするさまざまなメソッドを指定する "オブジェクト" です。The read-only, service-defined variables that are shown in the previous table are objects that provide various methods to access data associated with each. 詳しくは、後述の「サンプル データの取得」をご覧ください。For more information, see Obtain sample data later in this article.

Types

次の型が数式でサポートされています。These types are supported in a formula:

  • doubledouble

  • doubleVecdoubleVec

  • doubleVecListdoubleVecList

  • stringstring

  • timestamp -- timestamp は次のメンバーを含む複合構造になっています。timestamp--timestamp is a compound structure that contains the following members:

    • yearyear
    • month (1 ~ 12)month (1-12)
    • day (1 ~ 31)day (1-31)
    • weekday (数値の形式で表記します。月曜は 1 など)weekday (in the format of number; for example, 1 for Monday)
    • hour (24 時間の数字で表記します。午後 1 時は 13 など)hour (in 24-hour number format; for example, 13 means 1 PM)
    • minute (00 ~ 59)minute (00-59)
    • second (00 ~ 59)second (00-59)
  • timeintervaltimeinterval

    • TimeInterval_ZeroTimeInterval_Zero
    • TimeInterval_100nsTimeInterval_100ns
    • TimeInterval_MicrosecondTimeInterval_Microsecond
    • TimeInterval_MillisecondTimeInterval_Millisecond
    • TimeInterval_SecondTimeInterval_Second
    • TimeInterval_MinuteTimeInterval_Minute
    • TimeInterval_HourTimeInterval_Hour
    • TimeInterval_DayTimeInterval_Day
    • TimeInterval_WeekTimeInterval_Week
    • TimeInterval_YearTimeInterval_Year

OperationsOperations

前のセクションに列挙されている型に対して、次の演算を実行できます。These operations are allowed on the types that are listed in the previous section.

OperationOperation サポートされている演算子Supported operators 結果の種類Result type
double <演算子> doubledouble operator double +, -, *, /+, -, *, / doubledouble
double <演算子> timeintervaldouble operator timeinterval * timeintervaltimeinterval
doubleVec <演算子> doubledoubleVec operator double +, -, *, /+, -, *, / doubleVecdoubleVec
doubleVec <演算子> doubleVecdoubleVec operator doubleVec +, -, *, /+, -, *, / doubleVecdoubleVec
timeinterval <演算子> doubletimeinterval operator double *, /*, / timeintervaltimeinterval
timeinterval <演算子> timeintervaltimeinterval operator timeinterval +, -+, - timeintervaltimeinterval
timeinterval <演算子> timestamptimeinterval operator timestamp + timestamptimestamp
timestamp <演算子> timeintervaltimestamp operator timeinterval + timestamptimestamp
timestamp <演算子> timestamptimestamp operator timestamp - timeintervaltimeinterval
<演算子> doubleoperatordouble -, !-, ! doubledouble
<演算子> timeintervaloperatortimeinterval - timeintervaltimeinterval
double <演算子> doubledouble operator double <, <=, ==, >=, >, !=<, <=, ==, >=, >, != doubledouble
string <演算子> stringstring operator string <, <=, ==, >=, >, !=<, <=, ==, >=, >, != doubledouble
timestamp <演算子> timestamptimestamp operator timestamp <, <=, ==, >=, >, !=<, <=, ==, >=, >, != doubledouble
timeinterval <演算子> timeintervaltimeinterval operator timeinterval <, <=, ==, >=, >, !=<, <=, ==, >=, >, != doubledouble
double <演算子> doubledouble operator double &&, ||&&, || doubledouble

3 項演算子で double 型の値をテストするときに (double ? statement1 : statement2)、0 以外の値は true、0 は false になります。When testing a double with a ternary operator (double ? statement1 : statement2), nonzero is true, and zero is false.

FunctionsFunctions

次の定義済みの 関数 は、自動スケールの数式の定義に使用できます。These predefined functions are available for you to use in defining an automatic scaling formula.

FunctionFunction 戻り値の型Return type 説明Description
avg(doubleVecList)avg(doubleVecList) doubledouble doubleVecList のすべての値の平均値を返します。Returns the average value for all values in the doubleVecList.
len(doubleVecList)len(doubleVecList) doubledouble doubleVecList から作成されたベクター長を返します。Returns the length of the vector that is created from the doubleVecList.
lg (double)lg(double) doubledouble 2 を底とする double の対数を返します。Returns the log base 2 of the double.
lg(doubleVecList)lg(doubleVecList) doubleVecdoubleVec 2 を底とする doubleVecList の成分ごとの対数を返します。Returns the component-wise log base 2 of the doubleVecList. このパラメーターには明示的に vec(double) を渡す必要があります。A vec(double) must be explicitly passed for the parameter. そのようにしないと、double lg(double) として解釈されます。Otherwise, the double lg(double) version is assumed.
ln(double)ln(double) doubledouble double の自然対数を返します。Returns the natural log of the double.
ln(doubleVecList)ln(doubleVecList) doubleVecdoubleVec 2 を底とする doubleVecList の成分ごとの対数を返します。Returns the component-wise log base 2 of the doubleVecList. このパラメーターには明示的に vec(double) を渡す必要があります。A vec(double) must be explicitly passed for the parameter. そのようにしないと、double lg(double) として解釈されます。Otherwise, the double lg(double) version is assumed.
log(double)log(double) doubledouble 10 を底とする double の対数を返します。Returns the log base 10 of the double.
log(doubleVecList)log(doubleVecList) doubleVecdoubleVec 10 を底とする doubleVecList の成分ごとの対数を返します。Returns the component-wise log base 10 of the doubleVecList. この単一の double パラメーターには明示的に vec(double) を渡す必要があります。A vec(double) must be explicitly passed for the single double parameter. そのようにしないと、double log(double) として解釈されます。Otherwise, the double log(double) version is assumed.
max(doubleVecList)max(doubleVecList) doubledouble doubleVecList の最大値を返します。Returns the maximum value in the doubleVecList.
min(doubleVecList)min(doubleVecList) doubledouble doubleVecList の最小値を返します。Returns the minimum value in the doubleVecList.
norm(doubleVecList)norm(doubleVecList) doubledouble doubleVecList から作成されたベクトルの 2 ノルムを返します。Returns the two-norm of the vector that is created from the doubleVecList.
percentile(doubleVec v, double p)percentile(doubleVec v, double p) doubledouble ベクトル v の百分位要素を返します。Returns the percentile element of the vector v.
rand()rand() doubledouble 0.0 ~ 1.0 のランダムな値を返します。Returns a random value between 0.0 and 1.0.
range(doubleVecList)range(doubleVecList) doubledouble doubleVecList の最小値と最大値の差を返します。Returns the difference between the min and max values in the doubleVecList.
std(doubleVecList)std(doubleVecList) doubledouble doubleVecList の値のサンプルの標準偏差を返します。Returns the sample standard deviation of the values in the doubleVecList.
stop()stop() 自動スケール式の評価を停止します。Stops evaluation of the autoscaling expression.
sum(doubleVecList)sum(doubleVecList) doubledouble doubleVecList のすべての成分の合計を返します。Returns the sum of all the components of the doubleVecList.
time(string dateTime="")time(string dateTime="") timestamptimestamp パラメーターが渡されない場合は現在の時刻のタイムスタンプ、渡された場合は dateTime 文字列のタイムスタンプを返します。Returns the time stamp of the current time if no parameters are passed, or the time stamp of the dateTime string if it is passed. サポートされている dateTime 形式は、W3C-DTF と RFC 1123 です。Supported dateTime formats are W3C-DTF and RFC 1123.
val(doubleVec v, double i)val(doubleVec v, double i) doubledouble 開始インデックス 0 のベクター v の位置 i にある要素の値を返します。Returns the value of the element that is at location i in vector v, with a starting index of zero.

前の表に示した一部の関数は、リストを引数として受け入れることができます。Some of the functions that are described in the previous table can accept a list as an argument. コンマ区切りのリストは、doubledoubleVec の任意の組み合わせです。The comma-separated list is any combination of double and doubleVec. 例:For example:

doubleVecList := ( (double | doubleVec)+(, (double | doubleVec) )* )?

doubleVecList 値は、評価の前に 1 つの doubleVec に変換されます。The doubleVecList value is converted to a single doubleVec before evaluation. たとえば、v = [1,2,3] の場合、avg(v) の呼び出しは、avg(1,2,3) の呼び出しに相当します。For example, if v = [1,2,3], then calling avg(v) is equivalent to calling avg(1,2,3). avg(v, 7) の呼び出しは、avg(1,2,3,7) の呼び出しに相当します。Calling avg(v, 7) is equivalent to calling avg(1,2,3,7).

サンプル データの取得Obtain sample data

自動スケールの数式は、Batch サービスから提供されるメトリック データ (サンプル) に基づいて作用します。Autoscale formulas act on metrics data (samples) that is provided by the Batch service. プール サイズは、サービスから数式に与えられる値に基づいて拡大されたり縮小されたりします。A formula grows or shrinks pool size based on the values that it obtains from the service. 前のサービス定義の変数は、関連付けられたデータにアクセスするメソッドを提供するオブジェクトです。The service-defined variables that were described previously are objects that provide various methods to access data that is associated with that object. たとえば、次の式は、最後の 5 分間の CPU 使用率を取得する要求を示しています。For example, the following expression shows a request to get the last five minutes of CPU usage:

$CPUPercent.GetSample(TimeInterval_Minute * 5)
MethodMethod 説明Description
GetSample()GetSample() GetSample() メソッドは、データ サンプルのベクターを返します。The GetSample() method returns a vector of data samples.

サンプルは、30 秒相当のメトリック データです。A sample is 30 seconds worth of metrics data. つまり、30 秒ごとにサンプルが取得されます。In other words, samples are obtained every 30 seconds. ただし、この後も説明しますが、サンプルが収集されてから、それが数式に使用できるようになるまでには時間差があります。But as noted below, there is a delay between when a sample is collected and when it is available to a formula. そのため、特定の期間に取得されたすべてのサンプルを数式の評価に使用できない可能性があります。As such, not all samples for a given time period may be available for evaluation by a formula.
  • doubleVec GetSample(double count)
    最新の収集済みサンプルから取得するサンプル数を指定します。Specifies the number of samples to obtain from the most recent samples that were collected.

    GetSample(1) は、使用できる最新のサンプルを返します。GetSample(1) returns the last available sample. ただし、$CPUPercent などのメトリックの場合、サンプルが収集された "時間" がわからないので、GetSample を使用できません。For metrics like $CPUPercent, however, this should not be used because it is impossible to know when the sample was collected. 最新の場合もありますが、システム上の問題が原因でかなり古い可能性があります。It might be recent, or, because of system issues, it might be much older. このような場合は、次のように期間を使用することをお勧めします。It is better in such cases to use a time interval as shown below.
  • doubleVec GetSample((timestamp or timeinterval) startTime [, double samplePercent])
    サンプル データを収集する期間を指定します。Specifies a time frame for gathering sample data. 指定した期間内に必要となるサンプルの割合をオプションで指定できます。Optionally, it also specifies the percentage of samples that must be available in the requested time frame.

    $CPUPercent.GetSample(TimeInterval_Minute * 10) は、過去 10 分間のサンプルがすべて CPUPercent 履歴に存在する場合、20 個のサンプルを返します。$CPUPercent.GetSample(TimeInterval_Minute * 10) would return 20 samples if all samples for the last 10 minutes are present in the CPUPercent history. ただし、過去 1 分間の履歴を使用できない場合は、18 個のサンプルのみが返されます。If the last minute of history was not available, however, only 18 samples would be returned. この場合、次のようになります。In this case:

    $CPUPercent.GetSample(TimeInterval_Minute * 10, 95) は、サンプルの 90% しか使用できないため、失敗します。$CPUPercent.GetSample(TimeInterval_Minute * 10, 95) would fail because only 90 percent of the samples are available.

    $CPUPercent.GetSample(TimeInterval_Minute * 10, 80) は成功します。$CPUPercent.GetSample(TimeInterval_Minute * 10, 80) would succeed.
  • doubleVec GetSample((timestamp or timeinterval) startTime, (timestamp or timeinterval) endTime [, double samplePercent])
    開始時刻と終了時刻の両方を使用して、データを収集する期間を指定します。Specifies a time frame for gathering data, with both a start time and an end time.

    前述のように、サンプルが収集される時間と、数式に使用できるようになる時間には遅延があります。As mentioned above, there is a delay between when a sample is collected and when it is available to a formula. GetSample メソッドを使用する際にはこの遅延を考慮します。Consider this delay when you use the GetSample method. 後述の GetSamplePercent をご覧ください。See GetSamplePercent below.
GetSamplePeriod()GetSamplePeriod() 履歴のサンプル データ セットで受け取ったサンプルの期間を返します。Returns the period of samples that were taken in a historical sample data set.
Count()Count() メトリック履歴のサンプルの合計数を返します。Returns the total number of samples in the metric history.
HistoryBeginTime()HistoryBeginTime() 使用可能な最も古いメトリックのデータ サンプルのタイムスタンプを返します。Returns the time stamp of the oldest available data sample for the metric.
GetSamplePercent()GetSamplePercent() 特定の時間間隔で利用できるサンプルの割合を返します。Returns the percentage of samples that are available for a given time interval. 例:For example:

doubleVec GetSamplePercent( (timestamp or timeinterval) startTime [, (timestamp or timeinterval) endTime] )

返されたサンプルの割合が指定した samplePercent 未満の場合、GetSample メソッドは失敗するので、まず GetSamplePercent メソッドを使用して確認します。Because the GetSample method fails if the percentage of samples returned is less than the samplePercent specified, you can use the GetSamplePercent method to check first. その後、十分なサンプルが存在しない場合は、自動スケール評価を停止せずに代替の操作を実行します。Then you can perform an alternate action if insufficient samples are present, without halting the automatic scaling evaluation.

サンプル、サンプルの割合、 GetSample() メソッドSamples, sample percentage, and the GetSample() method

タスクおよびリソースのメトリック データを取得し、そのデータに基づいてプールのサイズを調整することが、自動スケールの数式の主要な動作となります。The core operation of an autoscale formula is to obtain task and resource metric data and then adjust pool size based on that data. そのため、自動スケールの数式とメトリック データ (サンプル) とがどのように関与するのかをしっかりと把握しておくことが重要です。As such, it is important to have a clear understanding of how autoscale formulas interact with metrics data (samples).

サンプルSamples

Batch サービスでは、タスクおよびリソースのメトリックのサンプルを定期的に取得し、自動スケールの数式でこのサンプルを使用できるようにします。The Batch service periodically takes samples of task and resource metrics and makes them available to your autoscale formulas. これらのサンプルは 30 秒に 1 回、Batch サービスによって記録されます。These samples are recorded every 30 seconds by the Batch service. ただし通常、サンプルが記録されてからそれが自動スケールの数式で使用できるよう (読み取り可能) になるまでには、遅延が発生します。However, there is typically a delay between when those samples were recorded and when they are made available to (and can be read by) your autoscale formulas. さらに、ネットワークやその他のインフラストラクチャの問題など、さまざまな要因により、特定の間隔でサンプルが記録されない場合があります。Additionally, due to various factors such as network or other infrastructure issues, samples may not be recorded for a particular interval.

サンプルの割合Sample percentage

samplePercentGetSample() メソッドに渡したり、GetSamplePercent() メソッドを呼び出したりするときの "割合" とは、Batch サービスによって記録されるサンプルの最大合計数と、自動スケールの数式で使用できるサンプル数との比を示します。When samplePercent is passed to the GetSample() method or the GetSamplePercent() method is called, percent refers to a comparison between the total possible number of samples that are recorded by the Batch service and the number of samples that are available to your autoscale formula.

例として、10 分間の時間枠で説明します。Let's look at a 10-minute timespan as an example. サンプルは 30 秒ごとに記録されるため、10 分間の期間内に Batch によって記録されるサンプルの最大合計数は 20 サンプルとなります (1 分あたり 2 サンプル)。Because samples are recorded every 30 seconds within a 10-minute timespan, the maximum total number of samples that are recorded by Batch would be 20 samples (2 per minute). 一方、レポートの機構上必然的に伴う時間差や Azure 内の問題により、自動スケールの数式で読み取り可能なサンプル数が 15 にしか到達しない可能性もあります。However, due to the inherent latency of the reporting mechanism and other issues within Azure, there may be only 15 samples that are available to your autoscale formula for reading. このため、たとえばこの 10 分間に数式で使用可能なサンプル数は、記録されたサンプルの合計数の 75% に限られるということです。So, for example, for that 10-minute period, only 75% of the total number of samples recorded may be available to your formula.

GetSample() とサンプルの範囲GetSample() and sample ranges

プールの拡大と縮小は、自動スケールの数式に基づいてノードを追加したり削除したりすることによって行われます。Your autoscale formulas are going to be growing and shrinking your pools — adding nodes or removing nodes. ノードには金銭的コストが伴うため、数式には、十分なデータに基づいたインテリジェントな分析方法を用いる必要があります。Because nodes cost you money, you want to ensure that your formulas use an intelligent method of analysis that is based on sufficient data. このため、数式に傾向分析を取り入れ、Therefore, we recommend that you use a trending-type analysis in your formulas. 収集したサンプルの範囲に基づいて、プールの拡大と縮小を行うことをお勧めします。This type grows and shrinks your pools based on a range of collected samples.

そのためには、GetSample(interval look-back start, interval look-back end) を使用して、サンプルのベクターを返します。To do so, use GetSample(interval look-back start, interval look-back end) to return a vector of samples:

$runningTasksSample = $RunningTasks.GetSample(1 * TimeInterval_Minute, 6 * TimeInterval_Minute);

上記の行は Batch によって評価されると、値のベクターとしてサンプルの範囲を返します。When the above line is evaluated by Batch, it returns a range of samples as a vector of values. 例:For example:

$runningTasksSample=[1,1,1,1,1,1,1,1,1,1];

サンプルのベクターを収集したら、min()max()avg() などの関数を使用して、収集した範囲から有意な値を導き出すことができます。Once you've collected the vector of samples, you can then use functions like min(), max(), and avg() to derive meaningful values from the collected range.

セキュリティを強化するために、特定の期間に使用できるサンプルの割合が特定の値を下回る場合に、数式による評価が強制的に失敗になるように設定できます。For additional security, you can force a formula evaluation to fail if less than a certain sample percentage is available for a particular time period. 指定したサンプルの割合を使用できない場合は、数式の評価を強制的に失敗させることで、数式のそれ以上の評価を中止するように Batch に指示します。When you force a formula evaluation to fail, you instruct Batch to cease further evaluation of the formula if the specified percentage of samples is not available. この場合、プール サイズの変更は行われません。In this case, no change is made to the pool size. 評価を成功させるために必要なサンプルの割合を指定するには、その割合を 3 番目のパラメーターとして GetSample() に指定します。To specify a required percentage of samples for the evaluation to succeed, specify it as the third parameter to GetSample(). ここで、サンプルの 75% という要件は次のように指定します。Here, a requirement of 75 percent of samples is specified:

$runningTasksSample = $RunningTasks.GetSample(60 * TimeInterval_Second, 120 * TimeInterval_Second, 75);

サンプルの使用可用性には遅延があるため、時間範囲を指定する際には、常に、開始時間を 1 分より長く遡って指定することが重要です。Because there may be a delay in sample availability, it is important to always specify a time range with a look-back start time that is older than one minute. サンプルがシステムを介して伝達されるまで約 1 分かかるため、(0 * TimeInterval_Second, 60 * TimeInterval_Second) の範囲内のサンプルは使用できない場合があります。It takes approximately one minute for samples to propagate through the system, so samples in the range (0 * TimeInterval_Second, 60 * TimeInterval_Second) may not be available. ここでも、 GetSample() の割合パラメーターを使用することで、サンプルの割合に関する特定の要件を適用できます。Again, you can use the percentage parameter of GetSample() to force a particular sample percentage requirement.

重要

自動スケールの数式では " GetSample(1) にのみ依存する" ことは避けることを強くお勧めします。We strongly recommend that you avoid relying only on GetSample(1) in your autoscale formulas. 理由は、GetSample(1) は基本的には "どれほど前に取得したのかに関係なく、最後に取得したサンプルを渡す" よう Batch サービスに指示するためです。This is because GetSample(1) essentially says to the Batch service, "Give me the last sample you have, no matter how long ago you retrieved it." それは単一のサンプルであり、また以前のサンプルであるため、最近のタスクまたはリソースの状態を表す情報として十分でない可能性があります。Since it is only a single sample, and it may be an older sample, it may not be representative of the larger picture of recent task or resource state. GetSample(1)を使用する場合は、より大きなステートメントの一部であり、数式が依存する唯一のデータ ポイントになっていないことを確認してください。If you do use GetSample(1), make sure that it's part of a larger statement and not the only data point that your formula relies on.

メトリックMetrics

数式を定義するときは、リソースとタスクの両方のメトリックを使用できます。You can use both resource and task metrics when you're defining a formula. プール内の専用ノードの目標数は、収集して評価したメトリック データに基づいて調整します。You adjust the target number of dedicated nodes in the pool based on the metrics data that you obtain and evaluate. 各メトリックの詳細については、前述の「 変数 」をご覧ください。See the Variables section above for more information on each metric.

メトリックMetric 説明Description
リソースResource

リソース メトリックは、計算ノードの CPU、帯域幅、およびメモリの使用状況とノード数に基づくメトリックです。Resource metrics are based on the CPU, the bandwidth, the memory usage of compute nodes, and the number of nodes.

次のサービス定義の変数は、ノード数に基づいて調整を行う場合に有用です。These service-defined variables are useful for making adjustments based on node count:

  • $TargetDedicatedNodes$TargetDedicatedNodes
  • $TargetLowPriorityNodes$TargetLowPriorityNodes
  • $CurrentDedicatedNodes$CurrentDedicatedNodes
  • $CurrentLowPriorityNodes$CurrentLowPriorityNodes
  • $PreemptedNodeCount$PreemptedNodeCount
  • $SampleNodeCount$SampleNodeCount

次のサービス定義の変数は、ノード リソースの使用状況に基づいて調整を行う場合に有用です。These service-defined variables are useful for making adjustments based on node resource usage:

  • $CPUPercent$CPUPercent
  • $WallClockSeconds$WallClockSeconds
  • $MemoryBytes$MemoryBytes
  • $DiskBytes$DiskBytes
  • $DiskReadBytes$DiskReadBytes
  • $DiskWriteBytes$DiskWriteBytes
  • $DiskReadOps$DiskReadOps
  • $DiskWriteOps$DiskWriteOps
  • $NetworkInBytes$NetworkInBytes
  • $NetworkOutBytes$NetworkOutBytes

タスクTask

タスク メトリックは、タスクの状態 (アクティブ、保留中、完了) に基づくメトリックです。Task metrics are based on the status of tasks, such as Active, Pending, and Completed. 次のサービス定義の変数は、タスク メトリックに基づいてプールのサイズを調整する場合に有用です。The following service-defined variables are useful for making pool-size adjustments based on task metrics:

  • $ActiveTasks$ActiveTasks
  • $RunningTasks$RunningTasks
  • $PendingTasks$PendingTasks
  • $SucceededTasks$SucceededTasks
  • $FailedTasks$FailedTasks

自動スケールの数式の記述Write an autoscale formula

自動スケールの数式は、これまでに挙げたさまざまな要素を使ってステートメントを記述し、それらを 1 つの数式として組み合わせることで作成します。You build an autoscale formula by forming statements that use the above components, then combine those statements into a complete formula. このセクションでは、実際にスケールを実行できる、自動スケールの数式のサンプルを作成します。In this section, we create an example autoscale formula that can perform some real-world scaling decisions.

まず、新しい自動スケールの数式の要件を定義します。First, let's define the requirements for our new autoscale formula. 数式の要件は次のようになります。The formula should:

  1. CPU 使用率が高い場合、プール内の専用計算ノードの目標数を増やす。Increase the target number of dedicated compute nodes in a pool if CPU usage is high.
  2. CPU 使用率が低い場合、プール内の専用計算ノードの目標数を減らす。Decrease the target number of dedicated compute nodes in a pool when CPU usage is low.
  3. 常に専用ノードの最大数を 400 までに制限する。Always restrict the maximum number of dedicated nodes to 400.

CPU 使用率が高いときにノード数を増やすには、過去 10 分間の平均 CPU 使用率の最小値が 70% を超えた場合にのみ、ユーザー定義変数 ($totalDedicatedNodes) を専用ノードの現在の目標数の 110% の値に設定するステートメントを定義します。To increase the number of nodes during high CPU usage, define the statement that populates a user-defined variable ($totalDedicatedNodes) with a value that is 110 percent of the current target number of dedicated nodes, but only if the minimum average CPU usage during the last 10 minutes was above 70 percent. それ以外の場合は、専用ノードの現在の数の値を使用します。Otherwise, use the value for the current number of dedicated nodes.

$totalDedicatedNodes =
    (min($CPUPercent.GetSample(TimeInterval_Minute * 10)) > 0.7) ?
    ($CurrentDedicatedNodes * 1.1) : $CurrentDedicatedNodes;

CPU 使用率が低いときに専用ノードの数を "減らす" には、数式の次のステートメントで、過去 60 分間の平均 CPU 使用率が 20% を下回る場合に、同じ $totalDedicatedNodes 変数を専用ノードの現在の目標数の 90% に設定します。To decrease the number of dedicated nodes during low CPU usage, the next statement in our formula sets the same $totalDedicatedNodes variable to 90 percent of the current target number of dedicated nodes if the average CPU usage in the past 60 minutes was under 20 percent. 20% を下回らない場合は、上記のステートメントに入力した $totalDedicatedNodes の現在の値を使用します。Otherwise, use the current value of $totalDedicatedNodes that we populated in the statement above.

$totalDedicatedNodes =
    (avg($CPUPercent.GetSample(TimeInterval_Minute * 60)) < 0.2) ?
    ($CurrentDedicatedNodes * 0.9) : $totalDedicatedNodes;

ここでは、専用計算ノードの目標数を最大 400 に制限しています。Now limit the target number of dedicated compute nodes to a maximum of 400:

$TargetDedicatedNodes = min(400, $totalDedicatedNodes)

完全な数式を次に示します。Here's the complete formula:

$totalDedicatedNodes =
    (min($CPUPercent.GetSample(TimeInterval_Minute * 10)) > 0.7) ?
    ($CurrentDedicatedNodes * 1.1) : $CurrentDedicatedNodes;
$totalDedicatedNodes =
    (avg($CPUPercent.GetSample(TimeInterval_Minute * 60)) < 0.2) ?
    ($CurrentDedicatedNodes * 0.9) : $totalDedicatedNodes;
$TargetDedicatedNodes = min(400, $totalDedicatedNodes)

Batch の SDK で自動スケーリング対応のプールを作成するCreate an autoscale-enabled pool with Batch SDKs

プールの自動スケーリングは、Batch の SDKBatch REST APIBatch PowerShell コマンドレットBatch CLI を使用して構成できます。Pool autoscaling can be configured using any of the Batch SDKs, the Batch REST API Batch PowerShell cmdlets, and the Batch CLI. このセクションでは、.NET と Python の両方の例を紹介します。In this section, you can see examples for both .NET and Python.

.NET.NET

.NET で自動スケール対応のプールを作成するには、次の手順を実行します。To create a pool with autoscaling enabled in .NET, follow these steps:

  1. BatchClient.PoolOperations.CreatePool でプールを作成します。Create the pool with BatchClient.PoolOperations.CreatePool.
  2. CloudPool.AutoScaleEnabled プロパティを true に設定します。Set the CloudPool.AutoScaleEnabled property to true.
  3. CloudPool.AutoScaleFormula プロパティを自動スケールの数式で設定します。Set the CloudPool.AutoScaleFormula property with your autoscale formula.
  4. (省略可能) CloudPool.AutoScaleEvaluationInterval プロパティを設定します (既定では 15 分)。(Optional) Set the CloudPool.AutoScaleEvaluationInterval property (default is 15 minutes).
  5. CloudPool.Commit または CommitAsync で、プールをコミットします。Commit the pool with CloudPool.Commit or CommitAsync.

次のコード スニペットを使用すると、.NET で自動スケール対応のプールを作成できます。The following code snippet creates an autoscale-enabled pool in .NET. このプールでは、自動スケールの数式によって、専用ノードの目標数を月曜日は 5 に、それ以外の曜日は 1 に設定しています。The pool's autoscale formula sets the target number of dedicated nodes to 5 on Mondays, and 1 on every other day of the week. 自動スケールの間隔は、30 分に設定されます。The automatic scaling interval is set to 30 minutes. 次に示す C# スニペットまたはこの記事で示すその他の C# スニペットでは、myBatchClient は適切に初期化された BatchClient クラスのインスタンスです。In this and the other C# snippets in this article, myBatchClient is a properly initialized instance of the BatchClient class.

CloudPool pool = myBatchClient.PoolOperations.CreatePool(
                    poolId: "mypool",
                    virtualMachineSize: "standard_d1_v2",
                    cloudServiceConfiguration: new CloudServiceConfiguration(osFamily: "5"));    
pool.AutoScaleEnabled = true;
pool.AutoScaleFormula = "$TargetDedicatedNodes = (time().weekday == 1 ? 5:1);";
pool.AutoScaleEvaluationInterval = TimeSpan.FromMinutes(30);
await pool.CommitAsync();

重要

自動スケール対応のプールを作成する際には、CreatePool の呼び出しに targetDedicatedNodes パラメーターや targetLowPriorityNodes パラメーターを指定しないでください。When you create an autoscale-enabled pool, do not specify the targetDedicatedNodes parameter or the targetLowPriorityNodes parameter on the call to CreatePool. 代わりに、プールの AutoScaleEnabled プロパティと AutoScaleFormula プロパティを指定します。Instead, specify the AutoScaleEnabled and AutoScaleFormula properties on the pool. これらのプロパティの値は各種類のノードの目標数を決定します。The values for these properties determine the target number of each type of node. また、自動スケール対応のプールのサイズを手動で変更する場合 (BatchClient.PoolOperations.ResizePoolAsync など)、最初にプールで自動スケールを無効にしてから、プールのサイズを変更する必要があります。Also, to manually resize an autoscale-enabled pool (for example, with BatchClient.PoolOperations.ResizePoolAsync), first disable automatic scaling on the pool, then resize it.

自動スケールの間隔Automatic scaling interval

既定では、Batch サービスは自動スケールの数式に従って 15 分ごとにプールのサイズを調整します。By default, the Batch service adjusts a pool's size according to its autoscale formula every 15 minutes. この間隔は、次のプール プロパティを使用して構成できます。This interval is configurable by using the following pool properties:

間隔の最小値は 5 分、最大値は 168 時間です。The minimum interval is five minutes, and the maximum is 168 hours. この範囲外の間隔が指定されると、Batch サービスは「正しくない要求 (400)」エラーを返します。If an interval outside this range is specified, the Batch service returns a Bad Request (400) error.

注意

現行の自動スケール機能は、1 分以内に起こった変化に対応するというよりは、ワークロードを実行する過程でプールのサイズを少しずつ調整することを意図しています。Autoscaling is not currently intended to respond to changes in less than a minute, but rather is intended to adjust the size of your pool gradually as you run a workload.

PythonPython

同様に、自動スケーリング対応のプールを Python SDK で作成できます。Similarly, you can make an autoscale-enabled pool with the Python SDK by:

  1. プールを作成してその構成を指定します。Create a pool and specify its configuration.
  2. サービス クライアントにプールを追加します。Add the pool to the service client.
  3. 作成した数式でプールの自動スケーリングを有効にします。Enable autoscale on the pool with a formula you write.
# Create a pool; specify configuration
new_pool = batch.models.PoolAddParameter(
    id="autoscale-enabled-pool",
    virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
        image_reference=batchmodels.ImageReference(
          publisher="Canonical",
          offer="UbuntuServer",
          sku="18.04-LTS",
          version="latest"
            ),
        node_agent_sku_id="batch.node.ubuntu 18.04"),
    vm_size="STANDARD_D1_v2",
    target_dedicated_nodes=0,
    target_low_priority_nodes=0
)
batch_service_client.pool.add(new_pool) # Add the pool to the service client

formula = """$curTime = time();
             $workHours = $curTime.hour >= 8 && $curTime.hour < 18; 
             $isWeekday = $curTime.weekday >= 1 && $curTime.weekday <= 5; 
             $isWorkingWeekdayHour = $workHours && $isWeekday; 
             $TargetDedicated = $isWorkingWeekdayHour ? 20:10;""";

# Enable autoscale; specify the formula
response = batch_service_client.pool.enable_auto_scale(pool_id, auto_scale_formula=formula,
                                            auto_scale_evaluation_interval=datetime.timedelta(minutes=10), 
                                            pool_enable_auto_scale_options=None, 
                                            custom_headers=None, raw=False)

ヒント

その他の Python SDK の使用例については、GitHub の Batch Python クイックスタート リポジトリを参照してください。More examples of using the Python SDK can be found in the Batch Python Quickstart repository on GitHub.

既存のプールでの自動スケールの有効化Enable autoscaling on an existing pool

各 Batch SDK には自動スケールを有効にする方法が用意されています。Each Batch SDK provides a way to enable autoscaling. 例:For example:

既存のプールで自動スケールを有効にする際には、次の点に注意してください。When you enable autoscaling on an existing pool, keep in mind the following points:

  • 自動スケールを有効にする要求を発行するときにプールの自動スケールが無効になっている場合、要求の発行時に有効な自動スケールの数式を指定する必要があります。If automatic scaling is currently disabled on the pool when you issue the request to enable autoscaling, you must specify a valid autoscale formula when you issue the request. 必要に応じて、自動スケール評価の間隔を指定できます。You can optionally specify an autoscale evaluation interval. 指定しない場合、間隔は既定の値である 15 分になります。If you do not specify an interval, the default value of 15 minutes is used.

  • プールの自動スケールが現在有効になっている場合、自動スケールの数式、評価の間隔、またはその両方を指定できます。If autoscale is currently enabled on the pool, you can specify an autoscale formula, an evaluation interval, or both. これらのプロパティの 1 つ以上を指定する必要があります。You must specify at least one of these properties.

    • 自動スケール評価の間隔を新しく指定すると、既存の評価スケジュールが停止し、新しいスケジュールが開始します。If you specify a new autoscale evaluation interval, then the existing evaluation schedule is stopped and a new schedule is started. 新しいスケジュールの開始時刻は、自動スケールを有効にする要求を発行した時間です。The new schedule's start time is the time at which the request to enable autoscaling was issued.
    • 自動スケールの数式と評価の間隔のいずれかを省略すると、引き続き Batch サービスではその設定の現在の値が使用されます。If you omit either the autoscale formula or evaluation interval, the Batch service continues to use the current value of that setting.

注意

.NET でプールを作成したときに CreatePool メソッドの targetDedicatedNodes パラメーターと targetLowPriorityNodes パラメーターの値を指定した、または別の言語の同等のパラメーターを指定した場合、自動スケールの数式が評価されるときにそれらの値は無視されます。If you specified values for the targetDedicatedNodes or targetLowPriorityNodes parameters of the CreatePool method when you created the pool in .NET, or for the comparable parameters in another language, then those values are ignored when the automatic scaling formula is evaluated.

この C# コード スニペットでは、Batch .NET ライブラリを使用し、既存のプールで自動スケールを有効にします。This C# code snippet uses the Batch .NET library to enable autoscaling on an existing pool:

// Define the autoscaling formula. This formula sets the target number of nodes
// to 5 on Mondays, and 1 on every other day of the week
string myAutoScaleFormula = "$TargetDedicatedNodes = (time().weekday == 1 ? 5:1);";

// Set the autoscale formula on the existing pool
await myBatchClient.PoolOperations.EnableAutoScaleAsync(
    "myexistingpool",
    autoscaleFormula: myAutoScaleFormula);

自動スケールの数式の更新Update an autoscale formula

既存の自動スケール対応のプールの数式を更新するには、新しい数式で自動スケールを再度有効にする操作を呼び出します。To update the formula on an existing autoscale-enabled pool, call the operation to enable autoscaling again with the new formula. たとえば、次の .NET コードの実行時に myexistingpool で自動スケールが既に有効になっている場合、自動スケールの数式は、myNewFormula の内容に置き換わります。For example, if autoscaling is already enabled on myexistingpool when the following .NET code is executed, its autoscale formula is replaced with the contents of myNewFormula.

await myBatchClient.PoolOperations.EnableAutoScaleAsync(
    "myexistingpool",
    autoscaleFormula: myNewFormula);

自動スケールの間隔の更新Update the autoscale interval

既存の自動スケール対応のプールの自動スケールの評価間隔を更新するには、新しい間隔で自動スケールを再度有効にする操作を呼び出します。To update the autoscale evaluation interval of an existing autoscale-enabled pool, call the operation to enable autoscaling again with the new interval. たとえば、既に自動スケールが有効なプールについて、自動スケール評価の間隔を 60 分に設定する場合、次のようになります。For example, to set the autoscale evaluation interval to 60 minutes for a pool that's already autoscale-enabled in .NET:

await myBatchClient.PoolOperations.EnableAutoScaleAsync(
    "myexistingpool",
    autoscaleEvaluationInterval: TimeSpan.FromMinutes(60));

自動スケールの数式の評価Evaluate an autoscale formula

プールに適用する前に数式を評価できます。You can evaluate a formula before applying it to a pool. これにより、数式をテストしてステートメントの評価を確認してから、数式を運用環境で使用することができます。In this way, you can test the formula to see how its statements evaluate before you put the formula into production.

自動スケールの数式を評価するにはまず、有効な数式を使用して、プールの自動スケールを有効にする必要があります。To evaluate an autoscale formula, you must first enable autoscaling on the pool with a valid formula. 自動スケールをまだ有効にしていないプールで数式をテストするには、初めて自動スケールを有効にするときに、1 行の数式 $TargetDedicatedNodes = 0 を使用します。To test a formula on a pool that doesn't yet have autoscaling enabled, use the one-line formula $TargetDedicatedNodes = 0 when you first enable autoscaling. その後、次のいずれかを使用してテスト対象の数式を評価します。Then, use one of the following to evaluate the formula you want to test:

この Batch .NET コード スニペットで、自動スケールの数式を評価します。In this Batch .NET code snippet, we evaluate an autoscale formula. プールで自動スケールが有効になっていない場合、先に有効にします。If the pool does not have autoscaling enabled, we enable it first.

// First obtain a reference to an existing pool
CloudPool pool = await batchClient.PoolOperations.GetPoolAsync("myExistingPool");

// If autoscaling isn't already enabled on the pool, enable it.
// You can't evaluate an autoscale formula on non-autoscale-enabled pool.
if (pool.AutoScaleEnabled == false)
{
    // We need a valid autoscale formula to enable autoscaling on the
    // pool. This formula is valid, but won't resize the pool:
    await pool.EnableAutoScaleAsync(
        autoscaleFormula: "$TargetDedicatedNodes = $CurrentDedicatedNodes;",
        autoscaleEvaluationInterval: TimeSpan.FromMinutes(5));

    // Batch limits EnableAutoScaleAsync calls to once every 30 seconds.
    // Because we want to apply our new autoscale formula below if it
    // evaluates successfully, and we *just* enabled autoscaling on
    // this pool, we pause here to ensure we pass that threshold.
    Thread.Sleep(TimeSpan.FromSeconds(31));

    // Refresh the properties of the pool so that we've got the
    // latest value for AutoScaleEnabled
    await pool.RefreshAsync();
}

// We must ensure that autoscaling is enabled on the pool prior to
// evaluating a formula
if (pool.AutoScaleEnabled == true)
{
    // The formula to evaluate - adjusts target number of nodes based on
    // day of week and time of day
    string myFormula = @"
        $curTime = time();
        $workHours = $curTime.hour >= 8 && $curTime.hour < 18;
        $isWeekday = $curTime.weekday >= 1 && $curTime.weekday <= 5;
        $isWorkingWeekdayHour = $workHours && $isWeekday;
        $TargetDedicatedNodes = $isWorkingWeekdayHour ? 20:10;
    ";

    // Perform the autoscale formula evaluation. Note that this code does not
    // actually apply the formula to the pool.
    AutoScaleRun eval =
        await batchClient.PoolOperations.EvaluateAutoScaleAsync(pool.Id, myFormula);

    if (eval.Error == null)
    {
        // Evaluation success - print the results of the AutoScaleRun.
        // This will display the values of each variable as evaluated by the
        // autoscale formula.
        Console.WriteLine("AutoScaleRun.Results: " +
            eval.Results.Replace("$", "\n    $"));

        // Apply the formula to the pool since it evaluated successfully
        await batchClient.PoolOperations.EnableAutoScaleAsync(pool.Id, myFormula);
    }
    else
    {
        // Evaluation failed, output the message associated with the error
        Console.WriteLine("AutoScaleRun.Error.Message: " +
            eval.Error.Message);
    }
}

数式が正しく評価されると、このコード スニペットには次のような結果が表示されます。Successful evaluation of the formula shown in this code snippet produces results similar to:

AutoScaleRun.Results:
    $TargetDedicatedNodes=10;
    $NodeDeallocationOption=requeue;
    $curTime=2016-10-13T19:18:47.805Z;
    $isWeekday=1;
    $isWorkingWeekdayHour=0;
    $workHours=0

自動スケールの実行に関する情報の取得Get information about autoscale runs

数式が正常に実行されるように、Batch によってプールで行われる自動スケールの実行の結果を、定期的に確認することをお勧めします。To ensure that your formula is performing as expected, we recommend that you periodically check the results of the autoscaling runs that Batch performs on your pool. これを行うには、プールへの参照を取得 (または更新) し、最後に行われた自動スケールの実行のプロパティを確認します。To do so, get (or refresh) a reference to the pool, and examine the properties of its last autoscale run.

Batch .NET の場合、プールで行われた最近の自動スケールの実行に関する情報は、CloudPool.AutoScaleRun プロパティ内のいくつかのプロパティに含まれています。In Batch .NET, the CloudPool.AutoScaleRun property has several properties that provide information about the latest automatic scaling run performed on the pool:

REST API の場合、プールに関する情報を取得する要求によって、プールに関する情報が返されます。この情報の autoScaleRun プロパティに、最新の自動スケールの実行に関する情報が含まれています。In the REST API, the Get information about a pool request returns information about the pool, which includes the latest automatic scaling run information in the autoScaleRun property.

次の C# コード スニペットでは、Batch .NET ライブラリを使用して、プール "myPool" の最新の自動スケール実行に関する情報を出力します。The following C# code snippet uses the Batch .NET library to print information about the last autoscaling run on pool myPool:

await Cloud pool = myBatchClient.PoolOperations.GetPoolAsync("myPool");
Console.WriteLine("Last execution: " + pool.AutoScaleRun.Timestamp);
Console.WriteLine("Result:" + pool.AutoScaleRun.Results.Replace("$", "\n  $"));
Console.WriteLine("Error: " + pool.AutoScaleRun.Error);

上記のスニペットのサンプル出力は、次のようになります。Sample output of the preceding snippet:

Last execution: 10/14/2016 18:36:43
Result:
  $TargetDedicatedNodes=10;
  $NodeDeallocationOption=requeue;
  $curTime=2016-10-14T18:36:43.282Z;
  $isWeekday=1;
  $isWorkingWeekdayHour=0;
  $workHours=0
Error:

自動スケールの数式の例Example autoscale formulas

さまざまな方法でプールのコンピューティング リソースの量を調整する、いくつかの数式を見ていきます。Let's look at a few formulas that show different ways to adjust the amount of compute resources in a pool.

例 1:時間ベースの調整Example 1: Time-based adjustment

曜日や時間帯でプール サイズを調整する必要があるとします。Suppose you want to adjust the pool size based on the day of the week and time of day. この例では、状況に応じてプールのノード数を増減させる方法を示します。This example shows how to increase or decrease the number of nodes in the pool accordingly.

数式は、最初に現在の時刻を取得します。The formula first obtains the current time. 平日 (1 ~ 5) および稼働時間 (午前 8 時~午後 6 時) 内の場合、目標のプール サイズは 20 のノードに設定されます。If it's a weekday (1-5) and within working hours (8 AM to 6 PM), the target pool size is set to 20 nodes. その他の場合、プール サイズは 10 ノードに設定されます。Otherwise, it's set to 10 nodes.

$curTime = time();
$workHours = $curTime.hour >= 8 && $curTime.hour < 18;
$isWeekday = $curTime.weekday >= 1 && $curTime.weekday <= 5;
$isWorkingWeekdayHour = $workHours && $isWeekday;
$TargetDedicatedNodes = $isWorkingWeekdayHour ? 20:10;

例 2:タスクベースの調整Example 2: Task-based adjustment

この例では、プールのサイズはキューのタスク数に基づいて調整されます。In this example, the pool size is adjusted based on the number of tasks in the queue. 数式の文字列にはコメントと改行の両方を使用できます。Both comments and line breaks are acceptable in formula strings.

// Get pending tasks for the past 15 minutes.
$samples = $ActiveTasks.GetSamplePercent(TimeInterval_Minute * 15);
// If we have fewer than 70 percent data points, we use the last sample point,
// otherwise we use the maximum of last sample point and the history average.
$tasks = $samples < 70 ? max(0,$ActiveTasks.GetSample(1)) : max( $ActiveTasks.GetSample(1), avg($ActiveTasks.GetSample(TimeInterval_Minute * 15)));
// If number of pending tasks is not 0, set targetVM to pending tasks, otherwise
// half of current dedicated.
$targetVMs = $tasks > 0? $tasks:max(0, $TargetDedicatedNodes/2);
// The pool size is capped at 20, if target VM value is more than that, set it
// to 20. This value should be adjusted according to your use case.
$TargetDedicatedNodes = max(0, min($targetVMs, 20));
// Set node deallocation mode - keep nodes active only until tasks finish
$NodeDeallocationOption = taskcompletion;

例 3:並列タスクの説明Example 3: Accounting for parallel tasks

この例では、タスクの数に基づいてプール サイズを調整します。This example adjusts the pool size based on the number of tasks. また、この数式では、プールに設定されている MaxTasksPerComputeNode 値が考慮されます。This formula also takes into account the MaxTasksPerComputeNode value that has been set for the pool. このアプローチは、プールで並列タスクの実行が有効になっている場合に便利です。This approach is useful in situations where parallel task execution has been enabled on your pool.

// Determine whether 70 percent of the samples have been recorded in the past
// 15 minutes; if not, use last sample
$samples = $ActiveTasks.GetSamplePercent(TimeInterval_Minute * 15);
$tasks = $samples < 70 ? max(0,$ActiveTasks.GetSample(1)) : max( $ActiveTasks.GetSample(1),avg($ActiveTasks.GetSample(TimeInterval_Minute * 15)));
// Set the number of nodes to add to one-fourth the number of active tasks (the
// MaxTasksPerComputeNode property on this pool is set to 4, adjust this number
// for your use case)
$cores = $TargetDedicatedNodes * 4;
$extraVMs = (($tasks - $cores) + 3) / 4;
$targetVMs = ($TargetDedicatedNodes + $extraVMs);
// Attempt to grow the number of compute nodes to match the number of active
// tasks, with a maximum of 3
$TargetDedicatedNodes = max(0,min($targetVMs,3));
// Keep the nodes active until the tasks finish
$NodeDeallocationOption = taskcompletion;

例 4:初期のプール サイズの設定Example 4: Setting an initial pool size

この例は、最初の期間におけるプール サイズを特定のノード数に設定する、自動スケールの数式を使用した C# コード スニペットを示します。This example shows a C# code snippet with an autoscale formula that sets the pool size to a specified number of nodes for an initial time period. この例では、最初の期間はプール サイズを特定のノード数に設定し、最初の期間が経過した後は、実行中のアクティブなタスク数に基づいてプール サイズを調整します。Then it adjusts the pool size based on the number of running and active tasks after the initial time period has elapsed.

次のコード スニペットの数式では、The formula in the following code snippet:

  • 最初のプール サイズを 4 ノードに設定しています。Sets the initial pool size to four nodes.
  • プールのライフサイクルの最初の 10 分間は、プール サイズを調整しません。Does not adjust the pool size within the first 10 minutes of the pool's lifecycle.
  • 10 分経過した後は、過去 60 分間の実行中でアクティブなタスク数の最大値を取得します。After 10 minutes, obtains the max value of the number of running and active tasks within the past 60 minutes.
    • 両方の値が 0 の場合は (過去 60 分間に実行中またはアクティブなタスクがないことを示します)、プール サイズは 0 に設定されます。If both values are 0 (indicating that no tasks were running or active in the last 60 minutes), the pool size is set to 0.
    • いずれかの値が 0 よりも大きい場合は、変更されません。If either value is greater than zero, no change is made.
string now = DateTime.UtcNow.ToString("r");
string formula = string.Format(@"
    $TargetDedicatedNodes = {1};
    lifespan         = time() - time(""{0}"");
    span             = TimeInterval_Minute * 60;
    startup          = TimeInterval_Minute * 10;
    ratio            = 50;

    $TargetDedicatedNodes = (lifespan > startup ? (max($RunningTasks.GetSample(span, ratio), $ActiveTasks.GetSample(span, ratio)) == 0 ? 0 : $TargetDedicatedNodes) : {1});
    ", now, 4);

次の手順Next steps

  • 同時実行ノード タスクで Azure Batch コンピューティング リソースの使用率を最大にする 」では、プール内のコンピューティング ノードで複数のタスクを同時に実行する方法の詳細を説明しています。Maximize Azure Batch compute resource usage with concurrent node tasks contains details about how you can execute multiple tasks simultaneously on the compute nodes in your pool. 自動スケール以外にも、この機能は一部のワークロードのジョブの実行時間短縮に役立つことがあり、費用の節約になります。In addition to autoscaling, this feature may help to lower job duration for some workloads, saving you money.
  • 他にも、効率を上げるために、Batch アプリケーションによって、最適な方法で Batch サービスが照会されていることを確認してください。For another efficiency booster, ensure that your Batch application queries the Batch service in the most optimal way. 数千に上る可能性のある計算ノードやタスクの状態を照会するときに、送信されるデータの量を制限する方法について詳しくは、効率的な Azure Batch サービスのクエリに関する記事をご覧ください。See Query the Azure Batch service efficiently to learn how to limit the amount of data that crosses the wire when you query the status of potentially thousands of compute nodes or tasks.