通过按状态对任务和节点进行计数来监视 Batch 解决方案

若要监视和管理大规模 Azure Batch 解决方案,可能需要确定处于各种状态的资源计数。 Azure Batch 提供有效的操作来获取 Batch 任务和计算节点的计数。 可使用这些操作而不是可能非常耗时的列表查询来返回大型任务或节点集合的详细信息。

  • 获取任务计数可以获取一个作业中处于“活动”、“正在运行”和“已完成”状态的任务以及处于“已成功”或“已失败”状态的任务的聚合计数。 通过对处于每个状态的任务进行计数,可以更轻松地向用户显示作业进度,或检测可能影响作业的意外延迟或失败。

  • 列出池节点计数 获取各个池中专用计算节点在各种状态下的数量:创建中、空闲中、脱机、被抢占、正在重启、重新映像、启动中等。 通过计算每个状态中的节点数,可以确定何时有足够的计算资源来运行作业,并识别池的潜在问题。

请注意,有时这些操作返回的数字可能不是最新的。 如果需要确保计数准确,请使用列表查询对这些资源进行计数。 通过列表查询,还可以获取有关其他 Batch 资源(如应用程序)的信息。 有关将筛选器应用于列表查询的详细信息,请参阅 创建查询以高效列出 Batch 资源

任务状态计数

Get任务计数”操作按以下状态进行任务计数:

  • 活动:已排队且已准备好运行但当前未分配给任何计算节点的任务。 如果任务所active尚未完成,则该任务也处于 状态。
  • 正在运行:已分配给计算节点但尚未完成的任务。 当任务状态为 runningpreparing 时,将它视为 running,正如 Get 有关任务的信息操作所示。
  • 已完成:不再有资格运行的任务,因为它已成功完成,或者未成功完成,并且也耗尽了重试限制。
  • 成功:任务执行结果为 success的任务。 Batch 通过检查 TaskExecutionResultexecutionInfo 属性的属性来确定任务是成功还是失败。
  • 失败:任务执行结果为 failure的任务。

以下 .NET 代码示例演示如何按状态检索任务计数。

var taskCounts = await batchClient.JobOperations.GetJobTaskCountsAsync("job-1");

Console.WriteLine("Task count in active state: {0}", taskCounts.Active);
Console.WriteLine("Task count in preparing or running state: {0}", taskCounts.Running);
Console.WriteLine("Task count in completed state: {0}", taskCounts.Completed);
Console.WriteLine("Succeeded task count: {0}", taskCounts.Succeeded);
Console.WriteLine("Failed task count: {0}", taskCounts.Failed);

可以对 REST 和支持的其他语言使用类似的模式获取作业的任务计数。

节点状态计数

“列出池节点计数”操作按以下状态对每个池中的计算节点进行计数。 为每个池中的专用节点提供单独的统计计数。

  • 创建:尚未开始加入到池中的由 Azure 分配的虚拟机。
  • 空闲:可用且当前未运行任何任务的计算节点。
  • LeavingPool:一个退出资源池的节点,要么是因为用户显式移除该节点,要么是因为资源池正在调整大小或自动缩减。
  • 脱机:无法用于 Batch 新任务调度的节点。
  • 正在重启:正在重启的节点。
  • 重装:正在重新安装操作系统的节点。
  • 正在运行 :运行一个或多个任务的节点(而不是启动任务)。
  • 正在启动:Batch 服务正在启动的节点。
  • StartTaskFailed:在所有重试之后,启动任务仍失败,并且 waitForSuccess 已启用的节点。 此节点无法运行任务。
  • 未知:与 Batch 服务失去联系的节点,其状态未知。
  • 不可用:由于错误,无法用于任务执行的节点。
  • WaitingForStartTask:运行启动任务的节点,但 waitForSuccess 已启用且尚未完成。

以下 C# 代码片段演示如何列出当前帐户中所有池的节点计数:

foreach (var nodeCounts in batchClient.PoolOperations.ListPoolNodeCounts())
{
    Console.WriteLine("Pool Id: {0}", nodeCounts.PoolId);

    Console.WriteLine("Total dedicated node count: {0}", nodeCounts.Dedicated.Total);

    // Get dedicated node counts in Idle and Offline states; you can get additional states.
    Console.WriteLine("Dedicated node count in Idle state: {0}", nodeCounts.Dedicated.Idle);
    Console.WriteLine("Dedicated node count in Offline state: {0}", nodeCounts.Dedicated.Offline);

}

以下 C# 代码片段演示如何列出当前帐户中给定池的节点计数。

foreach (var nodeCounts in batchClient.PoolOperations.ListPoolNodeCounts(new ODATADetailLevel(filterClause: "poolId eq 'testpool'")))
{
    Console.WriteLine("Pool Id: {0}", nodeCounts.PoolId);

    Console.WriteLine("Total dedicated node count: {0}", nodeCounts.Dedicated.Total);

    // Get dedicated node counts in Idle and Offline states; you can get additional states.
    Console.WriteLine("Dedicated node count in Idle state: {0}", nodeCounts.Dedicated.Idle);
    Console.WriteLine("Dedicated node count in Offline state: {0}", nodeCounts.Dedicated.Offline);

}

可以对 REST 和其他支持的语言使用类似的模式来获取池的节点计数。

后续步骤