默认情况下,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
使用以下
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
:包含虚拟机的可用区
在保存在 FILE_PATH 中的虚拟机配置文件中,更新
threadsPerCore
的值。如果该值不在文件中,请添加以下内容:advancedMachineFeatures: threadsPerCore: THREADS_PER_CORE
使用以下
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
:项目的 IDZONE
:包含虚拟机的可用区VM_NAME
:要从中导出属性的虚拟机的名称THREADS_PER_CORE
:每核心线程数
验证 SMT 配置
按照与虚拟机上运行的操作系统相对应的过程验证 SMT 配置。
Linux
按照以下过程在基于 Linux 的虚拟机上验证 SMT 配置:
运行
lscpu
命令。lscpu
在输出中,验证每个核心的线程数的值。
在以下示例输出中,每个核心的线程数的值为
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 配置:
打开 Windows Management Instrumentation (WMI) 的命令行界面。
wmic
通过运行以下命令查看核心数量和逻辑处理器数量:
CPU Get NumberOfCores,NumberofLogicalProcessors
在输出中,验证每个核心的线程数的值。
在以下示例输出中,每个核心的线程数的值为
1
。NumberOfCores NumberOfLogicalProcessors 1 1