我们使用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
没有任何属性可以告诉我它已经/正在使用多少个核心,而我还没有找到任何类似ManagementClient的类,或者其他任何类类或方法,以获取给定池或所有池中使用的核心数,或单个ComputeNode
已分配给它的核心数。
或者,我还没有找到一种方法来根据我们在创建时使用的ComputeNode
属性来获取将分配给每个virtualMachineSize
的核心数量一个新的游泳池。
任何有关此问题的帮助都将受到赞赏,因为我宁愿获取代码中的核心数量以防止Microsoft在将来针对virtualMachineSize
所做的任何大小更改,因为否则我将不得不对该数字进行硬编码基于我们指定的VM大小的核心数。
注意:似乎有一个Powershell CMDlet同时获取当前使用的核心以及给定位置中所有池的可用核心限制,Azure Portal Pool刀片显示一个可选择的表报告当前使用的核心的列。所以我认为这也应该在C#中实现。
如果我能提供任何其他信息,请告诉我。
感谢。
答案 0 :(得分:2)
您可以将上面使用的Azure Batch .NET SDK与Azure Management .NET SDK结合使用。 (可选)您可以使用Azure Batch Management .NET SDK按需获取批量帐户的核心配额。
numberOfCores
。SumAllBatchPools(VirtualMachineSize.numberOfCores * CurrentDedicatedComputeNodes)