一部の HPC ワークロード (特にメモリ帯域幅や CPU キャッシュの競合の影響を受けやすいワークロード) は、ハイパースレッディング (HT) を無効にするとパフォーマンスが向上します。HT を無効にすると、アクティブな vCPU 数が物理コア数と一致するまで減少します。このトピックでは、E-HPC クラスターのコンピューティングノードで HT を無効にする方法について説明します。
制限事項
先に進む前に、お使いのインスタンスタイプにどの方法が適用されるかを確認してください:
| インスタンスタイプ | HT の動作 | 必要なアクション |
|---|---|---|
| エンタープライズレベルの x86 コンピューティング最適化 ECS インスタンス | インスタンス作成時にのみ無効化できます。インスタンス作成後は変更できません。 | クラスターにノードを追加する際に HT を設定します。 |
| ECS ベアメタルインスタンス | ハードウェアレベルで直接無効にすることはできません。 | このトピックで説明するソフトウェアレベルの方法を使用します。 |
| Super Computing Cluster (SCC) インスタンス | デフォルトで HT は無効になっています。 | アクションは不要です。 |
HT の無効化をサポートするエンタープライズレベルの x86 インスタンスタイプの全リストについては、「インスタンスタイプの制限」をご参照ください。
背景
E-HPC クラスター内の各コンピューティングノードは、Elastic Compute Service (ECS) インスタンスとして動作します。デフォルトでは、すべての ECS インスタンスで HT が有効になっています。HT は、物理コアごとに 2 つの仮想プロセッシングコア (vCPU) を作成し、単一のコアで 2 つのスレッドを同時に実行できるようにします。HT を無効にすると、vCPU 数が物理コア数と一致するまで減少します。
エンタープライズレベルの x86 コンピューティング最適化 ECS インスタンスでの HT の無効化
エンタープライズレベルの x86 コンピューティング最適化 ECS インスタンスは、作成後に HT を無効にすることはできません。クラスターにコンピューティングノードを追加する際に HT 設定を構成してください。
手動スケールアウト
自動スケーリング
ECS ベアメタルインスタンスでの HT の無効化
ベアメタルサーバーで物理的に HT を無効にするには、BIOS の設定とハードウェアの再起動が必要であり、複雑で中断を伴います。代わりに、以下のいずれかのソフトウェアレベルの方法を使用して、ゲスト OS 内で同じ効果を実現します。
これらの方法は、実行中のワークロードに影響を与える可能性があります。本番環境に適用する前に、テスト環境で影響を評価してください。
各物理コアは 2 つの vCPU に対応します。どちらの方法も、物理コアごとに 1 つの vCPU を非アクティブ化し、アクティブな vCPU を 1 つだけ残します。これは、ハードウェアレベルで HT を無効にするのと実質的に同じ結果になります。
方法の選択
nr_cpus の設定 | vCPU ステータスの変更 | |
|---|---|---|
| 再起動が必要 | はい | いいえ |
lscpu の出力 | アクティブな CPU のみ表示 | オフラインのものを含むすべての CPU を表示 |
| 永続性 | 再起動後も維持される | 再起動時にリセットされる |
| ソフトウェアライセンスのリスク | 低い | 一部のライセンスでは、オフラインの CPU もすべてカウントされることがあります。 |
| カスタムイメージに関する注意 | カスタムイメージを作成する前に nr_cpus を削除しないと、他のインスタンスタイプがすべての物理コアを認識しない場合があります | 特別なアクションは不要 |
nr_cpus の設定
vCPU ステータスの変更
この方法は、インスタンスを再起動せずに、ランタイムに vCPU をオフラインにします。インスタンスが再起動されると、設定はリセットされます。すべての vCPU を復元するには、オフラインの各 vCPU に対して次のコマンドを実行します:
echo 1 > /sys/devices/system/cpu/cpu$cpunum/online以下の手順では、ecs.ebmc6me.16xlarge インスタンス (64 vCPU、CentOS 7) を例に説明します。
HT が有効になっていることを確認します:
lscpu出力では、
CPU(s)は vCPU の総数であり、Thread(s) per coreは2です。~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 64 On-line CPU(s) list: 0-63 Thread(s) per core: 2 Core(s) per socket: 16 Socket(s): 2 NUMA node(s): 2 Vendor ID: GenuineIntel CPU family: 6 Model: 85 Model name: Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz Stepping: 7 CPU MHz: 2799.896 CPU max MHz: 3900.0000 CPU min MHz: 1000.0000 BogoMIPS: 4600.00 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 1024K L3 cache: 22528K NUMA node0 CPU(s): 0-15,32-47 NUMA node1 CPU(s): 16-31,48-63 Flags: fpu vme de pse tsc msr pae mce cx8 apic se各物理コアの 2 番目のスレッドをオフラインにするスクリプトを作成します:
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スクリプトを実行します:
sh test.sh結果を確認します:
lscpu期待される出力では、32 個の vCPU がオフラインであり、
Thread(s) per core: 1と表示されます。この応答は、インスタンスで HT が無効になっていることを示しています。物理コア全体での vCPU の分布を確認するには、lscpu --extend期待される出力は、32 個の物理コアに分散された 32 個のオンライン vCPU を示します。
# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 64 On-line CPU(s) list: 0-31 Off-line CPU(s) list: 32-63 Thread(s) per core: 1 Core(s) per socket: 16 Socket(s): 2 NUMA node(s): 2 Vendor ID: GenuineIntel CPU family: 6 Model: 85 Model name: Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz Stepping: 7 CPU MHz: 2800.036 CPU max MHz: 3900.0000 CPU min MHz: 1000.0000 BogoMIPS: 4600.00 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 1024K L3 cache: 22528K NUMA node0 CPU(s): 0-15 NUMA node1 CPU(s): 16-31 Flags: fpu vme de pse tsc msr pae mce cx8 apic s pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg f[root@iZuf6d2vgqoyhr~]# lscpu --extend CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ 0 0 0 0 0:0:0:0 yes 3900.0000 1000.0000 1 0 0 1 1:1:1:0 yes 3900.0000 1000.0000 2 0 0 2 2:2:2:0 yes 3900.0000 1000.0000 3 0 0 3 3:3:3:0 yes 3900.0000 1000.0000 4 0 0 4 4:4:4:0 yes 3900.0000 1000.0000 5 0 0 5 5:5:5:0 yes 3900.0000 1000.0000 6 0 0 6 6:6:6:0 yes 3900.0000 1000.0000 7 0 0 7 7:7:7:0 yes 3900.0000 1000.0000 8 0 0 8 8:8:8:0 yes 3900.0000 1000.0000 9 0 0 9 9:9:9:0 yes 3900.0000 1000.0000 10 0 0 10 10:10:10:0 yes 3900.0000 1000.0000 11 0 0 11 11:11:11:0 yes 3900.0000 1000.0000 12 0 0 12 12:12:12:0 yes 3900.0000 1000.0000 13 0 0 13 13:13:13:0 yes 3900.0000 1000.0000 14 0 0 14 14:14:14:0 yes 3900.0000 1000.0000 15 0 0 15 15:15:15:0 yes 3900.0000 1000.0000 16 1 1 16 16:16:16:1 yes 3900.0000 1000.0000 17 1 1 17 17:17:17:1 yes 3900.0000 1000.0000 18 1 1 18 18:18:18:1 yes 3900.0000 1000.0000 19 1 1 19 19:19:19:1 yes 3900.0000 1000.0000 20 1 1 20 20:20:20:1 yes 3900.0000 1000.0000 21 1 1 21 21:21:21:1 yes 3900.0000 1000.0000 22 1 1 22 22:22:22:1 yes 3900.0000 1000.0000 23 1 1 23 23:23:23:1 yes 3900.0000 1000.0000 24 1 1 24 24:24:24:1 yes 3900.0000 1000.0000 25 1 1 25 25:25:25:1 yes 3900.0000 1000.0000 26 1 1 26 26:26:26:1 yes 3900.0000 1000.0000 27 1 1 27 27:27:27:1 yes 3900.0000 1000.0000 28 1 1 28 28:28:28:1 yes 3900.0000 1000.0000 29 1 1 29 29:29:29:1 yes 3900.0000 1000.0000 30 1 1 30 30:30:30:1 yes 3900.0000 1000.0000 31 1 1 31 31:31:31:1 yes 3900.0000 1000.0000 32 - - - ::: no - - 33 - - - ::: no - - 34 - - - ::: no - - 35 - - - ::: no - - 36 - - - ::: no - - 37 - - - ::: no - - 38 - - - ::: no - - 39 - - - ::: no - - 40 - - - ::: no - - 41 - - - ::: no - - 42 - - - ::: no - - 43 - - - ::: no - - 44 - - - ::: no - - 45 - - - ::: no - - 46 - - - ::: no - - 47 - - - ::: no - - 48 - - - ::: no - - 49 - - - ::: no - - 50 - - - ::: no - - 51 - - - ::: no - - 52 - - - ::: no - - 53 - - - ::: no - - 54 - - - ::: no - - 55 - - - ::: no - - 56 - - - ::: no - - 57 - - - ::: no - - 58 - - - ::: no - - 59 - - - ::: no - - 60 - - - ::: no - - 61 - - - ::: no - - 62 - - - ::: no - - 63 - - - ::: no - -