配置同步多线程


默认情况下,Compute Engine 会默认启用并发多线程 (SMT)。启用 SMT 后,单个物理 CPU 核心可以运行 2 个虚拟 CPU (vCPU),每个虚拟 CPU 作为单独的线程。您可以通过将每个核心的线程数(即有效 vCPU 的数量)减少到 1 来停用 SMT。本文档介绍了您为什么会更改在每个物理 CPU 核心上运行的线程数以及如何更改。

配置 SMT 的注意事项

性能
减少每个物理 CPU 核心上运行的线程数有助于提高具有高度并行性或执行浮点计算的工作负载的性能。
安全
如果虚拟机运行不受信任的代码,则减少每核心线程数有助于缓解 CPU 漏洞,例如微架构数据抽样
许可
某些许可协议包含与使用的 vCPU 数量有关的要求。停用 SMT 会将每个核心的 vCPU 数量从 2 个减少到 1 个,这可能会降低许可费用。如需了解详情,请参阅您的许可协议。

限制

在下面的虚拟机上,每核心线程数不可配置:

  • 在 vCPU 数量少于 2 个的机器类型(例如 n1-standard-1)或共享核心机器(例如 e2-small)上运行的虚拟机。

  • Tau T2D 机器类型上运行的虚拟机。

价格

您需要为虚拟机的机器类型定义的 vCPU 数量付费,而无需为每个核心上运行的线程数付费。例如,n2-standard-8 机器类型最多可以运行 8 个 vCPU,即 4 个物理 CPU 核心中的每一个对应 2 个 vCPU。如果您决定每个核心只运行 1 个线程(实际上是 4 个 vCPU),则仍需要为 8 个 vCPU 付费。如需详细了解虚拟机的计费方式,请参阅虚拟机实例价格

在新虚拟机上配置 SMT

按照以下过程在新虚拟机上配置 SMT。

执行此任务所需的权限

您必须拥有以下权限才能执行此任务:

gcloud

在创建虚拟机时可以使用以下 gcloud beta compute instances create 命令来配置 SMT。

gcloud beta compute instances create VM_NAME \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --threads-per-core=THREADS_PER_CORE

请替换以下内容:

  • VM_NAME:新虚拟机的名称。

  • ZONE:新虚拟机的可用区。

  • MACHINE_TYPE:新虚拟机的机器类型。必须是具有 2 个或更多 vCPU 的机器类型。

  • THREADS_PER_CORE:每个物理核心的线程数。对于 SMT(默认处于启用状态),当前处理器支持每个核心的 2 个线程。如需停用 SMT,请设置为 1

API

在创建虚拟机时可以结合使用 instances.insert 方法threadsPerCore 字段来配置 SMT。

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instances

{
  ...
  "advancedMachineFeatures": {
    ...
    "threadsPerCore": "THREADS_PER_CORE"
  },
  ...
}

请替换以下内容:

  • PROJECT_ID:项目 ID。

  • ZONE:新虚拟机的可用区。

  • THREADS_PER_CORE:每个物理核心的线程数。对于 SMT(默认处于启用状态),当前处理器支持每个核心的 2 个线程。如需停用 SMT,请设置为 1

在现有虚拟机上配置 SMT

按照以下步骤操作在现有虚拟机上配置 SMT。

执行此任务所需的权限

您必须拥有以下权限才能执行此任务:

  • 针对项目的 compute.instances.get 权限
  • 针对项目的 compute.instances.update 权限

gcloud

  1. 使用以下 gcloud beta compute instances export 命令导出虚拟机属性:

    gcloud beta compute instances export VM_NAME \
        --destination=YAML_FILE_PATH \
        --zone=ZONE
    

    请替换以下内容:

    • VM_NAME:要从中导出属性的虚拟机的名称

    • YAML_FILE_PATH:用于保存导出配置数据的 .yaml 文件的路径和文件名

    • ZONE:包含虚拟机的可用区

  2. 在保存在 FILE_PATH 中的虚拟机配置文件中,更新 threadsPerCore 的值。如果该值不在文件中,请添加以下内容:

    advancedMachineFeatures:
      threadsPerCore: THREADS_PER_CORE
    
  3. 使用以下 gcloud beta compute instances update-from-file 命令可以使用每个核心的新线程数更新虚拟机:

    gcloud beta compute instances update-from-file VM_NAME \
        --source=FILE_PATH \
        --most-disruptive-allowed-action=RESTART \
        --zone=ZONE
    

    请替换以下内容:

    • VM_NAME:要更新的虚拟机的名称

    • FILE_PATH:更新后的虚拟机配置文件的路径

    • ZONE:包含要更新的虚拟机的可用区

API

使用以下 instances.update 方法更新虚拟机每个核心的线程:

PUT https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME?most_disruptive_allowed_action=RESTART

{
  ...
  "advanced_machine_features": {
    ...
    "threadsPerCore": "THREADS_PER_CORE"
  },
  ...
}

请替换以下内容:

  • PROJECT_ID:项目的 ID

  • ZONE:包含虚拟机的可用区

  • VM_NAME:要从中导出属性的虚拟机的名称

  • THREADS_PER_CORE:每核心线程数

验证 SMT 配置

按照与虚拟机上运行的操作系统相对应的过程验证 SMT 配置。

Linux

按照以下过程在基于 Linux 的虚拟机上验证 SMT 配置:

  1. 连接到 Linux 虚拟机

  2. 运行 lscpu 命令。

    lscpu
    
  3. 在输出中,验证每个核心的线程数的值。

    在以下示例输出中,每个核心的线程数的值为 1

    ...
    CPU(s):              1
    On-line CPU(s) list: 0
    Thread(s) per core:  1
    Core(s) per socket:  1
    Socket(s):           1
    NUMA node(s):        1
    Vendor ID:           GenuineIntel
    CPU family:          6
    Model:               85
    Model name:          Intel(R) Xeon(R) CPU
    ...
    

Windows

按照以下过程在基于 Windows 的虚拟机上验证 SMT 配置:

  1. 连接到 Windows 虚拟机

  2. 打开 Windows Management Instrumentation (WMI) 的命令行界面。

    wmic
    
  3. 通过运行以下命令查看核心数量和逻辑处理器数量:

    CPU Get NumberOfCores,NumberofLogicalProcessors
    
  4. 在输出中,验证每个核心的线程数的值。

    在以下示例输出中,每个核心的线程数的值为 1

    NumberOfCores  NumberOfLogicalProcessors
    1              1
    

后续步骤