C# 如何以编程方式获取Azure批处理节点中的核心数?
我们正在使用Azure批处理服务运行一些计算引擎代码,并在创建池时指定VM的大小:C# 如何以编程方式获取Azure批处理节点中的核心数?,c#,.net,azure,azure-batch,C#,.net,Azure,Azure Batch,我们正在使用Azure批处理服务运行一些计算引擎代码,并在创建池时指定VM的大小: var pool = batchClient.PoolOperations.CreatePool(poolId: $"{PoolIdPrefix}-{poolGuid}", virtualMachineSize: "STANDARD_G4", cloudServiceConfiguration: new CloudServiceConfiguration(osFamily: "4"), targetDedicat
var pool = batchClient.PoolOperations.CreatePool(poolId: $"{PoolIdPrefix}-{poolGuid}", virtualMachineSize: "STANDARD_G4", cloudServiceConfiguration: new CloudServiceConfiguration(osFamily: "4"), targetDedicatedComputeNodes: 31, targetLowPriorityComputeNodes: 0);
注意:targetIdeficatedComputeNodes
当前是硬编码的,但一旦解决此问题,将进行更改
使用这个,我们决定虚拟机的大小,在本例中,虚拟机恰好有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
分配给它的核数
或者,我还没有找到一种方法,根据我们在创建新池时使用的virtualMachineSize
属性来获取分配给每个ComputeNode
的核心数
在此方面的任何帮助都将不胜感激,因为我更希望获得代码中的内核数量,以防止Microsoft将来可能对virtualMachineSize
进行的任何大小更改,因为否则我将不得不根据指定的VM大小硬编码内核数量
注意:似乎存在一个获取当前使用的内核和给定位置中所有池的可用内核限制的表,Azure Portal池刀片显示了一个表,该表具有一个可选列,用于报告当前使用的内核。所以我认为这在C#中也是可能的
请让我知道,如果有任何其他信息,我可以提供
谢谢。您可以通过将上面使用的与结合使用来完成此操作。或者,您可以使用按需获取批处理帐户的核心配额
numberOfCores
SumAllBatchPools的计算结果(VirtualMachineSize.numberOfCores*currentIficatedComputeNodes)
非常感谢!这正是我需要的!