如何以编程方式获取 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;
        }
    }
}

这里的问题是 ComputeNodes 没有任何属性可以告诉我它 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

  1. 首先在您的帐户中获得 list of your CloudPools
  2. 对于您帐户中的每个 Batch 池,获取 VirtualMachineSize string and the CurrentDedicatedComputeNodes 计数。请注意,专用计数与低优先级计数(和配额)是分开的。
  3. 获取 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
  4. SumAllBatchPools(VirtualMachineSize.numberOfCores * CurrentDedicatedComputeNodes)
  5. 的计算结果
  6. 可选择使用 Azure Batch Management .NET API 查询您的 Batch 帐户 core quota 并计算与 #5 的差异以获得 Batch 帐户的即时可用核心配额。