設定多執行緒並行 (SMT)


本頁面說明如何在 Google Kubernetes Engine (GKE) 叢集中設定同步多執行緒

總覽

GKE 節點是 Compute Engine 虛擬機器 (VM) 執行個體,由 GKE 代表您建立。在這些 VM 上,預設通常會啟用多執行緒並行 (SMT)。SMT 可在單一實體 CPU 核心上執行多個獨立執行緒。啟用 SMT 後,單一實體核心就能以個別獨立執行緒的形式執行兩個虛擬 CPU (vCPU)。舉例來說,n2-standard-32 GKE 節點實際上是在 16 個實體 CPU 核心上執行 32 個 vCPU。

GKE 節點導入 SMT 可設定性後,您現在可以設定 SMT,使有效 vCPU 數量等於實體核心數量,也就是說,GKE 節點可為每個 vCPU 使用完整的實體核心。

優點

在 GKE 上設定 SMT 可帶來下列好處。

提高效能

停用 SMT 後,部分高效能運算 (HPC) 工作負載的效能可能會提升。一般來說,對於許多一般運算工作或需要大量 I/O 的工作,SMT 可以大幅提升應用程式總處理量。相反地,如果工作受運算限制,且兩個虛擬核心都受運算限制,SMT 可能會阻礙整體應用程式效能,並為工作增加不確定的差異。因此,停用 SMT 後,部分 HPC 應用程式的效能可能會更好,也更穩定。

降低授權費用

部分軟體授權協議的計費模式與使用的 vCPU 數量有關。停用 SMT 會將每個核心的 vCPU 數量減少一半,授權費用可能會因此降低。詳情請參閱授權協議。

如要瞭解設定 SMT 時的計費方式,請參閱「定價」一節。 Google Cloud

限制

  • 機器類型:SMT 無法在少於 2 個 vCPU 的機器類型 (例如 n1-standard-1) 或 Tau T2D 機器類型上設定。
  • 節點自動佈建:如果叢集已啟用節點自動佈建,則不支援 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 可設定性。

定價

系統會根據基礎 Compute Engine SMT 定價,向您收取 GKE SMT 費用。系統會依據 VM 的機器類型定義的 vCPU 數量收費,而非根據每個核心執行的執行緒數量收費。即使您設定 SMT,系統仍會依據 VM 機器類型定義的預設 vCPU 數量收費。如要進一步瞭解 VM 的計費方式,請參閱 VM 執行個體定價

舉例來說,使用 n2-standard-8 機器類型建立的 GKE 節點預設會啟用 SMT,最多可執行 8 個 vCPU,也就是每個實體 CPU 核心 2 個 vCPU。如果您將 SMT 設為每個核心只使用一個執行緒 (實際上是 4 個 vCPU),系統仍會向您收取 8 個 vCPU 的費用。

設定 SMT

如要在新叢集或節點集區上設定 SMT,請指定每個核心的執行緒數量。

下表列出每個核心的可能執行緒數值,以及節點對應的 SMT 行為:

每個核心的執行緒數量 SMT 行為
null (未指定) Compute Engine VM 預設值
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. 按一下「 Create」(建立)

  3. 在「建立叢集」對話方塊中,按一下 GKE Standard 旁邊的「設定」

  4. 在導覽選單的「節點集區」部分中,按一下節點集區名稱,然後按一下「節點」

  5. 在「機器設定」部分,選取支援的「機器類型」,例如「e2-standard-2」

  6. 按一下「CPU 平台和 GPU」

  7. 從「vCPU to core ratio」(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. 按一下 「Add node pool」(新增節點集區)

  4. 在導覽選單中,按一下「節點」

  5. 在「機器設定」部分,選取支援 SMT 的「機器系列」和「機器類型」,例如「n2-standard-2」

  6. 按一下「CPU 平台和 GPU」

  7. 從「vCPU to core ratio」(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 VM 預設 vCPU 數量的一半。舉例來說,如果 SMT 關閉,n2-standard-32 的輸出內容應為 16,而非預設值 32

Windows

如要在 Windows 節點上驗證 SMT 設定,請執行下列步驟:

  1. 設定使用者名稱和密碼,透過遠端桌面協定連線至節點:

    gcloud compute reset-windows-password NODE_NAME
    

    NODE_NAME 替換為節點名稱。

  2. 建立與 VM 的 EXTERNAL_IP:3389 連線。

  3. 執行下列 PowerShell 指令:

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

    如果將每個核心的執行緒數量設為 1NumberOfCores 值應等於 NumberOfLogicalProcessors 值,如下列範例輸出所示:

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

後續步驟