配置并发多线程 (SMT)


本页面介绍如何在 Google Kubernetes Engine (GKE) 集群中配置并发多线程。

概览

GKE 节点是 GKE 为您创建的 Compute Engine 虚拟机 (VM) i实例。在这些虚拟机上,通常会默认启用并发多线程 (SMT)。SMT 能够在单个物理 CPU 核心上执行多个独立的线程。启用 SMT 后,单个物理核心可以将两个虚拟 CPU (vCPU) 作为独立的单独线程运行。例如,n2-standard-32 GKE 节点实际上在 16 个物理 CPU 核心上运行 32 个 vCPU。

通过在 GKE 节点上引入 SMT 可配置性,您现在可以配置 SMT,以使有效 vCPU 的数量等于物理核心数,这意味着您的 GKE 节点可以使用每个 vCPU 的整个物理核心。

优势

在 GKE 上配置 SMT 具有以下优势。

性能改进

一些高性能计算 (HPC) 工作负载可通过停用 SMT 来提高性能。一般而言,对于许多常规计算任务或需要大量 I/O 的任务来说,SMT 可以显著提高应用吞吐量。相比之下,对于两个虚拟核心均受计算限制的计算限制型作业来说,SMT 可能会影响应用的总体性能,并增加作业的不确定性。因此,停用 SMT 时,某些 HPC 应用的性能可能会更好,且可预测性更高。

降低了许可费用

某些软件许可协议具有与已使用的 vCPU 数量相关联的计费模型。停用 SMT 会将每个核心的 vCPU 数量减少一半,从而可能会降低许可费用。如需了解详情,请参阅您的许可协议。

请参阅价格部分,了解 Google Cloud 在您配置了 SMT 时如何进行结算。

限制

  • 机器类型:无法在具有少于 2 个 vCPU 的机器类型(例如 n1-standard-1)或 Tau T2D 机器类型上配置 SMT。
  • 节点自动配置:启用了节点自动配置的集群不支持 SMT 配置。
  • 集群自动扩缩器:只有运行 GKE 1.21 版或更高版本的集群的集群自动扩缩器才支持从零节点扩容和 SMT 可配置性。
  • GKE Sandbox:对于运行 1.24.2-gke.300 版及更高版本的 GKE Standard 集群,您可以使用 --threads-per-core 标志在 GKE Sandbox 节点中配置 SMT 设置;对于更早的版本,则需要使用独立的 DaemonSet 来进行设置。有关说明,请参阅 GKE Sandbox。由于 1.24.2-gke.300 版之前的 GKE Sandbox 默认停用多线程,因此不支持使用 threads-per-core 配置 SMT。如果您使用 GKE Sandbox 并希望启用 SMT,请参阅SMT 可能已停用
  • 集群模式:GKE Autopilot 集群不支持 SMT 配置。

价格

GKE 的 SMT 根据 SMT 的底层 Compute Engine 价格计费。您需要为虚拟机的机器类型定义的 vCPU 数量付费,而无需为每个核心上运行的线程数付费。即使您配置了 SMT,仍然需要为虚拟机机器类型定义的默认 vCPU 数量付费。如需详细了解虚拟机的计费方式,请参阅虚拟机实例价格

例如,使用 n2-standard-8 机器类型创建的 GKE 节点默认启用 SMT,最多可运行 8 个 vCPU(4 个物理 CPU 核心,每个核心 2 个 vCPU)。如果您将 SMT 配置为每个核心仅使用一个线程(实际上是 4 个 vCPU),您仍然需要为 8 个 vCPU 付费。

配置 SMT

通过指定每个核心的线程数,您可以在新集群或节点池上配置 SMT。

下表显示了每个核心的线程数的可能值,以及节点的相应 SMT 行为:

每个核心的线程数 SMT 行为
null(未指定) Compute Engine 虚拟机默认值
0 无效
1 SMT 停用
2 SMT 启用
> 2 无效

在新集群上配置 SMT

您可以使用 gcloud CLI 或 Google Cloud 控制台在新集群上配置 SMT。

gcloud

如需配置 SMT,请运行以下命令:

gcloud container clusters create CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --threads-per-core=THREADS_PER_CORE

替换以下内容:

  • CLUSTER_NAME:新集群的名称。
  • MACHINE_TYPE:要用于 GKE 节点的机器类型。此项必须是具有 2 个或更多 vCPU 的机器类型。
  • THREADS_PER_CORE:每个物理核心的线程数。上表显示了您可以指定的值。

如需查看选项的完整列表,请参阅 gcloud container clusters create 文档。

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击 创建

  3. 创建集群对话框中,点击 GKE Standard 旁边的配置

  4. 在导航菜单的节点池部分中,点击节点池的名称,然后点击节点

  5. 机器配置部分中,选择支持的机器类型,例如 e2-standard-2

  6. 点击 CPU 平台和 GPU

  7. vCPU 与核心比率下拉菜单中,选择以下选项之一:

    • 每个核心 1 个 vCPU:停用 SMT。
    • 每个核心 2 个 vCPU:启用 SMT。
  8. 根据需要配置集群和节点池,然后点击创建

在新节点池上配置 SMT

您可以使用 gcloud CLI 或 Google Cloud 控制台在新节点池上配置 SMT。

gcloud

如需配置 SMT,请运行以下命令:

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --threads-per-core=THREADS_PER_CORE

替换以下内容:

  • POOL_NAME:新节点池的名称。
  • CLUSTER_NAME:现有集群的名称。
  • MACHINE_TYPE:要用于 GKE 节点的机器类型。此项必须是具有 2 个或更多 vCPU 的机器类型。
  • THREADS_PER_CORE:每个物理核心的线程数。上表显示了您可以指定的值。

如需查看选项的完整列表,请参阅 gcloud container clusters create 文档。

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击要修改的集群的名称。

  3. 点击 添加节点池

  4. 在导航菜单中,点击节点

  5. 机器配置部分中,选择支持 SMT 的机器系列机器类型,例如 n2-standard-2

  6. 点击 CPU 平台和 GPU

  7. vCPU 与核心比率下拉菜单中,选择以下选项之一:

    • 每个核心 1 个 vCPU:停用 SMT。
    • 每个核心 2 个 vCPU:启用 SMT。
  8. 根据需要配置节点池,然后点击创建

验证 SMT 配置

Linux

如需在 Linux 节点上验证 SMT 配置,请执行以下步骤:

  1. 使用 SSH 连接到节点:

    gcloud compute ssh NODE_NAME
    

    NODE_NAME 替换为您的节点名称。

  2. 检查 vCPU 数量:

    cat /proc/cpuinfo | grep processor | wc -l
    

    输出内容类似如下:

    16
    

    如果将每个核心的线程数设置为 1,则输出应显示 Compute Engine 虚拟机默认 vCPU 数量的一半。例如,停用 SMT 时 n2-standard-32 的输出应为 16,而不是默认值 32

Windows

如需在 Windows 节点上验证 SMT 配置,请执行以下步骤:

  1. 设置要通过 RDP 连接到节点的用户名和密码:

    gcloud compute reset-windows-password NODE_NAME
    

    NODE_NAME 替换为您的节点名称。

  2. 建立与虚拟机的 EXTERNAL_IP:3389 的连接。

  3. 运行以下 powershell 命令:

    Get-WmiObject -Class Win32_Processor -ComputerName. | Select-Object -Property [a-z]* | Select NumberOfCores,NumberOfLogicalProcessors
    

    如果将每个核心的线程数设置为 1,则 NumberOfCores 值应等于 NumberOfLogicalProcessors 值,如以下示例输出中所示:

    Output (example n1-standard-2 with SMT off)
    
    NumberOfCores NumberOfLogicalProcessors
    ------------- -------------------------
                1                         1
    

后续步骤