Linux内からのハイパースレッディングを無効にします(BIOSへのアクセスなし)


26

リモート施設で金融取引アプリケーションを実行しているシステムがあります。ILO / DRACにアクセスできませんが、ハイパースレッディングを無効にする必要があります。システムは、Intel Westmere 3.33GHz X5680 hex-core CPUを実行します。再起動できますが、パフォーマンスの問題によりシステムでハイパースレッディングが有効になっていないことを確認したいです。Linux内からこれを行うクリーンな方法はありますか?

編集:nohtカーネルブートコマンドラインに追加されたディレクティブは機能しませんでした。RHELでも同じです。

参照:https : //bugzilla.redhat.com/show_bug.cgi?id=440321#c9

回答:


21

必要に応じて、実行時にこれを行うことができます。ここで説明されている素晴らしいソリューションを見つけました: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

システムの起動直後に実行するスクリプトを自分でセットアップできます。


1
それは動作しますほとんど私は予想通り。仮想コアが無効になりました。CPUを消費するスレッドを1つ実行すると、物理コアが100%読み込まれます。しかしsysbench --num-threads=1 --test=cpu run、異なるnum-threadsとHTのオンとオフを使用すると、HTを無効にすると、スレッドが多い場合にパフォーマンスが低下し、スレッドが1つしかない場合でもHTをオフにするメリットはありません。したがって、そのままにしておくことをお勧めします。最適です。
セルゲイP.別名紺ure 14

それらを元に戻すコマンドが何であるか知っていますか?回答の冒頭のリンクは無効です〜。ありがとう!
user189035

@ user189035:echo 1代わりにecho 0オンに戻す必要があります。
ピーターコーデス

@ SergeyP.akaazure、金融サービスアプリケーションの場合、HTをオフにする主な理由はパフォーマンスではなくセキュリティだと思います。
サイモンリヒター

@SimonRichterこの質問が最初に書かれた時点では、実際にパフォーマンスでした。SMT / HTは、その時代のCPUの一部のワークロードではそれほど良くありませんでした。Meltdown / Spectreのこと、および最近のForeshadow攻撃は、数年後に起こりました。
マイケルハンプトン

14

マシンの起動時にハイパースレッディングを無効にするスクリプト...

ハイパースレッディングを無効にするには、マシン/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 / cpu3に は、論理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を集中的に使用するスレッドを物理コアと同じ数だけ起動すると、それらのタスクへのコンテキストスイッチやバックグラウンドタスクの高速コンテキストスイッチがなくなります。良いように見えますが、バックグラウンドタスクは無料の論理プロセッサを検出し、ほとんど仲介なしで実行されます。リアルタイムのパフォーマンスのようです(-20)。

最初のシナリオでは、ハイパースレッディングはusellesです。通常の処理でハイパースレッディングを最大にしたため、バックグラウンドタスクは高価なコンテキストスイッチを使用します。2つ目は、CPUパワーの最大50%がバックグラウンドタスクよりも優先されるため、受け入れられません。

私が話している「CPU集中型」タスクは、人工知能データマイニングおよび承認サーバー(私の仕事)です。安価なコンピューターとクラスターでのBlenderのレンダリング(将来の家をスケッチするため)。

また、これは当て推量です。

私はより良い印象を持っていますが、そうではないかもしれません。


私のスクリプトレットは、従うのが少し簡単だと思います。
ポールM

9

本当に古いカーネル(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を編集します。


これはBIOSでHTを無効にすることと機能的に同等ですか?
ewwhite

確かにそれはわかりませんが、はい、nohtはBIOSで無効にすることと同じだと思います。
レム

2
これはGentooシステムです。nohtgrubカーネルコマンドラインのエントリを試しました。システムはnohtコマンドを受け入れませんでした。RHELでも同じです。参照:bugzilla.redhat.com/show_bug.cgi
id

1
これは少なくともLinux 2.6.18以降では廃止されています。nohtカーネルオプションが削除されました。これは残念です。Linuxでは、HTがオンの場合にのみ、Haswell perf-counter errata(BJ122、BV98、HSD29)の回避策が有効になり、initramfsがロードされる前に発生するためです。
ピーターコーデス

9

各コアの「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」を実行すると、コアの数が半分になります。


これは素晴らしい答えです。:私は私の目的のために仕事に次のように変更する必要がありましたecho 0 > /sys/devices/system/cpu/cpu$X/onlineなりecho 0 | sudo tee /sys/devices/system/cpu/cpu$X/online
カルボ

5

新しいカーネルは、同時マルチスレッド(SMT)コントロールを提供します。

SMTの状態は次の方法で確認できます。

cat /sys/devices/system/cpu/smt/active

状態を変更します

echo off > /sys/devices/system/cpu/smt/control

オプションは次のとおりです。

  • オフ
  • 強制退去

これをLinux Kernel 4.4.0でテストしました


こんにちはニック、サイトへようこそ。テスト(およびバージョン)に関する情報は非常に貴重です。
クバンチク

優れた、Ubuntuの16.04.6 LTSでテスト
エルダーオタク

4

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

あなたのスクリプトは私のバリエーションです。念のため、複数のCPUがある場合はどうなるかを確認する必要があります。
ポールM

@PaulM 2ソケットHaswellシステムという、まさに私の目的でテストして使用した場所です。
アントン

0

ILO / Dracに入るまで待たなければなりませんでした。カーネルブートパラメータは、現在のLinuxディストリビューションでは機能しません。


0

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

今、大きな問題は、これを有効にするために単に再起動が必要かどうか、または完全な電源サイクルが必要かどうかです。それを試してみて、それがどうなるかを見てください!


0

ここでポール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サブシステムの以前の状態に基づいて仮定を行ったソフトウェアは、この実行時の変更により最適状態で実行されていないか、失敗する可能性があるため、再起動が必要になる場合があります。たとえばirqbalance、そのような状況では失敗する傾向があることに気付きました。


0

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

注:これは実際にハイパースレッディングを無効にするわけではありませんが、「フェイク」コアを無効にしてほぼ同じ結果を得ます。


私はあなたが使用している方法が好きです tee、これはまだ質問への本当の答えを提供するには至っていません。これらのコマンドは特定のハードウェア構成にのみ適用され、他のハードウェア構成に意図しない影響を与える可能性があります。そして、それらのコマンドが何をするかの説明は完全にありません。
カスパード

0はオフを意味し、1はオンを意味するため、最初は4つのコア(ハイパースレッドをオンにしたクアンドコアの偽8コア)をオフにし、2つ目はオンに戻すことを理解するのは簡単だと思いました...コアそれらの数は{4..7}ではなく{3,4}でなければなりませんオクタコアを使用する場合は{8..15}でなければなりません
Zibri

0

古いトピックですが、この実験を試す理由がありました。まず、実行時に(わずかに偽の)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なしでコマンドを試して、正しいことを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.