你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
若要监视和管理大规模 Azure Batch 解决方案,可能需要确定处于各种状态的资源计数。 Azure Batch 提供有效的操作来获取 Batch 任务和计算节点的计数。 可使用这些操作而不是可能非常耗时的列表查询来返回大型任务或节点集合的详细信息。
获取任务计数可以获取一个作业中处于“活动”、“正在运行”和“已完成”状态的任务以及处于“已成功”或“已失败”状态的任务的聚合计数。 通过对处于每个状态的任务进行计数,可以轻松地向用户显示作业进度,或检测可能影响作业的意外延迟或失败。
列出池节点计数获取每个池中处于不同状态(“正在创建”、“空闲”、“脱机”、“已占用”、“正在重启”、“正在重置映像”、“正在启动”、“其他”)的专用和现成计算节点的数目。 通过计算每个状态中的节点数,可以确定何时有足够的计算资源来运行作业,并识别池的潜在问题。
有时,这些操作返回的数据可能不是最新的。 如果需要确保计数准确,请使用列表查询对这些资源进行计数。 通过列表查询,还可以获取有关其他 Batch 资源(如应用程序)的信息。 有关将筛选器应用于列表查询的详细信息,请参阅 创建查询以高效列出 Batch 资源。
任务状态计数
“Get
任务计数”操作按以下状态进行任务计数:
- 活动:已排队且已准备好运行但当前未分配给任何计算节点的任务。 如果任务所依赖的父任务尚未完成,则该任务也处于
active
状态。 - 正在运行:已分配给计算节点但尚未完成的任务。 当任务状态为
preparing
或running
时,将它视为running
,正如Get
有关任务的信息操作所示。 - 已完成:不再有资格运行的任务,因为它已成功完成,或者未成功完成,并且也耗尽了重试限制。
- 成功:任务执行结果为
success
的任务。 Batch 通过检查TaskExecutionResult
executionInfo 属性的属性来确定任务是成功还是失败。 - 失败:任务执行结果为
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 和支持的其他语言使用类似的模式获取作业的任务计数。
节点状态计数
“列出池节点计数”操作按以下状态对每个池中的计算节点进行计数。 会对每个池中的专用节点和现成节点进行单独的聚合计数。
- Creating:Azure 分配的 VM 尚未开始加入池。
- 空闲:可用且当前未运行任何任务的计算节点。
- LeavingPool:一个退出资源池的节点,要么是因为用户显式移除该节点,要么是因为资源池正在调整大小或自动缩减。
- 脱机:无法用于 Batch 新任务调度的节点。
- Preempted:由于 Azure 回收了 VM,现成节点从池中删除。 如果系统提供替代性的现成 VM 容量,则
preempted
节点可以重新初始化。 - 正在重启:正在重启的节点。
- 重装:正在重新安装操作系统的节点。
- 正在运行 :运行一个或多个任务的节点(而不是启动任务)。
- 正在启动: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);
Console.WriteLine("Total Spot node count: {0}", nodeCounts.LowPriority.Total);
// Get Spot node counts in Running and Preempted states; you can get additional states.
Console.WriteLine("Spot node count in Running state: {0}", nodeCounts.LowPriority.Running);
Console.WriteLine("Spot node count in Preempted state: {0}", nodeCounts.LowPriority.Preempted);
}
以下 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);
Console.WriteLine("Total Spot node count: {0}", nodeCounts.LowPriority.Total);
// Get Spot node counts in Running and Preempted states; you can get additional states.
Console.WriteLine("Spot node count in Running state: {0}", nodeCounts.LowPriority.Running);
Console.WriteLine("Spot node count in Preempted state: {0}", nodeCounts.LowPriority.Preempted);
}
可以对 REST 和其他支持的语言使用类似的模式来获取池的节点计数。
后续步骤
- 了解 Batch 服务工作流和主要资源,例如池、节点、作业和任务。
- 了解如何将筛选器应用于列出 Batch 资源的查询,请参阅 “创建查询以高效列出 Batch 资源”。