離れた施設で金融取引アプリケーションを実行しているシステムがあります。 ILO/DRACにアクセスできませんが、ハイパースレッディングを無効にする必要があります。システムはIntel Westmere 3.33GHz X5680ヘキサコアCPUを実行します。再起動することはできますが、パフォーマンスの問題が原因でシステムがハイパースレッディングを有効にしないようにしたいのですが。 Linux内からこれを行うクリーンな方法はありますか?
編集:カーネルブートコマンドラインに追加されたnoht
ディレクティブが機能しませんでした。 RHELについても同様です。
ILO/Dracに入るまで待たなければなりませんでした。カーネルブートパラメーターは、現在のLinuxディストリビューションでは機能しません。
必要に応じて、実行時にこれを行うことができます。私はここで説明されている素敵な解決策を見つけました: http://www.absolutelytech.com/2011/08/01/how-to-disable-cpu-cores-in-linux/
ステップ1:オフにするLinux CPUを特定します。
cat /proc/cpuinfo
同じ「コアID」を持つCPUを探します。各ペアの1つをオフにします。
ステップ2:ハイパースレッディングCPUをオフにします(私の場合、Linuxで表示される合計8つの「CPU」のうち最後の4つ)。
echo 0 > /sys/devices/system/cpu/cpu4/online
echo 0 > /sys/devices/system/cpu/cpu5/online
echo 0 > /sys/devices/system/cpu/cpu6/online
echo 0 > /sys/devices/system/cpu/cpu7/online
システムの起動直後に実行するスクリプトを自分で設定できます。
ハイパースレッディングを無効にするには、マシン/etc/rc.localにスクリプトを含めます。クリーンではありませんが、インストールは簡単で、CPUアーキテクチャに依存せず、最新のLinuxディストリビューションで動作します。
nano /etc/rc.local
# place this near the end before the "exit 0"
for CPU in /sys/devices/system/cpu/cpu[0-9]*; do
CPUID=$(basename $CPU)
echo "CPU: $CPUID";
if test -e $CPU/online; then
echo "1" > $CPU/online;
fi;
COREID="$(cat $CPU/topology/core_id)";
eval "COREENABLE=\"\${core${COREID}enable}\"";
if ${COREENABLE:-true}; then
echo "${CPU} core=${CORE} -> enable"
eval "core${COREID}enable='false'";
else
echo "$CPU core=${CORE} -> disable";
echo "0" > "$CPU/online";
fi;
done;
Linuxカーネル情報とコントロールには、最新のLinuxディストリビューションの/ sysディレクトリにあるファイルとしてアクセスできます。例えば:
/ sys/devices/system/cpu/cpには、カーネル情報と論理CPU 3の制御が含まれています。
cat/sys/devices/system/cpu/cpu3/topology/core_idは、この論理CPUが属するコア番号を示します。
echo "0">/sys/devices/system/cpu/cpu3/online論理CPU 3を無効にすることができます。
理由は正確にはわかりませんが、ハイパースレッディングをオフにすると、システムの応答性が向上します(私のi5ノートブックと60以上のコアを持つ大規模なXeonサーバー上)。これは、CPUごとのキャッシュ、CPUごとのメモリ割り当て、CPUスケジューラの割り当て、およびプロセスの優先順位の複雑な反復に関係していると思います。ハイパースレッディングの利点は、それをどのように使用するかを知っているCPUスケジューラを作成することの複雑さにより、圧倒的に優れていると思います。
私にとって、ハイパースレッディングの問題は次のとおりです。論理コアと同じ数のCPU集中型スレッドを開始すると、CPU集中型タスクのコンテキストスイッチは高速になりますが、ハイパースレッディングは完全にCPUを多用するタスク。一方、物理コアと同じ数のCPU集中型スレッドを開始すると、これらのタスクへのコンテキストスイッチやバックグラウンドタスクの高速コンテキストスイッチがなくなります。良さそうに見えますが、バックグラウンドタスクは空き論理プロセッサを見つけ、ほぼ中間的に実行されます。リアルタイムのパフォーマンスのようです(Nice -20)。
最初のシナリオでは、ハイパースレッディングは役に立たず、通常の処理でハイパースレッディングを使い果たしたため、バックグラウンドタスクは高価なコンテキストスイッチを使用します。 2つ目は許容できません。私のCPU電力の最大50%がバックグラウンドタスクに優先されるからです。
私が話している「CPU集約型」のタスクは、人工知能データマイニングおよび認証サーバー(私の仕事)です。安いコンピューターとクラスターでのブレンダーレンダリング(私の未来の家をスケッチするため)。
また、これは当て推量です。
私は良い印象を持っていますが、そうではないかもしれません。
各コアの「thread_siblings_list」を使用して、HTペアの2番目のコアをオフにすることができます。
次のコマンドパイプラインはハッキングされており、最適化されていません。理解しやすくするために、この方法でうまくいけばうまくいきます。
cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | \
awk -F, '{print $2}' | \
sort -n | \
uniq | \
( while read X ; do echo $X ; echo 0 > /sys/devices/system/cpu/cpu$X/online ; done )
そのため、すべてのスレッド兄弟リストを取得し、各ペアの2番目のCPUを抽出し、一意のリストを取得して、それらをオフにします。
これは意味がありますか?
上記を実行した後で「cat/proc/cpuinfo」を実行すると、コアの数が半分になります。
本当に古いカーネル(Linux 2.6.9程度)の場合、ブート時にnohtパラメータをカーネルに追加します。
このカーネルコマンドラインオプション 少なくともLinux 2.6.18以降は削除されています 。
http://www.faqs.org/docs/Linux-HOWTO/BootPrompt-HOWTO.html から:
The `noht' Argument
This will disable hyper-threading on intel processors that have this feature.
Liloを使用している場合は/etc/lilo.confを編集し(その後liloを実行します)、またはgrubを使用している場合は/boot/grub/menu.lstを編集します。
新しいカーネルは、同時マルチスレッド(SMT)コントロールを提供します。
SMTの状態は次の方法で確認できます。
cat /sys/devices/system/cpu/smt/active
状態を変更する
echo off > /sys/devices/system/cpu/smt/control
オプションは次のとおりです。
これをLinuxカーネル4.4.0でテストしました
Lukasの答えはいいですが、コアIDはHT兄弟の識別に使用できないため、HTを無効にすることはできません。このスクリプトは代わりに機能します。
#!/bin/bash
for CPU in /sys/devices/system/cpu/cpu[0-9]*; do
CPUID=`basename $CPU | cut -b4-`
echo -en "CPU: $CPUID\t"
[ -e $CPU/online ] && echo "1" > $CPU/online
THREAD1=`cat $CPU/topology/thread_siblings_list | cut -f1 -d,`
if [ $CPUID = $THREAD1 ]; then
echo "-> enable"
[ -e $CPU/online ] && echo "1" > $CPU/online
else
echo "-> disable"
echo "0" > $CPU/online
fi
done
HTを無効にする:
echo 0 |Sudo tee /sys/devices/system/cpu/cpu{4..7}/online
HTを有効にする:
echo 1 |Sudo tee /sys/devices/system/cpu/cpu{4..7}/online
注:これは実際にはハイパースレッディングを無効にするわけではありませんが、「偽の」コアを無効にするので、ほぼ同じ結果が得られます。
古いトピックですが、この実験を試す理由がありました。まず、実行時に(わずかに偽の)CPUを無効にすることが、起動時にハイパースレッディングを無効にすることとまったく同じであるかどうか、私はまったく確信がありません。とはいえ、アプリケーションのパフォーマンスが少し向上しました。 (しかし、保持するのに十分ではありません。)
thread_siblings値(ハイパースレッドCPUに共通)を有効化/無効化のキーとして使用:
for i in /sys/devices/system/cpu/cpu[0-9]*
do echo "$(cat $i/topology/thread_siblings) $i"
done |
awk '{v = (a[$1] ? 0 : 1); a[$1] = 1; print "echo " v " > " $2 "/online"}' |
Sudo sh
コマンドを最後のSudo shなしで試して、正しいことを確認します。
Libsmbios-binパッケージ(Debian、Ubuntuなど)には、バイナリーisCmosTokenActiveとactivateCmosTokenがあります。 トークンリスト と組み合わせて、次のようなことを試すことができます。
# isCmosTokenActive 0x00d1 # CPU_Hyperthreading_Enable
[...] Type 0x00d1 Location 0x46 AND(fe) OR(0) BITFIELD: 1
# isCmosTokenActive 0x00d2 # CPU_Hyperthreading_Disable
[....] Type 0x00d2 Location 0x46 AND(fe) OR(1) BITFIELD: 0
次に、CPU_Hyperthreading_Disableトークンをアクティブにします。
# activateCmosToken 0x00d2 # CPU_Hyperthreading_Disable
[...] Type 0x00d2 Location 0x46 AND(fe) OR(1) BITFIELD: 1
確認:
# isCmosTokenActive 0x00d1 # CPU_Hyperthreading_Enable
[...] Type 0x00d1 Location 0x46 AND(fe) OR(0) BITFIELD: 0
# isCmosTokenActive 0x00d2 # CPU_Hyperthreading_Disable
[...] Type 0x00d2 Location 0x46 AND(fe) OR(1) BITFIELD: 1
ここで大きな問題は、これを有効にするために単に再起動が必要かどうか、または完全な電源サイクルが必要かどうかです。試してみて、どうなるか見てください!
Paul Mから提供された情報 に基づいて、ここでは、次のように「スクリプト化」します。
fgrep , /sys/devices/system/cpu/cpu*/topology/thread_siblings_list |
cut -d, -f2 | sort -u |
Sudo xargs -rI, sh -c 'echo 0 > /sys/devices/system/cpu/cpu,/online'
もちろんBIOSをいじるのと同じ意味でハイパースレッディングをオフにしていません。基本的に、カーネルタスクスケジューラにコアを使用しないように指示するだけです。私たちは彼らが偽物であることを知っています。
/proc
または/sys
サブシステムの以前の状態に基づいて想定を行ったソフトウェアは、この実行時の変更が原因で最適化されていないか、失敗する可能性があるため、再起動が必要になる場合があります。 e。 g。、そのような状況ではirqbalance
が失敗する傾向があることに気付きました。