禁用 Azure Batch 池节点的超线程

许多 Azure 虚拟机(VM)规格在出厂时即启用 超线程(也称为同步多线程,即 SMT),使每个物理核心呈现两个逻辑 vCPU。 对于某些 Azure Batch 工作负载,你可能需要关闭超线程,这样每个计算节点只暴露其物理核心。 常见原因包括:

  • 高性能计算(HPC)工作负载对内存带宽或缓存争用敏感,且每个物理核使用一个线程时表现更好。
  • 按核心软件许可,按物理核心数量计费,避免计算逻辑核心数。
  • 对于紧耦合或基准敏感的应用,实现可预测、确定性的性能

你通过在批处理池中添加保留 标签 来禁用超线程。 Batch 会将该标记传播到为池提供支持的虚拟机规模集,计算平台在预配节点时会关闭超线程(每个物理核心一个线程)。

Note

批处理服务不再要求在订阅上注册 Microsoft.Compute/PlatformSettingsOverride 功能(Azure 功能公开控制标记)即可使用此功能。 现在只需添加池标签即可。 如果您之前收到 Platform settings override is not supported in this subscription 错误,请在最新的批处理服务推出后重新尝试。

虚拟机大小支持

禁用超线程只适用于启用超线程的虚拟机大小,即每个物理核心有两个线程的大小。 对于这些规格,禁用超线程后,每个核心只提供一个线程,这会使每个节点呈现的 vCPU 数量减半(例如,16 vCPU 规格对应 8 个核心)。

已为每个核心只提供一个线程的虚拟机规格(例如,许多 GPU 规格和专用 HPC 规格)不支持此设置,并且该标记对这些规格不起作用。

要判断虚拟机大小是否支持禁用超线程,请查看其 vCPU每核的 比例:

  • 请查看你计划使用的系列的 虚拟机规模文档vCPUs:Core 的比率为 2:1 表示已启用超线程,并且可将其禁用。
  • 或者查询资源SKUs-列表API,检查该功能。vCPUsPerCore 值为 2 表示可以禁用超线程;值为 1 表示不能禁用超线程。

禁用超线程会如何影响你的资源池

  • vCPU 数量减半。 由于每个节点只暴露物理核心,每个节点的 vCPU 数量减半。 相应地规划你的泳池规模和 核心配额
  • 任务调度时段。 如果你采用默认设置,即每个 vCPU 分配一个任务槽,或者你设置了 taskSlotsPerNode,请检查这些值,以确保在减少后的核心数配置下,任务能够按预期进行调度。
  • 账单未变。 你仍然按选择的虚拟机大小计费;禁用超线程不会改变虚拟机的价格。

加上泳池标签

在池资源上设置一个带有以下键和值的标签:

标记键 标签值
platformsettings.host_environment.disablehyperthreading true

因为你在资源上设置了标签Microsoft.Batch/batchAccounts/pools,所以可以通过 Azure 资源管理器 创建或更新资源池。 例如,可以使用ARM模板、Bicep文件或批处理REST API。 platformsettings. 前缀保留用于平台设置,因此请严格按所示键名使用。

Bicep

以下 Bicep 示例创建了一个禁用超线程的池。 只需属性 tags 即可支持该行为。

resource pool 'Microsoft.Batch/batchAccounts/pools@2024-07-01' = {
  name: 'hpcpool'
  parent: batchAccount
  tags: {
    'platformsettings.host_environment.disablehyperthreading': 'true'
  }
  properties: {
    vmSize: 'Standard_D16s_v5'
    deploymentConfiguration: {
      virtualMachineConfiguration: {
        imageReference: {
          publisher: 'canonical'
          offer: '0001-com-ubuntu-server-jammy'
          sku: '22_04-lts'
          version: 'latest'
        }
        nodeAgentSkuId: 'batch.node.ubuntu 22.04'
      }
    }
    scaleSettings: {
      fixedScale: {
        targetDedicatedNodes: 2
        resizeTimeout: 'PT15M'
      }
    }
  }
}

ARM 模板

{
  "type": "Microsoft.Batch/batchAccounts/pools",
  "apiVersion": "2024-07-01",
  "name": "[format('{0}/{1}', parameters('batchAccountName'), 'hpcpool')]",
  "tags": {
    "platformsettings.host_environment.disablehyperthreading": "true"
  },
  "properties": {
    "vmSize": "Standard_D16s_v5",
    "deploymentConfiguration": {
      "virtualMachineConfiguration": {
        "imageReference": {
          "publisher": "canonical",
          "offer": "0001-com-ubuntu-server-jammy",
          "sku": "22_04-lts",
          "version": "latest"
        },
        "nodeAgentSkuId": "batch.node.ubuntu 22.04"
      }
    },
    "scaleSettings": {
      "fixedScale": {
        "targetDedicatedNodes": 2,
        "resizeTimeout": "PT15M"
      }
    }
  }
}

批处理管理 REST API

PUT https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Batch/batchAccounts/{accountName}/pools/{poolName}?api-version=2024-07-01
{
  "tags": {
    "platformsettings.host_environment.disablehyperthreading": "true"
  },
  "properties": {
    "vmSize": "Standard_D16s_v5",
    "deploymentConfiguration": {
      "virtualMachineConfiguration": {
        "imageReference": {
          "publisher": "canonical",
          "offer": "0001-com-ubuntu-server-jammy",
          "sku": "22_04-lts",
          "version": "latest"
        },
        "nodeAgentSkuId": "batch.node.ubuntu 22.04"
      }
    },
    "scaleSettings": {
      "fixedScale": {
        "targetDedicatedNodes": 2,
        "resizeTimeout": "PT15M"
      }
    }
  }
}

Important

要禁用超线程,将标签值 true设置为 。 设置其他值或移除标签会重新启用超线程。 当你在现有池上更改该标签时,必须重新映像或重建节点(例如将池缩小到零再回来),变更才会生效。

确认超线程是否被禁用

节点配置完成后,登录计算节点(例如通过 Azure 门户或配置远程访问)并确认线程数量。

  • Linux:运行 lscpu 并确认 Thread(s) per core: 1

    lscpu | grep -i "Thread(s) per core"
    
  • Windows:比较逻辑处理器数量与物理核心数量。 当超线程被禁用时,这两个值相等。

    Get-CimInstance Win32_Processor | Select-Object NumberOfCores, NumberOfLogicalProcessors
    

后续步骤