并发多线程 (SMT) 在 Intel 处理器上称为超线程技术 (HTT),可让 CPU 核心作为两个硬件多线程运行。在 Compute Engine 上,每个虚拟 CPU (vCPU) 实现为单个硬件多线程,默认情况下,两个 vCPU 共享每个物理 CPU 核心。
Compute Engine 可让您手动设置每个核心的线程数值。例如,停用 SMT(将每个核心的线程数设置为 1)可能有助于以下方面的工作负载:
性能:减少每个物理 CPU 核心上运行的线程数有助于提高具有高度并行性或执行浮点计算的工作负载的性能。
安全性:如果虚拟机运行不受信任的代码,则减少每个核心的线程数有助于缓解 CPU 漏洞,例如微架构数据抽样。
许可:某些许可协议包含与使用的 vCPU 数量有关的要求。将每个核心的线程数从 2 减少到 1 可能会降低许可费用。如需了解详情,请参阅您的许可协议。
对于许多常规计算任务或需要大量 I/O 的任务来说,SMT 可以显著提高应用吞吐量。对于两个虚拟核心均受计算限制的计算限制型作业来说,SMT 可能会影响应用的总体性能,并可能会增加作业的不可预测性。在这种情况下,关闭 SMT 有助于使性能更具可预测性,并且可以减少作业时间。
限制
您无法为以下机器类型设置虚拟机上每个核心的线程数:
- 所有 H3 机器类型
- 所有 Tau T2A 机器类型
- 所有 Tau T2D 机器类型
- vCPU 数量少于 2 个的机器类型,例如
n1-standard-1
- 共享核心机器类型,例如
e2-small
。
在 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 控制台步骤操作:
在 Google Cloud 控制台中,转到创建实例页面。
在名称字段中,输入虚拟机的名称。
为该虚拟机选择区域和可用区。
选择机器系列和支持的机器类型。
点击高级配置以展开该部分。
在 vCPU 与核心比率中,选择每个核心的线程数。
为虚拟机完成其他设置配置,然后点击创建。
gcloud
如需在创建虚拟机期间更改每个核心的线程数,请使用 gcloud compute instances create
命令。
在使用下面的命令数据之前,请先进行以下替换:
- VM_NAME:新虚拟机的名称。
- ZONE:新虚拟机的可用区。
- MACHINE_TYPE:新虚拟机的机器类型。 必须是具有 2 个或更多 vCPU 的机器类型。
- THREADS_PER_CORE:每个物理核心的线程数。设置为
2
或1
。
执行以下命令:
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:每个物理核心的线程数。设置为
2
或1
。
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 控制台步骤操作:
在 Google Cloud 控制台中,前往虚拟机实例页面。
点击虚拟机的名称。
如果虚拟机的状态为正在运行,请点击停止。
点击修改。
点击高级配置以展开该部分。
在 vCPU 与核心比率下拉列表中,选择每个核心的线程数。
点击保存。
gcloud
如需更改现有虚拟机上每个核心的线程数,请执行以下操作:
使用以下
gcloud compute instances export
命令导出虚拟机属性:gcloud compute instances export VM_NAME \ --destination=YAML_FILE_PATH \ --zone=ZONE
请替换以下内容:
VM_NAME
:要从中导出属性的虚拟机的名称YAML_FILE_PATH
:用于保存导出配置数据的 .yaml 文件的路径和文件名ZONE
:包含虚拟机的可用区
在保存在 FILE_PATH 中的虚拟机配置文件中,更新
threadsPerCore
的值。如果该值不在文件中,请添加以下内容:advancedMachineFeatures: threadsPerCore: THREADS_PER_CORE
使用以下
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
:项目的 IDZONE
:包含虚拟机的可用区VM_NAME
:要从中导出属性的虚拟机的名称THREADS_PER_CORE
:每核心线程数
查看每个核心的线程数
如需查看每个核心的线程数,请按照与虚拟机上运行的操作系统相对应的步骤操作。
Linux
如需查看基于 Linux 的虚拟机上每个核心的线程数,请按照以下步骤操作:
运行
lscpu
命令。lscpu
查看输出以了解每个核心的线程数。
在
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 的虚拟机上每个核心的线程数,请按照以下步骤操作:
启动 Powershell。
运行以下命令:
Get-WmiObject -Class Win32_processor | Select-Object NumberOfCores, @{Name="Thread(s) per core";Expression={$_.NumberOfLogicalProcessors/$_.NumberOfCores}}
查看输出以了解每个核心的线程数。
在
n2-standard-16
机器的以下示例输出中,每个核心的线程数的值为1
,如Thread(s) per core
列中所示。NumberOfCores Thread(s) per core ------------- ------------------ 8 1