Ubuntuでハイパースレッディングを無効にする


13

ubuntu 16.04サーバーを実行しています。lscpuコマンドを使用すると、誇大宣伝スレッドが有効になっていることがわかります。

無効にしたいです。私はubuntuフォーラムここここを通りました

これらは、なぜハイパースレッディングが良くないかもしれないかという良い議論です。しかし、それをオフにする方法に関する決定的なソリューションはありません。

ハイパースレッディングを無効にする手順はありますか?ありがとう。


3
BIOSで無効にしてみましたか?
edwinksl

はい、HTのためのオプションを見つけることができませんでした
ジョン・

回答:


9

前書き

これは興味深い質問です。おそらく私にとって個人的には数ヶ月で最も興味深いものの1つです。OPのように、古いBIOS(2012年に発明され、2016年に更新された)でハイパースレッディングを無効にするオプションはありません。

Intel SkylakeおよびKaby Lakeのハイパースレッディングバグ:

Intel SkylakeまたはKaby Lakeプロセッサを使用している場合は、2か月前に表面化したハイパースレッディングに関するバグレポートを読む必要があります。このUK Registerのストーリーでは、Debian開発者がどのようにハイパースレッディングがマシンをクラッシュさせ、破壊するかを発見しました。

昨年、SkylakeにはAsk Ubuntuで多数の問題が報告されており、ハイパースレッディングのバグが原因である可能性のある問題をどのように見分けるのか疑問に思っています。

この答えは3つの部分に分かれています。

  • ハイパースレッディングがオフ/オンの場合のCPUの表示
  • ハイパースレッディングのオフ/オンを自動化するBashスクリプト
  • ハイパースレッディングを開始する前にオフにするとConkyがクラッシュする

ハイパースレッディングがオフ/オンの場合のCPUの表示

以下に、ハイパースレッディングをオフにしてCPUストレステストを実行したときのCPU使用率を示します。約10秒後、ハイパースレッディングをオンにして同じスクリプトを繰り返します。最後に、ハイパースレッディングをオフにしてスクリプトが実行された10秒後:

ハイパースレッディングの設定

表示は2つのセクションに分かれています。

  • ターミナルウィンドウの左半分set-hyper-threadingで、パラメータ0(オフ)でスクリプトを呼び出し、次に1(オン)で呼び出します。
  • 右半分にconkyは、CPUS 1〜8のCPU使用率が表示されます。

ハイパースレッディングをオフにする最初のスクリプト

スクリプトが初めて実行されるとき、CPU番号2、4、6、および8(Conkyによる)は3%、2%、2%、および2%でフリーズします。CPU番号1、3、5、および7は、ストレステストの実行中に100%に急上昇します。

CPUトポロジは、ハイパースレッディングをオフにして表示され、4つのコアのみが報告されます。

/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu2/topology/core_id:1
/sys/devices/system/cpu/cpu4/topology/core_id:2
/sys/devices/system/cpu/cpu6/topology/core_id:3

ハイパースレッディングを実行する2番目のスクリプト

2回目にスクリプトを実行すると、ハイパースレッディングがオンになり、ストレステストの実行中にすべてのCPU番号1〜8が100%に急上昇します。

CPUトポロジは、ハイパースレッディングをオンにして表示され、4つのコアと4つの仮想コアのみが報告されます。

/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu1/topology/core_id:0
/sys/devices/system/cpu/cpu2/topology/core_id:1
/sys/devices/system/cpu/cpu3/topology/core_id:1
/sys/devices/system/cpu/cpu4/topology/core_id:2
/sys/devices/system/cpu/cpu5/topology/core_id:2
/sys/devices/system/cpu/cpu6/topology/core_id:3
/sys/devices/system/cpu/cpu7/topology/core_id:3

3番目のスクリプトでハイパースレッディングをオフに実行

2番目のスクリプトが終了した後、CPU 2、4、6、および8が4%、2%、3%、4%でアイドル状態になることに注意してください。これは重要です。3番目のテストでは、ハイパースレッディングをオフにすると、CPUの割合が最初のテストの3%、2%、2%、2%ではなく、4%、2%、3%、4%で凍結します。

したがって、ハイパースレッディングをオフにすると、現在の状態で仮想CPUがフリーズするだけのようです。

また、ハイパースレッディングをオンまたはオフにしても、スクリプトには「ハイパースレッディングがサポートされています」と表示されます。


ハイパースレッディングのオフ/オンを自動化するBashスクリプト

以下のスクリプトを表示するとき、ConkyはCPUを1から8まで番号付けしますが、LinuxはCPUを0から7まで番号付けすることに注意してください。

#!/bin/bash

# NAME: set-hyper-threading
# PATH: /usr/local/bin
# DESC: Turn Hyper threading off or on.

# DATE: Aug. 5, 2017.

# NOTE: Written Part of testing for Ubuntu answer:
#       /ubuntu/942728/disable-hyper-threading-in-ubuntu/942843#942843

# PARM: 1="0" turn off hyper threading, "1" turn it on.

if [[ $# -ne 1 ]]; then
    echo 'One argument required. 0 to turn off hyper-threading or'
    echo '1 to turn hyper-threading back on'
    exit 1
fi

echo $1 > /sys/devices/system/cpu/cpu1/online
echo $1 > /sys/devices/system/cpu/cpu3/online
echo $1 > /sys/devices/system/cpu/cpu5/online
echo $1 > /sys/devices/system/cpu/cpu7/online

grep "" /sys/devices/system/cpu/cpu*/topology/core_id

grep -q '^flags.*[[:space:]]ht[[:space:]]' /proc/cpuinfo && \
    echo "Hyper-threading is supported"

grep -E 'model|stepping' /proc/cpuinfo | sort -u

stress --cpu 8 --io 1 --vm 1 --vm-bytes 128M --timeout 10s

注:このプログラムstressは、Ubuntuが派生したすべてのDebianシステムに組み込まれています。したがって、Ubuntuでこのスクリプトを実行するためにパッケージをダウンロードしてインストールする必要はありません。

デュアルコアCPUを使用している場合は、#CPU番号5と7を制御する行を削除(またはコメントアウト)する必要があります。

CPUトポロジを表示するbashラインのHi-Angelの功績grep "" /sys/devices/system/cpu/cpu*/topology/core_id


ハイパースレッディングを開始する前にオフにするとConkyがクラッシュする

CPU 2、4、6、8を可能な限り低い使用率にするために、起動中にハイパースレッディングをオフにしてみました。そのためにこのスクリプトを使用しました。

# NAME: /etc/cron.d/turn-off-hyper-threading
# DATE: Auguust 5, 1017
# DESC: This turns off CPU 1, 3, 5 & 7
# NOTE: Part of testing for Ubuntu answer:
#       /ubuntu/942728/disable-hyper-threading-in-ubuntu/942843#942843
# BUGS: Conky crashes with Segmentation Fault when CPU 2,4,6 & 8 (as conky calls them)
#       are off-line.
#
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#
# @reboot   root    echo 0 > /sys/devices/system/cpu/cpu1/online
# @reboot   root    echo 0 > /sys/devices/system/cpu/cpu3/online
# @reboot   root    echo 0 > /sys/devices/system/cpu/cpu5/online
# @reboot   root    echo 0 > /sys/devices/system/cpu/cpu7/online

ただしconky、起動時にハイパースレッディングがオフになっていると、セグメンテーションフォールトでクラッシュします。そのため@reboot、スクリプトの4 行をコメント化する必要がありました。

CPU使用率と負荷率を表示するConkyコード

Conkyで同様のディスプレイをセットアップすることに興味がある場合、関連するコードスニペットを以下に示します。

${color orange}${voffset 2}${hr 1}
${color2}${voffset 5}Intel® i-7 3630QM 3.4 GHz: ${color1}@  ${color green}${freq} MHz   
${color}${goto 13}CPU 1 ${goto 81}${color green}${cpu cpu1}% ${goto 131}${color3}${cpubar cpu1 18}
${color}${goto 13}CPU 2 ${goto 81}${color green}${cpu cpu2}% ${goto 131}${color3}${cpubar cpu2 18}
${color}${goto 13}CPU 3 ${goto 81}${color green}${cpu cpu3}% ${goto 131}${color3}${cpubar cpu3 18}
${color}${goto 13}CPU 4 ${goto 81}${color green}${cpu cpu4}% ${goto 131}${color3}${cpubar cpu4 18}
${color}${goto 13}CPU 5 ${goto 81}${color green}${cpu cpu5}% ${goto 131}${color3}${cpubar cpu5 18}
${color}${goto 13}CPU 6 ${goto 81}${color green}${cpu cpu6}% ${goto 131}${color3}${cpubar cpu6 18}
${color}${goto 13}CPU 7 ${goto 81}${color green}${cpu cpu7}% ${goto 131}${color3}${cpubar cpu7 18}
${color}${goto 13}CPU 8 ${goto 81}${color green}${cpu cpu8}% ${goto 131}${color3}${cpubar cpu8 18}
${color1}All CPU ${color green}${cpu}% ${goto 131}${color1}Temp: ${color green}${hwmon 2 temp 1}°C ${goto 250}${color1}Up: ${color green}$uptime
${color green}$running_processes ${color1}running of ${color green}$processes ${color1}loaded processes.
Load Avg. 1-5-15 minutes: ${alignr}${color green}${execpi .001 (awk '{printf "%s/", $1}' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4} ${execpi .001 (awk '{printf "%s/", $2}' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4} ${execpi .001 (awk '{printf "%s/", $3}' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4}
${color1}NVIDIA  ${color}-GPU ${color green}${nvidia gpufreq} Mhz  ${color}-Memory ${color green}${nvidia memfreq} Mhz
${color1}GT650M ${color}-Temp ${color green}${nvidia temp}°C  ${color}-Threshold ${color green}${nvidia threshold}°C
${color orange}${voffset 2}${hr 1}

注:上記のNvidiaコードは、UbuntuでNvidia GPUがまだ動作していないため、テストされていません。近いうちに:)


1
申し訳ありませんが、noht存在しません。私はたまたま持っているlinux-4.13-rc1ソースを介してこのオプションを模索しました。しかし、私はあなたを混乱させたかもしれないことを確かに理解しています:dat bugreportはオプションが機能しないと不平を言っており、その後nextrelease、何かを修正したかのように閉じられます。ただし、コメントを読むnohtと、オプションのカーネルコマンドラインをチェックし、/sys/ファイルシステムを介してコアを無効にする手作りのスクリプトのみが使用されていることがわかります。IOW nohtは役に立たない。
ハイエンジェル

@ Hi-Angel必要ないことを指摘してくれてありがとう。私はそれなしでテストを行い、オフラインコアは2,2,5,5%(nohtあり)から5,5,10,10%(nohtなし)に倍増しました。今夜、さらにテストを行います。カーネルパラメータのドキュメントを検索したが、への参照が見つかりませんでしたnoht
WinEunuuchs2Unix

サイドノートでは、何の機械/人間の言語は、インデックスにありません:)解決0から始まるインデックスとの混同、1、あるいは特定の数に(それがMiniZincであるように)、それはの観点から考える方が良いでしょうインデックスセット、すなわちAインデックスのセットから別のセットへの推測。抽象化することで、インデックスを表していないデータに関連する一部を実際に少しいじった後のインデックス作成に使用できる場合に、簡単にメモできるようになります。利点は、メモリレイアウトやその他の制限に縛られない概念を念頭に置いていることです。
ハイ天使

@ Hi-Angel「開始位置」と「オフセット」の類似した比較だと思います。とにかく最後の2日間のテストとコーディングに基づいてこの回答を書き直そうとしているので、コメントはすぐに廃止されます
...-WinEunuuchs2Unix

6

最近のカーネルは、maxcpus カーネルパラメーターをサポートしています。

これにより、CPUの数を物理コアの数に設定できます。これは、ファミリ6のIntel CPUのMDS脆弱性によって引き起こされる脅威を軽減するのに役立つ場合があります。

どうやって:

sudo(root)特権で、お気に入りのテキストエディターで/ etc / default / grubを開きます。

GRUB_CMDLINE_LINUX_DEFAULT =で始まる行を見つけます

また、一般的なクワイエットスプラッシュパラメーターなどの既存のカーネルパラメーターにmaxcpus = nを追加します(n = CPUの物理コアの数。

たとえば、信頼できるIntel(R)Core(TM)i3-3220 CPU @ハイパースレッディング付き3.30GHzデュアルコアでは、ブート時にハイパースレッディングをオフにするためにmaxcpus = 2を追加しました。

ファイルを保存し、コマンドsudo update-grubを発行して再起動します。

次のlscpu | grep "per core"ような出力を提供するコマンドを発行することにより、成功を確認できます。

Thread(s) per core: 1

カーネル4.4.0でテスト済み

ソース:

https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/kernel-parameters.txt

https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html

/unix/145645/disabling-cpu-cores-on-quad-core-processor-on-linux


1
興味深いリンク。共有してくれてありがとう。
WinEunuuchs2Unix

@ WinEunuuchs2Unix私の喜び。いつも助けてください!
オタク長老

4

Linuxでルートとして、またはスーパーユーザー特権でハイパースレッディングを無効にするには、次を使用します。

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

現在のハイパースレッディングステータスは、次の方法で表示できます。

$ cat /sys/devices/system/cpu/smt/control

このコマンドは、次のいずれかを出力します。

on|off|forceoff|notsupported|notimplemented

また、ほとんどのBIOSファームウェアには、ハイパースレッディングを無効にするオプションも含まれています。BIOSで無効になっている場合、上記の猫はおそらく戻りますforceoff


起動時にハイパースレッディングを無効にするためにこれを試しましたか?
オタク長老

1
@ElderGeekいいえ、maxcpus=ハイパースレッディングを無効にするためのカーネルパラメーターを試していません。主に、ハイパースレッディングコアとの相互作用に関する公式ドキュメントを見つけることができないためです。指定した場合、常にハイパースレッディングを無効にすることが保証されていますmaxcpus=#real_coresか?または、一部のシステムでHTが有効になっている状態で、実際のコアの半分になる可能性がありますか?また、maxcpus=コア数が異なるマシン間で1つの設定を移植することはできません。さまざまなマシンでこのパラメーターのバリエーションを維持するのは、面倒でエラーが発生しやすくなります。
maxschlepzig

私の経験では、maxcpus =#real_coresを指定すると、ハイパースレッディングが常に無効になります。もちろん、出力に関する信頼lscpu | grep "per core"性が高い場合は、移植性に関する重要なポイントを作成します。私に。
オタク長老

2

以下は、ht-coreを識別し、オンライン/オフラインを切り替えるスクリプトです。

#!/bin/bash
typeset -i core_id
typeset -i sibling_id
typeset -i state

for i in /sys/devices/system/cpu/cpu[0-9]*; do
  core_id="${i##*cpu}"
  sibling_id="-1"

  if [ -f ${i}/topology/thread_siblings_list ]; then
    sibling_id="$(cut -d',' -f1 ${i}/topology/thread_siblings_list)"
  fi

  if [ $core_id -ne $sibling_id ]; then
    state="$(<${i}/online)"
    echo -n "$((1-state))" > "${i}/online"
    echo "switched ${i}/online to $((1-state))"
  fi
done

@ WinEunuuchs2Unix、これをあなたの優れた答えに追加できるかもしれません。


リストを数値的に並べ替えて、適切に機能させる必要がありましたfor i in $(find /sys/devices/system/cpu/cpu[0-9]* -maxdepth 0 -type d |sort -V); do
。–ノイハウス

2

maxcpus=nパラメーターはGRUB_CMDLINE_LINUX_DEFAULT=正しく機能しません。4コア4スレッドではなく、2コアと4スレッドが残っていました。

私は解決策を見つけました。

追加mitigations=auto,nosmtするGRUB_CMDLINE_LINUX_DEFAULT=代わりに、

Linux 4.4.0を使用したUbuntu 16.04 LTSでテスト済み。

ソース:https : //wiki.ubuntu.com/SecurityTeam/KnowledgeBase/MDS


1

core_idが重複しているため、マザーボードが複数のCPUソケットをホストするシステムの場合、カーネルでハイパースレッドペアを探すためのもう少し堅牢な方法が必要です。これは、2つの8コアXeonチップを搭載したシステム上の私のバージョンです(Ubuntu 16.04の例):

$ cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list \
> | sort --unique --numeric-sort
0,16
1,17
2,18
3,19
4,20
5,21
6,22
7,23
8,24
9,25
10,26
11,27
12,28
13,29
14,30
15,31

さまざまな目的のために、ファイルを調べることもできます。

/sys/devices/system/cpu/present
/sys/devices/system/cpu/online
/sys/devices/system/cpu/offline

0

ディスカッションを読んだことがあれば、通常は無効にするのは無理があることをご存じでしょう。そのため、学習目的でそれが必要だと思います。

HTの考え方は、すべての物理コア(いわゆる仮想コア)に対して複数セットのCPUレジスタを使用することです。「より良い」仮想コアはありません、それらは同一です。この知識があれば、物理コアごとに1つを除いて仮想コアを無効にできます。

まず、仮想コアのどのペアが/sys/ファイルシステムのどの物理コアに属しているかを知りたいです。core_idそのためにファイルを使用できます:

λ grep "" /sys/devices/system/cpu/cpu*/topology/core_id
/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu1/topology/core_id:2
/sys/devices/system/cpu/cpu2/topology/core_id:0
/sys/devices/system/cpu/cpu3/topology/core_id:2

出力から、cpu0 + cpu2が一方の物理コアに含まれ、cpu1 + cpu3が他方に含まれていることが推測できます。特権を昇格し、echoコマンドを使用してすべてのペアで1つを無効にします。

λ sudo -s
# echo 0 > /sys/devices/system/cpu/cpu1/online
# echo 0 > /sys/devices/system/cpu/cpu2/online

cpu0には「オンライン」ファイルがないため無効にできないことに注意してください。そのため、代わりにcpu2を無効にしました。


0

thread_siblings_listの区切り文字がコンマでない場合(たとえば、私のAMD Ryzenシステムの場合)、@ visit1985の答えは機能しません。

以下に、ハイパースレッディングをオフにするためのスクリプトを示します。これは、任意のセパレータで機能します。

#!/bin/bash

for cpu in /sys/devices/system/cpu/cpu[1-9]*; do
    if [ -e "$cpu/topology/thread_siblings_list" ]; then
        sibling=$(awk -F '[^0-9]' '{ print $2 }' $cpu/topology/thread_siblings_list)
        if [ ! -z $sibling ]; then
            echo 0 > "/sys/devices/system/cpu/cpu$sibling/online"
        fi
    fi
done

そして、ハイパースレッディングをオンにするものは次のとおりです。

#!/bin/bash

for cpu in /sys/devices/system/cpu/cpu[1-9]*; do
    echo 1 > "$cpu/online"
done

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