禁用 Intel 超執行緒技術
如果您的基礎架構配置和應用程式設定需要,您可以在來賓虛擬機器上停用英特爾超執行緒技術(Intel HT 技術)。
本主題中有關在來賓 VM 上停用 Intel 超執行緒技術的說明僅適用於在使用基於 Intel 的處理器的主機上調配的虛擬伺服器。
了解禁用英特爾超線程技術的原因
英特爾超線程技術是描述同時多線程 (SMT) 的術語。 超執行緒技術將每個實體核心分成兩個虛擬處理器。 超線程技術就像將一條單車道的寬路分成兩個相對較窄的車道。 如果交通緩慢和快速,雙車道高速公路比單車道道路提供更好的服務。 當檔案 I/O、網路 I/O 和其他較慢的操作與 CPU 密集型操作混合時,超線程技術可提供更好的應用程式效能。 與單線程模式相比,超線程技術的效能優勢通常為 0 - 30%。 某些應用程式的效能也可能會下降。
超線程技術並不總是可取的。 在這種情況下,您可能更願意停用它並以單執行緒模式運行核心。 考慮禁用超線程技術的三個主要原因。 第一個原因與軟體許可有關。 許多傳統軟體供應商(例如電子設計自動化 (EDA) 工具提供者)都需要每個 CPU 的許可證,無論它們使用超線程技術還是單線程模式。 當核心處於超執行緒技術模式時,您需要的許可證數量是單執行緒模式下的兩倍,即使應用程式的效能並未比單執行緒模式好兩倍。 因此,EDA 和其他從業者禁用超線程技術,而更喜歡在單線程模式下運行他們的軟體。
禁用超線程技術的第二個原因是為了避免超線程技術帶來的負載平衡問題和作業系統開銷。 高效能運算 (HPC) 應用程式通常會建立與實體核心數量一樣多的消息傳遞介面 (MPI) 任務,並讓作業系統在不同的實體核心上管理每個 MPI 任務。 啟用超線程技術後,作業系統看到的 CPU 數量是原來的兩倍。 雖然作業系統通常可以很好地將 MPI 任務映射到核心的兩個執行緒之一,但作業系統有時可能會將這兩個任務放在物理核心上,而讓其他核心空閒。 將這兩個任務放在物理核心上而其他核心空閒會導致系統利用率不佳和應用程式效能不穩定。 另外,作業系統核心為每個活動CPU分配資料結構並不斷更新,從而在超線程技術模式下分配更多的核心空間,減輕管理開銷。 透過停用超線程技術來減輕作業系統開銷有助於許多 HPC 應用程式實現最佳效能。
禁用超線程技術的第三個原因是安全性。 一些用戶喜歡停用超線程技術,以避免與超線程技術執行相關的任何旁道攻擊可能性。IBM Cloud兩個客戶的虛擬機器之間不共享實體核心,因此這種攻擊是不可能的。
如果您確定停用超線程技術適合您的配置,則可以使用下列方法之一在來賓虛擬機器 (VM) 上停用它:IBM Cloud。
檢查超線程技術狀態並在我的來賓虛擬機中更改它:基礎知識
當虛擬機器啟動並運行時,您可以使用以下命令查看超線程技術狀態:lscpu
命令開啟Linux作業系統。 您會看到類似以下的輸出:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 2
Core(s) per socket: 4
...
在此範例中,請注意每個核心的線程數顯示2,表示超線程技術已啟用。 VM 有 4 個實體核心和 8 個虛擬 CPU。 現代版的Linux核心允許用戶在每個核心的基礎上禁用超線程技術。 您可以在啟用超線程技術的情況下運行某些內核,而在禁用超線程技術的情況下運行其他內核。 要在每個核心的基礎上查看這一點,您可以使用以下命令 lscpu --extended
。 您會看到類似以下的輸出:
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE
0 0 0 0 0:0:0:0 yes
1 0 0 0 1:1:0:0 yes
2 0 0 1 2:2:1:0 yes
3 0 0 1 3:3:1:0 yes
4 0 0 2 4:4:2:0 yes
5 0 0 2 5:5:2:0 yes
6 0 0 3 6:6:3:0 yes
7 0 0 3 7:7:3:0 yes
上面的範例輸出顯示每個核心有 2 個 CPU,並且兩個 CPU 都在線上。 Core 0 有兄弟姊妹:中央處理器0和中央處理器1。 要獲取兄弟列表,您可以在以下位置找到數據 thread_sibling_list
在 devices 檔案系統中,如下例所示:
cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list
0-1
0-1
2-3
2-3
4-5
4-5
6-7
6-7
某些核心和 CPU 架構使用逗號 ( , ) 而不是連字符 ( - ) 在線程兄弟列表中。
您可以在裝置檔案系統中對應 CPU 的線上欄位寫入 0 (0 ),停用單一核心的超執行緒技術。 例如,若要停用核心 2(上例中為 CPU 5)上的超執行緒技術,請執行下列命令:
echo 0 > /sys/devices/system/cpu/cpu5/online
此命令使 CPU 5 離線,禁用核心 2 上的超線程技術,但使其他核心保持超線程技術模式,如下例所示,當您運行 lscpu --extended
命令:
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE
0 0 0 0 0:0:0:0 yes
1 0 0 0 1:1:0:0 yes
2 0 0 1 2:2:1:0 yes
3 0 0 1 3:3:1:0 yes
4 0 0 2 4:4:2:0 yes
5 - - - ::: no
6 0 0 3 6:6:3:0 yes
7 0 0 3 7:7:3:0 yes
您可以對每個核心重複前面的過程,以停用虛擬機器的超線程技術。 當虛擬機器有很多 CPU 時,這可能會很困難。 以下腳本是一個非常簡單的 bash 腳本,用於在每個核心上停用超線程技術:
#!/bin/bash
for vcpu in `cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | cut -s -d- -f2 | cut -d- -f2 | uniq`; do
echo 0 > /sys/devices/system/cpu/cpu$vcpu/online
done
為特定核心和關聯的 CPU 啟用超執行緒技術
如果您想再次啟用超線程技術,可以透過在每個 CPU 的線上欄位中寫入 1 來實現。
echo 1 > /sys/devices/system/cpu/cpu5/online
為虛擬機器中的所有核心啟用超線程技術
或者,您可以使用以下簡單的 bash 腳本為虛擬機器啟用超線程技術。
#!/bin/bash
for vcpu in `lscpu --extended | grep "no" | awk '{print $1}'`; do
echo 1 > /sys/devices/system/cpu/cpu$vcpu/online
done
在我的來賓虛擬機器中啟用和停用超線程技術:腳本
你也可以嘗試這個 腳本,由 Wyatt Gorman 創建,用於啟用和禁用超線程技術。 下載並執行腳本時,您將獲得以下選項:
OPTIONS
-d | --disable Disable Hyper-Threaded vCPUs
-e | --enable Enable Hyper-Threaded vCPUs
-s | --show Show Hyper-Threading status
-h | --help Display this usage output
您可以取得虛擬機器中所有核心的超線程技術狀態、停用超線程技術以及啟用超線程技術。 但是,如果您需要在部分核心上停用超線程技術,請按照基礎部分中的步驟進行操作。
啟動時啟用和停用來賓虛擬機器中的超線程技術:使用者數據
IBM Cloud提供了一種在建立虛擬伺服器實例時指定可選資料的方法,以配置實例或在配置實例時運行腳本;這稱為用戶資料。
在虛擬伺服器執行個體建立過程中,您可以在「使用者資料」部分指定下列範例程式碼:IBM Cloud安慰:
#cloud-config
bootcmd:
- for cpunum in $(cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | cut -s -d- -f2- | tr ',' '\n' | sort -un); do echo 0 > /sys/devices/system/cpu/cpu$cpunum/online; done
您在使用者資料欄位中提供的腳本會在實例啟動過程中停用超線程技術。 您會看到指示 CPU 已停用的訊息:
dmesg |grep offline
[ 9.488364] smpboot: CPU 1 is now offline
[ 9.544370] smpboot: CPU 3 is now offline
[ 9.572823] smpboot: CPU 5 is now offline
[ 9.600633] smpboot: CPU 7 is now offline
您可以使用類似的方法將此流程注入 Terraform 中。