設定每個核心的執行緒數量

多執行緒並行 (SMT) 在 Intel 處理器上稱為超執行緒技術 (HTT),可讓 CPU 核心以兩個硬體多執行緒的形式執行。在 Compute Engine 中,每個虛擬 CPU (vCPU) 都會部署為單一硬體多執行緒,且預設兩個 vCPU 會共用每個實體 CPU 核心。

Compute Engine 可讓您手動設定每個核心的執行緒數量。舉例來說,如果工作負載有下列考量,停用 SMT (將每個核心的執行緒數量設為 1) 可能會有所幫助:

  • 效能:減少每個實體 CPU 核心可執行的執行緒數量,有助於提升運算密集型工作負載的效能。這對高度平行的 HPC 應用程式和執行大量浮點運算的工作負載很有幫助。

  • 安全性:如果 VM 執行不受信任的程式碼,減少每個核心的執行緒數量,有助於緩解 CPU 漏洞,例如微架構資料取樣。

  • 授權:部分授權協議會對您使用的 vCPU 數量設下限制。將每個核心的執行緒數量從 2 個減少為 1 個,或許可以降低授權費用。詳情請參閱授權協議。

對於許多一般運算工作或需要大量 I/O 的工作,SMT 可大幅提升應用程式輸送量。如果運算量大的工作負載中,兩個虛擬核心的運算量都很大,SMT 可能會阻礙整體應用程式效能,並為工作增加無法預測的變異數。在這種情況下,停用 SMT 可提高效能的可預測性,並縮短工作時間。

限制

已知問題

在 Google Cloud 控制台中,如果每個核心的執行緒數量設為 1,CPU 使用率指標最多會擴充至 50%。這是已知的視覺化錯誤。實際 CPU 使用率是顯示值的兩倍。

定價

系統會依據 VM 機型定義的 vCPU 數量收費,而非根據每個核心執行的執行緒數量收費。舉例來說,n2-standard-8 機型最多可執行 8 個 vCPU,也就是每個實體 CPU 核心 2 個 vCPU。如果使用 n2-standard-8 機型,但決定每個核心只執行 1 個執行緒 (實際上是 4 個 vCPU),系統仍會依據 8 個 vCPU 收費。如要進一步瞭解 VM 的計費方式,請參閱「VM 執行個體定價」。

在建立 VM 時變更每個核心的執行緒數量

如要在建立 VM 時變更每個核心的執行緒數量,請使用Google Cloud 控制台、gcloud CLI 或 Compute Engine API。

這項工作需要的權限

如要執行這項工作,您必須具備下列權限:

控制台

如要在建立 VM 時變更每個核心的執行緒數量,請使用下列Google Cloud 控制台程序:

  1. 前往 Google Cloud 控制台的「Create an instance」(建立執行個體) 頁面。

    前往「Create an instance」(建立執行個體) 頁面

  2. 在「Name」(名稱) 欄位,輸入 VM 的名稱。

  3. 選擇 VM 的「區域」和「可用區」。

  4. 選擇「機器家族」和支援的「機型」。

  5. 按一下「進階設定」展開該部分。

  6. 在「vCPU 與核心比率」中,選擇每個核心的執行緒數量。

  7. 完成 VM 的其他設定,然後按一下「建立」。

gcloud

如要在建立 VM 時變更每個核心的執行緒數量,請使用 gcloud compute instances create 指令。

使用下列任何指令資料之前,請先替換以下項目:

  • VM_NAME:新 VM 的名稱。
  • ZONE:新 VM 的可用區。
  • MACHINE_TYPE:新 VM 的機器類型。必須是具有 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

如要在建立 VM 時變更每個核心的執行緒數量,請使用 instances.insert 方法和 threadsPerCore 欄位。

使用任何要求資料之前,請先修改下列項目的值:

  • PROJECT_ID:專案 ID。
  • ZONE:新 VM 的可用區。
  • MACHINE_TYPE:新 VM 的機器類型。必須是 vCPU 數量大於或等於 2 的機型。
  • VM_NAME:新 VM 的名稱。
  • 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-13"
      }
    }
  ],
  "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"
}

變更 VM 上每個核心的執行緒數量

如要變更 VM 每個核心的執行緒數量,請使用Google Cloud 控制台、gcloud CLI 或 Compute Engine API。

這項工作需要的權限

如要執行這項工作,您必須具備下列權限:

  • 專案的 compute.instances.get
  • 專案的 compute.instances.update

控制台

如要變更現有 VM 的每個核心執行緒數量,請按照下列 Google Cloud 控制台程序操作:

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。

    前往 VM 執行個體

  2. 按一下 VM 的「Name」(名稱)。

  3. 按一下 「Stop」(停止) 即可停止 VM。如果沒有「停止」選項,請依序點選 「更多動作」>「停止」。

  4. 按一下 [編輯]。

  5. 按一下「進階設定」展開該部分。

  6. 在「vCPU 與核心比率」下拉式選單中,選擇每個核心的執行緒數量。

  7. 按一下 [儲存]。

gcloud

如要變更現有 VM 的每個核心執行緒數量,請按照下列步驟操作:

  1. 使用下列 gcloud compute instances export 指令匯出 VM 屬性:

    gcloud compute instances export VM_NAME \
        --destination=YAML_FILE_PATH \
        --zone=ZONE
    

    更改下列內容:

    • VM_NAME:要匯出屬性的 VM 名稱

    • YAML_FILE_PATH:YAML 檔案的路徑和檔案名稱,匯出的設定資料會儲存至這個檔案

    • ZONE:包含 VM 的可用區

  2. 在儲存於 FILE_PATH 的 VM 設定檔中,更新 threadsPerCore 的值。如果檔案中沒有該值,請新增下列內容:

    advancedMachineFeatures:
      threadsPerCore: THREADS_PER_CORE
    
  3. 使用下列 gcloud compute instances update-from-file 指令,以每個核心的新執行緒數更新 VM:

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

    更改下列內容:

    • VM_NAME:要更新的 VM 名稱

    • FILE_PATH:更新後 VM 設定檔的路徑

    • ZONE:要更新的 VM 所在可用區

REST

如要變更現有 VM 每個核心的執行緒數量,請使用下列 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 所在的可用區

  • VM_NAME:要匯出屬性的 VM 名稱

  • THREADS_PER_CORE:每個核心的執行緒數量

查看每個核心的執行緒數量

如要查看每個核心的執行緒數量,請使用與 VM 執行的 OS 相對應的程序。

Linux

如要查看 Linux 型 VM 的每個核心執行緒數量,請按照下列程序操作:

  1. 連線至 Linux VM。

  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 VM 上查看每個核心的執行緒數量,請按照下列程序操作:

  1. 連線至 Windows VM。

  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
    

後續步驟