【问题标题】:How can I programmatically get the number of cores in an Azure Batch Node?如何以编程方式获取 Azure Batch 节点中的核心数?
【发布时间】:2017-07-13 14:24:42
【问题描述】:

我们正在使用 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 个核心,因此我们需要能够告诉新池等待,因为没有足够的核心可供制造。

我找到了一种使用以下代码获取正在使用的ComputeNodes 数量的方法:

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

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

对此的任何帮助将不胜感激,因为我宁愿获得代码中的核心数量,以防止微软将来可能对virtualMachineSize 进行任何大小更改,因为否则我将不得不对核心数量进行硬编码基于我们指定的 VM 大小。

注意:似乎有一个Powershell CMDlet 可以同时获取给定位置中所有池的当前使用的内核和可用内核的限制,并且 Azure 门户池刀片显示一个表,其中包含一个可选列报告当前使用的核心。所以我认为这在 C# 中也应该是可能的。

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

谢谢。

【问题讨论】:

    标签: c# .net azure azure-batch


    【解决方案1】:

    您可以通过将上面使用的Azure Batch .NET SDK 与Azure Management .NET SDK 组合来实现此目的。或者,您可以使用 Azure Batch Management .NET SDK 按需获取 Batch 帐户的核心配额。

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

    【讨论】:

    • 非常感谢!这正是我所需要的!
    猜你喜欢
    • 2018-05-04
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    相关资源
    最近更新 更多