我们使用 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
使用以下代码获取正在使用的 s 数量的方法:
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 没有任何属性可以告诉我它拥有/正在使用多少个内核,而且我还没有找到任何类似 ManagementClient 的类或任何其他类或方法来获取给定池或所有池中使用的核心,或单个ComputeNode
分配给它的核心数量。
或者,我还没有找到一种方法来根据我们在创建新池时使用的属性来获取将分配给每个内核的数量。ComputeNode
virtualMachineSize
对此的任何帮助将不胜感激,因为我宁愿获得代码中的核心数量,以防止微软未来可能做出的任何大小更改,virtualMachineSize
因为否则我将不得不根据我们指定的 VM 大小对核心数量进行硬编码.
注意:似乎有一个Powershell CMDlet可以同时获取给定位置中所有池的当前使用的核心和可用核心的限制,并且 Azure 门户池刀片显示一个表格,其中包含一个报告当前使用的核心的可选列. 所以我认为这在 C# 中也应该是可能的。
如果我可以提供任何其他信息,请告诉我。
谢谢。