インテル・ハイパースレッディング・テクノロジーの無効化
お客様のインフラストラクチャー構成とアプリケーション・セットアップで必要な場合は、お客様のゲスト仮想マシンでインテル・ハイパースレッディング・テクノロジー (インテル HT テクノロジー) を無効にすることができます。
このトピックにおける、ゲスト VM でインテル・ハイパースレッディング・テクノロジーを無効にするための説明は、インテル・ベースのプロセッサーを使用するホストにプロビジョンされた仮想サーバーにのみ適用されます。
インテル・ハイパースレッディング・テクノロジーを無効にする理由について
インテル・ハイパースレッディング・テクノロジーは、同時マルチスレッド化 (SMT) を表す用語です。 ハイパースレッディング・テクノロジーでは、各物理コアを 2 つの仮想プロセッサーに分割します。 ハイパースレッディング・テクノロジーは、1 車線の広い道路を、1 車線が比較的狭い 2 車線の道路に変更することに似ています。 この 2 車線の道路は、低速で走行する車と高速で走行する車がある場合、1 車線の道路よりも効率的です。 ハイパースレッディング・テクノロジーは、ファイル入出力、ネットワーク入出力、および CPU に負荷のかかる操作を伴う他の低速の操作がある場合のアプリケーションのパフォーマンスを向上させます。 ハイパースレッディング・テクノロジーのパフォーマンス上の利点は、通常、単一スレッド・モードに対して 0 から 30% の変動があります。 アプリケーションによっては、パフォーマンスが低下する場合もあります。
ハイパースレッディング・テクノロジーは、必ずしも望ましいとは限りません。 望ましくない場合は、このテクノロジーを無効にして、単一スレッド・モードでコアを実行する方がよい場合もあります。 ハイパースレッディング・テクノロジーの無効化を検討する主な理由は 3 つあります。 1 つ目の理由は、ソフトウェア・ライセンスに関連します。 電子設計自動化 (EDA) ツールのプロバイダーなどの多くのレガシー・ソフトウェア・ベンダーは、ハイパースレッディング・テクノロジーと単一スレッド・モードのいずれを使用するかに関係なく、CPU ごとのライセンスが必要になります。 コアをハイパースレッディング・テクノロジー・モードにすると、アプリケーションのパフォーマンスが単一スレッド・モードの 2 倍に向上しない場合でも、単一スレッド・モードの 2 倍のライセンスが必要になります。 この結果、EDA や他の専門の事業者は、ハイパースレッディング・テクノロジーを無効にし、自社のソフトウェアを単一スレッド・モードで実行した方がよいと考えます。
ハイパースレッディング・テクノロジーを無効にする 2 つ目の理由は、ハイパースレッディング・テクノロジーに付随するロード・バランシングの問題とオペレーティング・システムのオーバーヘッドをなくすことです。 ハイパフォーマンス・コンピューティング (HPC) アプリケーションでは、通常物理コアの数と同じ数のメッセージ・パッシング・インターフェース (MPI) タスクを生成し、オペレーティング・システムが個別の物理コア上のそれぞれの MPI タスクを管理できるようにします。 ハイパフォーマンス・テクノロジーが有効になっている場合、オペレーティング・システムは 2 倍の CPU を認識します。 オペレーティング・システムは通常、MPI タスクを 1 基のコアの 2 つのスレッドのいずれかにマップすることをうまく処理する一方で、OS は場合によっては両方のタスクを 1 基の物理コアに配置し、他のコアを解放したままにすることがあります。 1 基の物理コアに両方のタスクを配置し、他のコアを解放すると、システム使用率が最適でなくなり、アプリケーションのパフォーマンスが変動します。 さらに、OS カーネルはアクティブな CPU ごとにデータ構造を割り振り、ハイパースレッディング・テクノロジー・モードでより多くのカーネル・スペースを割り振り、管理オーバーヘッドが軽減されるように、それらのデータ構造を継続的に更新します。 ハイパースレッディング・テクノロジーを無効にしてオペレーティング・システムのオーバーヘッドを軽減することは、多くの HPC アプリケーションが最適なパフォーマンスを達成するために役立ちます。
ハイパースレッディングを無効にする 3 つ目の理由はセキュリティーです。 ユーザーによっては、ハイパースレッディング・テクノロジーの実行に関連するサイド・チャネル攻撃の可能性を回避するために、ハイパースレッディング・テクノロジーを無効にすることを望む場合があります。IBM Cloud では、お客様の 2 台の仮想マシン間で物理コアを共有しないため、この種の攻撃は不可能です。
お客様の構成ではハイパースレッディング・テクノロジーの無効化が適切であると判断した場合は、次のいずれかの方法を使用して、IBM Cloud 内のお客様のゲスト仮想マシン (VM) でこのテクノロジーを無効にすることができます。
お客様のゲスト VM でのハイパースレッディング・テクノロジーの状況の確認とその変更: 基本
仮想マシンが稼働中の場合は、Linux オペレーティング・システムで lscpu
コマンドを使用して、ハイパースレッディング・テクノロジーの状況を確認できます。 以下のような出力が表示されます。
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
...
この例では、Thread(s) per core (コアあたりのスレッド数) に 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 がオンラインであることが示されています。 コア 0 には、兄弟の CPU 0 と CPU 1 があります。 兄弟リストを取得するには、次の例に示すように、デバイスのファイル・システム内の thread_sibling_list
内にそのデータがあります。
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)を書き込むことで、シングルコアのハイパースレッディングテクノロジーを無効にすることができます。 例えば、コア 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
前述のプロセスをコアごとに繰り返して、VM のハイパースレッディング・テクノロジーを無効にすることができます。 VM に多数の 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 の online フィールドに 1 を書き込みます。
echo 1 > /sys/devices/system/cpu/cpu5/online
VM 内のすべてのコアに対するハイパースレッディング・テクノロジーの有効化
また、次の単純な bash スクリプトを使用して、VM のハイパースレッディング・テクノロジーを有効にすることもできます。
#!/bin/bash
for vcpu in `lscpu --extended | grep "no" | awk '{print $1}'`; do
echo 1 > /sys/devices/system/cpu/cpu$vcpu/online
done
お客様のゲスト VM でのハイパースレッディング・テクノロジーの有効化および無効化: スクリプト
また、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
VM 内のすべてのコアについて、ハイパースレッディング・テクノロジーの状況の取得、ハイパースレッディング・テクノロジーの無効化、およびハイパースレッディング・テクノロジーの有効化を行うことができます。 ただし、コアのサブセットでハイパースレッディング・テクノロジーを無効にする必要がある場合は、『基本』セクションの手順に従ってください。
ブート時のお客様のゲスト VM でのハイパースレッディング・テクノロジーの有効化および無効化: ユーザー・データ
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 に挿入することができます。