多執行緒並行 (SMT) 功能 (在 Intel 處理器上稱為超執行緒技術 (HTT)) 可讓 CPU 核心以兩個硬體多執行緒的形式執行。在 Compute Engine 中,每個虛擬 CPU (vCPU) 都會實作為單一硬體多執行緒,且預設兩個 vCPU 會共用每個實體 CPU 核心。
Compute Engine 可讓您手動設定每個核心的執行緒數量值。舉例來說,如果工作負載有下列疑慮,停用 SMT (將每個核心的執行緒數量設為 1) 可能會有幫助:
效能:減少每個實體 CPU 核心執行的執行緒數量,有助於提升高度平行或執行浮點運算的工作負載效能。
安全性:如果 VM 執行不受信任的程式碼,減少每個核心的執行緒數量有助於降低 CPU 安全漏洞,例如微架構資料取樣。
授權:部分授權協議會對您使用的 vCPU 數量設下限制。將每個核心的執行緒數量從 2 個減少為 1 個,或許可以降低授權費用。詳情請參閱授權協議。
對於許多一般運算工作或需要大量 I/O 的工作,SMT 可以大幅提升應用程式輸送量。如果運算受限的工作中,兩個虛擬核心都受限於運算,SMT 可能會阻礙整體應用程式效能,並為工作增加無法預測的變異數。在這種情況下,關閉 SMT 可提供更可預測的效能,並縮短作業時間。
限制
您無法為下列機型的 VM 設定每個核心的執行緒數量:
- 所有 C4A 機型
- 所有 H3 機型
- 所有 Tau T2A 機型
- 所有 Tau T2D 機型
- 少於 2 個 vCPU 的機器類型,例如
n1-standard-1
- 共用核心機器類型,例如
e2-small
。
如果是裸機執行個體,您可存取的超執行緒數量等同於機器上的超執行緒數量。
在 Google Cloud 控制台中,如果每個核心的執行緒數量設為 1,CPU 使用率指標最多只能擴充至 50%。如果每個核心的執行緒數設為 2,CPU 使用率指標最高可達 100%。
定價
系統會依據 VM 機型定義的 vCPU 數量收費,而非根據每個核心執行的執行緒數量收費。舉例來說,n2-standard-8
機器類型最多可執行 8 個 vCPU,也就是每個實體 CPU 核心 2 個 vCPU。如果您決定只為每個核心執行 1 個執行緒 (也就是 4 個 vCPU),但使用 n2-standard-8
機器類型,系統仍會向您收取 8 個 vCPU 的費用。如要進一步瞭解 VM 的計費方式,請參閱 VM 執行個體定價。
在建立 VM 時變更每個核心的執行緒數量
如要在建立 VM 時變更每個核心的執行緒數量,請使用Google Cloud 控制台、gcloud CLI 或 Compute Engine API。
這項工作需要的權限
如要執行這項工作,您必須具備以下權限:
- 建立新 VM 所需的所有權限
主控台
如要在建立 VM 時變更每個核心的執行緒數量,請使用下列Google Cloud 控制台程序:
前往 Google Cloud 控制台的「Create an instance」(建立執行個體) 頁面。
在「Name」(名稱) 欄位,輸入 VM 的名稱。
選擇 VM 的「Region」(地區) 和「Zone」(區域)。
選擇機器系列和支援的機器類型。
按一下「進階設定」展開該部分。
在「vCPUs to core ratio」(vCPU 與核心比率) 中,選擇每個核心的執行緒數量。
完成 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 的機器類型。必須是具有 2 個以上 vCPU 的機器類型。
- 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-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 控制台程序操作:
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
按一下 VM 的「名稱」。
按一下「停止」
停止 VM。如果沒有「停止」選項,請依序點選 「更多動作」> 「停止」。按一下 [編輯]。
按一下「進階設定」展開該部分。
在「vCPUs to core ratio」(vCPU 與核心比率) 下拉式清單中,選擇每個核心的執行緒數量。
按一下 [儲存]。
gcloud
如要變更現有 VM 的每個核心執行緒數量,請按照下列步驟操作:
使用下列
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 的可用區
在 FILE_PATH 中儲存的 VM 設定檔中,更新
threadsPerCore
的值。如果檔案中沒有該值,請新增下列內容:advancedMachineFeatures: threadsPerCore: THREADS_PER_CORE
使用下列
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
:專案 IDZONE
:包含 VM 的可用區VM_NAME
:要匯出屬性的 VM 名稱THREADS_PER_CORE
:每個核心的執行緒數量
查看每個核心的執行緒數量
如要查看每個核心的執行緒數量,請使用與 VM 執行的 OS 相對應的程序。
Linux
如要查看 Linux VM 每個核心的執行緒數量,請按照下列步驟操作:
請執行
lscpu
指令。lscpu
查看輸出內容,瞭解每個核心的執行緒數量。
在下列
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 每個核心的執行緒數量,請按照下列程序操作:
啟動 Powershell。
執行下列指令。
Get-WmiObject -Class Win32_processor | Select-Object NumberOfCores, @{Name="Thread(s) per core";Expression={$_.NumberOfLogicalProcessors/$_.NumberOfCores}}
查看輸出內容,瞭解每個核心的執行緒數量。
在下列
n2-standard-16
機器的範例輸出中,每個核心的執行緒數值為1
,如Thread(s) per core
欄所示。NumberOfCores Thread(s) per core ------------- ------------------ 8 1