如何以编程方式获取 Azure Batch 节点中的核心数?
How can I programmatically get the number of cores in an Azure Batch Node?
我们正在使用 Azure Batch 服务来 运行 一些计算引擎代码,我们在创建池时指定 VM 的大小:
var pool = batchClient.PoolOperations.CreatePool(poolId: $"{PoolIdPrefix}-{poolGuid}", virtualMachineSize: "STANDARD_G4", cloudServiceConfiguration: new CloudServiceConfiguration(osFamily: "4"), targetDedicatedComputeNodes: 31, targetLowPriorityComputeNodes: 0);
注意:targetDedicatedComputeNodes
目前是硬编码的,但一旦解决此问题就会更改。
使用它,我们决定虚拟机大小,在本例中,恰好有 16 个内核。
问题是,在执行此代码之前,我们需要检查当前存在的池并计算(或者最好是简单地读取)当前使用的核心数,以了解我们何时可以创建另一个具有所需数量的池核心(以及节点)。
一个例子是,如果我们有 160 个内核的限制(因此具有此配置的 10 个节点)并且我们想要创建一个为其自身使用 120 个内核的池,然后在该池创建并开始执行之后我们有另一个要创建的池。这个新池也需要 120 个内核,因此我们需要能够告诉新池等待,因为没有足够的内核来创建它。
我找到了一种使用以下代码获取正在使用的 ComputeNode
数量的方法:
var batchManagementClient = new BatchManagementClient(new TokenCredentials(token))
{
SubscriptionId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
};
var currentNodes = 0;
using (var batchClient = BatchClient.Open(credentials))
{
var pools = batchClient.PoolOperations.ListPools();
foreach (var cloudPool in pools)
{
if (cloudPool.CurrentDedicatedComputeNodes != null)
{
currentNodes += cloudPool.CurrentDedicatedComputeNodes.Value;
}
}
}
这里的问题是 ComputeNode
s 没有任何属性可以告诉我它 has/is 使用了多少个内核,而且我还没有找到任何类似 ManagementClient 的 class,或任何其他 class 或方法,以获取给定池或所有池中使用的核心数,或单个 ComputeNode
分配给它的核心数。
或者,我还没有找到一种方法来根据 virtualMachineSize
[=] 获得 将 分配给每个 ComputeNode
的核心数量50=] 我们在创建新池时使用。
如有任何帮助,我们将不胜感激,因为我宁愿获得代码中的核心数量,以防止微软将来可能对 virtualMachineSize
进行任何大小更改,否则我将不得不硬编码基于我们指定的 VM 大小的核心数。
注意:似乎有一个 Powershell CMDlet 可以获取给定位置中所有池的当前使用内核和可用内核限制,Azure 门户池边栏选项卡显示 table 有一个 selectable 列报告当前使用的内核。所以我认为这在 C# 中也应该是可能的。
如果我可以提供任何其他信息,请告诉我。
谢谢。
您可以通过组合 Azure Batch .NET SDK as you are using it above with the Azure Management .NET SDK. Optionally, you can get your core quota for your Batch account on-demand using the Azure Batch Management .NET SDK。
- 首先在您的帐户中获得 list of your CloudPools。
- 对于您帐户中的每个 Batch 池,获取 VirtualMachineSize string and the CurrentDedicatedComputeNodes 计数。请注意,专用计数与低优先级计数(和配额)是分开的。
- 获取 list of VirtualMachineSizes for the region that your Batch account is in using the Azure Management SDK (Compute). This will return an iterable list of VirtualMachineSize,为此您可以获得与 #2 相关的相应 VirtualMachineSize 的
numberOfCores
。
SumAllBatchPools(VirtualMachineSize.numberOfCores * CurrentDedicatedComputeNodes)
的计算结果
- 可选择使用 Azure Batch Management .NET API 查询您的 Batch 帐户 core quota 并计算与 #5 的差异以获得 Batch 帐户的即时可用核心配额。
我们正在使用 Azure Batch 服务来 运行 一些计算引擎代码,我们在创建池时指定 VM 的大小:
var pool = batchClient.PoolOperations.CreatePool(poolId: $"{PoolIdPrefix}-{poolGuid}", virtualMachineSize: "STANDARD_G4", cloudServiceConfiguration: new CloudServiceConfiguration(osFamily: "4"), targetDedicatedComputeNodes: 31, targetLowPriorityComputeNodes: 0);
注意:targetDedicatedComputeNodes
目前是硬编码的,但一旦解决此问题就会更改。
使用它,我们决定虚拟机大小,在本例中,恰好有 16 个内核。
问题是,在执行此代码之前,我们需要检查当前存在的池并计算(或者最好是简单地读取)当前使用的核心数,以了解我们何时可以创建另一个具有所需数量的池核心(以及节点)。
一个例子是,如果我们有 160 个内核的限制(因此具有此配置的 10 个节点)并且我们想要创建一个为其自身使用 120 个内核的池,然后在该池创建并开始执行之后我们有另一个要创建的池。这个新池也需要 120 个内核,因此我们需要能够告诉新池等待,因为没有足够的内核来创建它。
我找到了一种使用以下代码获取正在使用的 ComputeNode
数量的方法:
var batchManagementClient = new BatchManagementClient(new TokenCredentials(token))
{
SubscriptionId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
};
var currentNodes = 0;
using (var batchClient = BatchClient.Open(credentials))
{
var pools = batchClient.PoolOperations.ListPools();
foreach (var cloudPool in pools)
{
if (cloudPool.CurrentDedicatedComputeNodes != null)
{
currentNodes += cloudPool.CurrentDedicatedComputeNodes.Value;
}
}
}
这里的问题是 ComputeNode
s 没有任何属性可以告诉我它 has/is 使用了多少个内核,而且我还没有找到任何类似 ManagementClient 的 class,或任何其他 class 或方法,以获取给定池或所有池中使用的核心数,或单个 ComputeNode
分配给它的核心数。
或者,我还没有找到一种方法来根据 virtualMachineSize
[=] 获得 将 分配给每个 ComputeNode
的核心数量50=] 我们在创建新池时使用。
如有任何帮助,我们将不胜感激,因为我宁愿获得代码中的核心数量,以防止微软将来可能对 virtualMachineSize
进行任何大小更改,否则我将不得不硬编码基于我们指定的 VM 大小的核心数。
注意:似乎有一个 Powershell CMDlet 可以获取给定位置中所有池的当前使用内核和可用内核限制,Azure 门户池边栏选项卡显示 table 有一个 selectable 列报告当前使用的内核。所以我认为这在 C# 中也应该是可能的。
如果我可以提供任何其他信息,请告诉我。
谢谢。
您可以通过组合 Azure Batch .NET SDK as you are using it above with the Azure Management .NET SDK. Optionally, you can get your core quota for your Batch account on-demand using the Azure Batch Management .NET SDK。
- 首先在您的帐户中获得 list of your CloudPools。
- 对于您帐户中的每个 Batch 池,获取 VirtualMachineSize string and the CurrentDedicatedComputeNodes 计数。请注意,专用计数与低优先级计数(和配额)是分开的。
- 获取 list of VirtualMachineSizes for the region that your Batch account is in using the Azure Management SDK (Compute). This will return an iterable list of VirtualMachineSize,为此您可以获得与 #2 相关的相应 VirtualMachineSize 的
numberOfCores
。 SumAllBatchPools(VirtualMachineSize.numberOfCores * CurrentDedicatedComputeNodes)
的计算结果
- 可选择使用 Azure Batch Management .NET API 查询您的 Batch 帐户 core quota 并计算与 #5 的差异以获得 Batch 帐户的即时可用核心配额。