【发布时间】: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