全部產品
Search
文件中心

Elastic High Performance Computing:關閉CPU超執行緒以提升叢集效能

更新時間:Jul 06, 2024

E-HPC叢集的每個計算節點都是一台ECS執行個體,預設情況下,ECS執行個體均已開啟CPU超執行緒。在部分HPC情境下,需要關閉CPU超執行緒以獲得更好的效能表現。本文介紹如何關閉計算節點的CPU超執行緒。

背景資訊

CPU是中央處理器,一個CPU可以包含若干個物理核,通過超執行緒HT(Hyper-Threading)技術可以將一個物理核變成兩個邏輯處理核。ECS的超執行緒基於HT技術,允許在一個物理核上並發地運行兩個線程(Thread),一個線程可以視為一個vCPU,vCPU是ECS執行個體的虛擬處理核。在部分HPC情境下,需要關閉計算節點的CPU超執行緒,使得計算節點獲得更好的效能表現。

注意事項

各類型執行個體規格是否支援關閉超執行緒如下:

  • 僅部分企業級x86計算規格的ECS執行個體支援關閉超執行緒,具體請參見規格限制

  • ECS Bare Metal Instance不支援直接關閉超執行緒,但可以從軟體層面關閉超執行緒。

  • Super Computing ClusterSCC預設已關閉超執行緒。

企業級x86計算規格執行個體關閉超執行緒

建立叢集後,如果需要擴容計算節點,可以配置擴容的計算節點是否開啟超執行緒。

重要

對於企業級x86計算規格的ECS執行個體,建立後不支援關閉超執行緒。

手動擴容

手動擴容時,在建立節點頁簽下,可以配置執行個體是否開啟HT。具體操作,請參見手動擴容叢集

手動擴容關閉HT-..png

自動調整

配置自動調整時,在全域配置地區,可以配置執行個體是否開啟HT。具體操作,請參見配置自動調整

自動調整配置HT..png

ECS Bare Metal Instance關閉超執行緒

ECS Bare Metal Instance可以在執行個體建立後在軟體層面(GuestOS內部)關閉超執行緒,包括設定nr_cpus和改變vCPU狀態兩種方式。GuestOS內部要關閉HT,實際上是要類比一個物理核上對應一個邏輯核,所以將每個物理核上的對應一個邏輯核關閉,保留一個物理核對應一個邏輯核就能達到關閉超執行緒的效果,可以理解為offline一半的vCPU,且這些vCPU均一一分布在對應的物理核上。

說明

對於裸金屬伺服器,實際需要在主板BIOS上關閉超執行緒,這涉及到硬體重啟,鏈路較長且相對較慢,無法保證SLA。因此提供設定兩種軟體層面的方式,可以實作類別似關閉超執行緒的效果。

方式

優點

缺點

設定nr_cpu

lscpucpuid等命令返回看到的內部實際使用CPU數就是物理CPU數,不會看到offline的vCPU,基本達到關閉超執行緒的效果和CPU核心數顯示。

  • 一旦設定了nr_cpus=執行個體規格vCPU/2,offline的一半vCPU在執行個體啟動並執行情況下無法再使用,必須要刪除nr_cpus參數,然後重啟執行個體才能恢複所有vCPU。

  • 如果設定了nr_cpus=執行個體規格vCPU/2,建議您在建立自訂鏡像前刪除該參數,否則如果使用自訂鏡像建立不同規格的執行個體,會碰到只能識別部分物理核的情況,此時必須要重新設定nr_cpus。

改變vCPU狀態

通過命令改變vCPU狀態時無需重啟執行個體。配置後可以使用echo 1 > /sys/devices/system/cpu/cpu$cpunum/online恢複offline的vCPU且無需重啟執行個體。

  • lscpucpuid等命令返回的資訊中可以看到對應offline的vCPU。

  • 有些License檢測到的還是全量CPU。

  • 執行個體重啟後,需要重新設定一次。

重要

由於實際生產業務多樣,阿里雲無法真實類比上述兩種方式是否會對業務產生影響。在實際生產環境中使用兩種軟體層面的方式關閉超執行緒時,請您務必做好測試,確認是否對您的業務有所影響。

設定nr_cpus

nr_cpus是一個核心參數,作用是限定核心最大支援的CPU數量,取值範圍為2~255。如果要實現關閉超執行緒的效果,可以設定nr_cpus=執行個體規格vCPU/2,這樣核心支援的最大CPU數量就只有實際規格的一半,實際只使用一半的vCPU,達到offline一半vCPU的要求,並且nr_cpus offline的一半vCPU均是lscpu命令可以看到的後一半vCPU,實際對應offline的就是每個物理核上的一個邏輯核。

以ecs.ebmc6me.16xlarge規格為例,該規格有64個vCPU,作業系統是CentOS 7,設定nr_cpus的操作步驟如下:

  1. 遠端連線ECS Bare Metal Instance。具體操作,請參見通過密碼或密鑰認證登入Linux執行個體

  2. 執行lscpu命令查看vCPU情況,確認執行個體是否已開啟超執行緒。

    預期返回如下,如果CPU(s)的值和執行個體規格的vCPU數一致,且Thread(s) per core為2,則表明該執行個體開啟了超執行緒。

    裸金屬CPU..png

  3. 修改grub檔案。

    vim /boot/grub2/grub.cfg

    i進入編輯模式,添加nr_cpus=執行個體規格vCPU/2,此處樣本為nr_cpus=32。然後按Esc鍵退出編輯模式,輸入:wq儲存配置。

    裸金屬CPU111..png

  4. 重啟ECS執行個體。

  5. 查看效果。

    1. 執行lscpu命令查看vCPU情況。

      預期返回如下,可以看到CPU(s)為32,且Thread(s) per core為1,表明執行個體已關閉超執行緒。

      裸金屬CPU1..png

    2. 執行lscpu --extend命令,確認vCPU分布情況。

      預期返回如下,可以看到32個vCPU分布在32個物理核上,實現了關閉超執行緒的效果。

      裸金屬CPU11..png

改變vCPU狀態

您可以通過命令改變vCPU的狀態,實現offline一半vCPU,即offline每個物理核的一個邏輯核。

以ecs.ebmc6me.16xlarge規格為例,該規格有64個vCPU,作業系統是CentOS 7,改變vCPU狀態的操作步驟如下:

  1. 遠端連線ECS Bare Metal Instance。具體操作,請參見通過密碼或密鑰認證登入Linux執行個體

  2. 執行lscpu命令查看vCPU情況,確認執行個體是否已開啟超執行緒。

    預期返回如下,如果CPU(s)的值和執行個體規格的vCPU數一致,且Thread(s) per core為2,則表明該執行個體開啟了超執行緒。

    裸金屬CPU..png

  3. 建立並執行指令碼,改變vCPU狀態。

    1. 建立指令碼。

      vim test.sh

      指令碼內容如下:

      #!/bin/bash
      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
    2. 執行指令碼。

      sh test.sh
  4. 查看效果。

    1. 執行lscpu命令查看vCPU情況。

      預期返回如下,可以看到後32個vCPU已經offline,且Thread(s) per core為1,表明執行個體已關閉超執行緒。

      裸金屬CPU22..png

    2. 執行lscpu --extend命令,確認vCPU分布情況。

      預期返回如下,可以看到後32個vCPU已經offline,且均為每個物理核上的一個邏輯核。

      裸金屬CPU2..png