设置每个核心的线程数


并发多线程 (SMT) 在 Intel 处理器上称为超线程技术 (HTT),可让 CPU 核心作为两个硬件多线程运行。在 Compute Engine 上,每个虚拟 CPU (vCPU) 实现为单个硬件多线程,默认情况下,两个 vCPU 共享每个物理 CPU 核心。

Compute Engine 可让您手动设置每个核心的线程数值。例如,停用 SMT(将每个核心的线程数设置为 1)可能有助于以下方面的工作负载:

  • 性能:减少每个物理 CPU 核心上运行的线程数有助于提高具有高度并行性或执行浮点计算的工作负载的性能。

  • 安全性:如果虚拟机运行不受信任的代码,则减少每个核心的线程数有助于缓解 CPU 漏洞,例如微架构数据抽样

  • 许可:某些许可协议包含与使用的 vCPU 数量有关的要求。将每个核心的线程数从 2 减少到 1 可能会降低许可费用。如需了解详情,请参阅您的许可协议。

对于许多常规计算任务或需要大量 I/O 的任务来说,SMT 可以显著提高应用吞吐量。对于两个虚拟核心均受计算限制的计算限制型作业来说,SMT 可能会影响应用的总体性能,并可能会增加作业的不可预测性。在这种情况下,关闭 SMT 有助于使性能更具可预测性,并且可以减少作业时间。

限制

  • 您无法为以下机器类型设置虚拟机上每个核心的线程数:

  • 在 Google Cloud 控制台中,当每个核心的线程数设置为 1 时,CPU 利用率指标最多只能扩容到 50%。当每个核心的线程数设置为 2 时,CPU 利用率指标可以扩容到 100%。

价格

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

在创建虚拟机期间更改每个核心的线程数

如需在创建虚拟机期间更改每个核心的线程数,请使用 Google Cloud 控制台、gcloud CLI 或 Compute Engine API。

执行此任务所需的权限

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

控制台

如需在创建虚拟机期间更改每个核心的线程数,请按照以下 Google Cloud 控制台步骤操作:

  1. 在 Google Cloud 控制台中,转到创建实例页面。

    打开“创建实例”

  2. 名称字段中,输入虚拟机的名称。

  3. 为该虚拟机选择区域可用区

  4. 选择机器系列和支持的机器类型

  5. 点击高级配置以展开该部分。

  6. vCPU 与核心比率中,选择每个核心的线程数。

  7. 为虚拟机完成其他设置配置,然后点击创建

gcloud

如需在创建虚拟机期间更改每个核心的线程数,请使用 gcloud compute instances create 命令

在使用下面的命令数据之前,请先进行以下替换:

  • VM_NAME:新虚拟机的名称。
  • ZONE:新虚拟机的可用区。
  • MACHINE_TYPE:新虚拟机的机器类型。 必须是具有 2 个或更多 vCPU 的机器类型。
  • THREADS_PER_CORE:每个物理核心的线程数。设置为 21

执行以下命令:

Linux、macOS 或 Cloud Shell

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

Windows (PowerShell)

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

Windows (cmd.exe)

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

您应该会收到类似如下所示的响应:

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME].
NAME: VM_NAME
ZONE: ZONE
MACHINE_TYPE: MACHINE_TYPE
PREEMPTIBLE:
INTERNAL_IP: EXTERNAL_IP
EXTERNAL_IP: INTERNAL_IP
STATUS: RUNNING

REST

如需在创建虚拟机期间更改每个核心的线程数,请将 instances.insert 方法threadsPerCore 字段结合使用。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:项目 ID。
  • ZONE:新虚拟机的可用区。
  • MACHINE_TYPE:新虚拟机的机器类型。 必须是具有 2 个或更多 vCPU 的机器类型。
  • VM_NAME:新虚拟机的名称。
  • THREADS_PER_CORE:每个物理核心的线程数。设置为 21

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "machineType": "projects/PROJECT_ID/zones/ZONE/machineTypes/MACHINE_TYPE",
  "name": "VM_NAME",
  "advancedMachineFeatures": {
    "threadsPerCore": THREADS_PER_CORE
  },
  "disks": [
    {
      "type": "PERSISTENT",
      "boot": true,
      "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/family/debian-11"
      }
    }
  ],
  "networkInterfaces": [
    {
      "network": "global/networks/default"
    }
  ]
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "kind": "compute#operation",
  "id": "7334609091572405391",
  "name": "operation-1663806045894-5e939085735d8-7499db32-c12fcc03",
  "zone": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE",
  "operationType": "insert",
  "targetLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME",
  "targetId": "1226375378512516273",
  "status": "RUNNING",
  "user": "EMAIL_ADDRESS",
  "progress": 0,
  "insertTime": "2022-09-21T17:20:48.751-07:00",
  "startTime": "2022-09-21T17:20:48.751-07:00",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations/operation-1663806045894-5e939085735d8-7499db32-c12fcc03"
}

更改虚拟机上每个核心的线程数

如需更改虚拟机上每个核心的线程数,请使用 Google Cloud 控制台、gcloud CLI 或 Compute Engine API。

执行此任务所需的权限

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

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

控制台

如需更改现有虚拟机上每个核心的线程数,请按照以下 Google Cloud 控制台步骤操作:

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    进入“虚拟机实例”

  2. 点击虚拟机的名称

  3. 如果虚拟机的状态正在运行,请点击停止

  4. 点击修改

  5. 点击高级配置以展开该部分。

  6. vCPU 与核心比率下拉列表中,选择每个核心的线程数。

  7. 点击保存

gcloud

如需更改现有虚拟机上每个核心的线程数,请执行以下操作:

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

    gcloud 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 compute instances update-from-file 命令可以使用每个核心的新线程数更新虚拟机:

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

    请替换以下内容:

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

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

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

REST

如需更改现有虚拟机上每个核心的线程数,请使用以下 instances.update 方法

PUT https://compute.googleapis.com/compute/v1/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:每核心线程数

查看每个核心的线程数

如需查看每个核心的线程数,请按照与虚拟机上运行的操作系统相对应的步骤操作。

Linux

如需查看基于 Linux 的虚拟机上每个核心的线程数,请按照以下步骤操作:

  1. 连接到 Linux 虚拟机

  2. 运行 lscpu 命令。

    lscpu
    
  3. 查看输出以了解每个核心的线程数。

    n2-standard-16 机器的以下示例输出中,每个核心的线程数的值为 1,如 Thread(s) per core 行中所示。

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

Windows

如需查看基于 Windows 的虚拟机上每个核心的线程数,请按照以下步骤操作:

  1. 连接到 Windows 虚拟机

  2. 启动 Powershell。

  3. 运行以下命令:

    Get-WmiObject -Class Win32_processor | Select-Object NumberOfCores, @{Name="Thread(s) per core";Expression={$_.NumberOfLogicalProcessors/$_.NumberOfCores}}
    
  4. 查看输出以了解每个核心的线程数。

    n2-standard-16 机器的以下示例输出中,每个核心的线程数的值为 1,如 Thread(s) per core 列中所示。

    NumberOfCores Thread(s) per core
    ------------- ------------------
                8                  1
    

后续步骤