如何以编程方式获取Azure批处理节点中的核心数?

时间:2017-07-13 14:24:43

标签: c# .net azure azure-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没有任何属性可以告诉我它已经/正在使用多少个核心,而我还没有找到任何类似ManagementClient的类,或者其他任何类类或方法,以获取给定池或所有池中使用的核心数,或单个ComputeNode已分配给它的核心数。

或者,我还没有找到一种方法来根据我们在创建时使用的ComputeNode属性来获取分配给每个virtualMachineSize的核心数量一个新的游泳池。

任何有关此问题的帮助都将受到赞赏,因为我宁愿获取代码中的核心数量以防止Microsoft在将来针对virtualMachineSize所做的任何大小更改,因为否则我将不得不对该数字进行硬编码基于我们指定的VM大小的核心数。

注意:似乎有一个Powershell CMDlet同时获取当前使用的核心以及给定位置中所有池的可用核心限制,Azure Portal Pool刀片显示一个可选择的表报告当前使用的核心的列。所以我认为这也应该在C#中实现。

如果我能提供任何其他信息,请告诉我。

感谢。

1 个答案:

答案 0 :(得分:2)

您可以将上面使用的Azure Batch .NET SDKAzure Management .NET SDK结合使用。 (可选)您可以使用Azure Batch Management .NET SDK按需获取批量帐户的核心配额。

  1. 首先在您的帐户中获得list of your CloudPools
  2. 对于您帐户中的每个批处理池,获取VirtualMachineSize字符串和CurrentDedicatedComputeNodes计数。请注意,专用计数与低优先级计数(和配额)分开。
  3. 使用Azure管理SDK(计算)获取批处理帐户所在区域的list of VirtualMachineSizes。这将返回VirtualMachineSize的可迭代列表,您可以为相应的VirtualMachineSize获取与{2相关的numberOfCores
  4. SumAllBatchPools(VirtualMachineSize.numberOfCores * CurrentDedicatedComputeNodes)
  5. 的计算结果
  6. (可选)使用Azure批处理管理.NET API查询批处理帐户core quota,并计算与#5的差异,以获得批处理帐户的即时可用核心配额。