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


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

您可以透過 Compute Engine 手動設定每個核心的執行緒數量值。舉例來說,如果工作負載有下列疑慮,可能就適合停用 SMT (將每個核心的執行緒數設為 1):

  • 效能:減少在每個實體 CPU 核心上執行的執行緒數量,有助於改善高度平行或執行浮點運算的工作負載效能。

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

  • 授權:部分授權協議會規定您可使用的 vCPU 數量。將每個核心的執行緒數量從 2 個減少為 1 個,可能會降低授權費用。詳情請參閱您的授權協議。

對於許多一般運算工作或需要大量 I/O 的工作,SMT 可大幅提高應用程式傳輸量。對於運算受限的工作,如果兩個虛擬核心都是運算受限,SMT 可能會影響整體應用程式效能,並導致工作出現無法預測的變化。在這種情況下,關閉 SMT 可讓效能更穩定,並縮短工作時間。

限制

  • 您無法為下列機型設定 VM 上每個核心的執行緒數量:

  • 對於 C3 和 X4 裸機執行個體,您可存取的超執行緒數量等同於機器上的超執行緒數量。

  • 在 Google Cloud 控制台中,如果每個核心的執行緒數設為 1,CPU 使用率指標最多只能擴增至 50%。當每個核心的執行緒數量設為 2 時,CPU 使用率指標可擴大至 100%。

定價

系統會依據 VM 機器類型定義的 vCPU 數量收費,而非在每個核心上執行的執行緒數量。舉例來說,n2-standard-8 機器類型最多可執行 8 個 vCPU,也就是每個 4 個實體 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 的其他設定,然後按一下「Create」

gcloud

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

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

  • VM_NAME:新 VM 的名稱。
  • ZONE:新 VM 的可用區。
  • MACHINE_TYPE:新虛擬機器的機器類型。必須是具有 2 個以上 vCPU 的機器類型。
  • THREADS_PER_CORE:每個實體核心的執行緒數量。設為 21

執行下列指令:

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 欄位搭配 instances.insert 方法threadsPerCore

使用任何要求資料之前,請先替換以下項目:

  • PROJECT_ID:專案 ID。
  • ZONE:新 VM 的可用區。
  • MACHINE_TYPE:新虛擬機器的機器類型。必須是具有 2 個以上 vCPU 的機器類型。
  • VM_NAME:新 VM 的名稱。
  • THREADS_PER_CORE:每個實體核心的執行緒數量。設為 21

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"
}

變更 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 的「名稱」

  3. 如果 VM 的「狀態」為「執行中」,請按一下「停止」

  4. 按一下 [編輯]

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

  6. 在「vCPUs to core ratio」下拉式清單中,選擇每個核心的執行緒數量。

  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
    

後續步驟