多執行緒並行 (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 上每個核心的執行緒數量:
- 所有 C4A 機型
- 所有 H3 機型
- 所有 Tau T2A 機型
- 所有 Tau T2D 機型
- 機器類型 (例如
n1-standard-1
),其 vCPU 數量少於 2 個 - 共用核心機器類型,例如
e2-small
。
對於 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 控制台程序:
前往 Google Cloud 控制台的「Create an instance」(建立執行個體) 頁面。
在「Name」欄位中,輸入 VM 的名稱。
為 VM 選擇地區和可用區。
選擇機器系列和支援的機器類型。
按一下「進階設定」展開該部分。
在「vCPU 與核心比率」中,選擇每個核心的執行緒數量。
完成 VM 的其他設定,然後按一下「Create」。
gcloud
如要在建立 VM 時變更每個核心的執行緒數量,請使用 gcloud compute instances create
指令。
使用下列任何指令資料之前,請先替換以下項目:
- VM_NAME:新 VM 的名稱。
- ZONE:新 VM 的可用區。
- MACHINE_TYPE:新虛擬機器的機器類型。必須是具有 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
欄位搭配 instances.insert
方法。threadsPerCore
使用任何要求資料之前,請先替換以下項目:
- PROJECT_ID:專案 ID。
- ZONE:新 VM 的可用區。
- MACHINE_TYPE:新虛擬機器的機器類型。必須是具有 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」下拉式清單中,選擇每個核心的執行緒數量。
按一下 [儲存]。
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