ハイパースレッディングが有効になっているかどうかを確認していますか?


51

Linuxマシンでハイパースレッディングが有効になっているかどうかを確認するには、perlスクリプトを使用して確認しますか?

私は次の方法を試しています:

dmidecode -t processor | grep HTT

順調に進んでいるかどうか教えてください。


2
以下のためにdmidecodeはrootでなければなりません。
ニルス

5
私は誰もが「perl script」ビットを無視した方法が好きです;-)
SamB

これは受け入れられた答えでなければなりません:unix.stackexchange.com/a/522295/1131
maxschlepzig

回答:


27

2014年7月8日に追加注:として、リッカルドMurriは、プロセッサのレポートは、ハイパースレッディングをサポートするかどうか、だけを示し、以下の私の答えを指摘しました。通常、* nix O / Sは、サポートされている場合、ハイパースレッディングを有効にするように構成されます。ただし、これを実際にプログラムで確認するには、たとえばNilsの答えを確認してください。

---- 2012年3月25日からの元の回答:

あなたは確かに正しい軌道に乗っています:)

dmidecode -t processor | grep HTT

Linuxでは、通常、の「フラグ」行で「ht」を探すだけです/proc/cpuinfo。インスタンスを参照してください

grep '^flags\b' /proc/cpuinfo | tail -1

または、パターンに「ht」を含める場合

grep -o '^flags\b.*: .*\bht\b' /proc/cpuinfo | tail -1

\b単語の境界に一致し、「ht」が別のフラグの一部である場合の誤検知を回避するのに役立ちます。)


19
これは、HTが実際に使用されているかどうかではなく、プロセッサがHT対応かどうかのみを示します。
リッカルドムリ14

3
HTTフィールドは、プロセッサのコアに実際にハイパースレッディングがあることを示していません。/ proc / cpuinfoの「兄弟」と「cpuコア」の値を確認してください
Silver Moon 14年

@ Silver-Moonあなたは説明できますか?dmidecodeはSMBIOSを読み取り、プロセッサの機能を通知する必要があります。O / Sがハイパースレッディングを認識または使用するかどうかはわかりません。しかし、これはすでにコメントされています。参照してくださいニルスの答え
xebeche

1
システムのdmidecode出力の@xebecheには「HTT(Multi-threading)」と表示されますが、プロセッサは「core 2 quad Q8400」であり、ハイパースレッディングはありません。インテルの仕様を確認してください。
シルバームーン14

1
リッカルドに+1。HT対応サーバーでHTを無効にしていますが、「HTT」と表示されます。lscpu確認する方法です。
須藤

96

私は常に次のものを使用し、「コアごとのスレッド:」を見てきました。

hostname:~ # lscpu
Architecture:          x86_64
CPU(s):                24
Thread(s) per core:    2                <-- here
Core(s) per socket:    6
CPU socket(s):         2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 44
Stepping:              2
CPU MHz:               1596.000
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              12288K

ただし、単純な方法で論理プロセッサがオフになっている場合、この手法は失敗します。

echo 0 > /sys/devices/system/cpu/cpuX/online

4
これはまだ最良の答えです。茶葉を読む必要がなく、多くの有益な情報が必要であり、greppingは必要ありません。
MrMas

11
OMGは、シェルコマンドを使用して答えを取得しましたか。それはとても古い学校です。そのために-1です。素敵なPythonスクリプトはどうですか?書くのに午後しかかかりません。Pythonではないので、もう1つ。ただし、簡潔にするために+3です。
マイクS

皮肉の@マイクSロットなく...の出力lscpuは、たとえば、1つだけハイパースレッドコアは(完全に有効なシナリオである)4つのコアCPUにダウンしている場合、正しくありません。なぜなら、実際には3つのコアがハイパースレッド(合計7スレッド)であるにもかかわらず、「コアあたりのスレッド:1」と報告されるからです。
セドリックマーティン

あなたが気づいた@セドリックマーティン。:-) ... Oooo!良いキャッチ...私はそれをやった!デュアル8コアマシン(Dell R620 / E5-2667 v2 CPU)を取得しました... 32個のCPUを報告しています...実行済みecho 0 > /sys/devices/system/cpu/cpu31/online、現在lscpuが報告していThread(s) per core: 1ます。悪いlscpu!これはもう使用しないと思います。
マイクS

3
@Mike Sまだlscpuを使用できますが、その行ではないでしょう。たとえば、「lscpu -e -a」を使用すると、各スレッドが正しくリストされ、アクティブかどうかがわかります。それはちょうどことだ「コアあたりのスレッド(s)は、」あなたが各コアで異なる/無効のスレッドを有効にすることができますあまり意味がありません。
セドリックマーティン

18

論理プロセッサの数がHTのコア数の2倍の場合。次のスクリプトを使用して/ proc / cpuinfoをデコードします。

#!/bin/sh
CPUFILE=/proc/cpuinfo
test -f $CPUFILE || exit 1
NUMPHY=`grep "physical id" $CPUFILE | sort -u | wc -l`
NUMLOG=`grep "processor" $CPUFILE | wc -l`
if [ $NUMPHY -eq 1 ]
  then
    echo This system has one physical CPU,
  else
    echo This system has $NUMPHY physical CPUs,
fi
if [ $NUMLOG -gt 1 ]
  then
    echo and $NUMLOG logical CPUs.
    NUMCORE=`grep "core id" $CPUFILE | sort -u | wc -l`
    if [ $NUMCORE -gt 1 ]
      then
        echo For every physical CPU there are $NUMCORE cores.
    fi
  else
    echo and one logical CPU.
fi
echo -n The CPU is a `grep "model name" $CPUFILE | sort -u | cut -d : -f 2-`
echo " with`grep "cache size" $CPUFILE | sort -u | cut -d : -f 2-` cache"

場合$NUMCORE > $NUMLOG我々は正しい、そのハイパースレッディングが有効になっていると言うことができますか?事実2 * $NUMCORE = $NUMLOG、これは常に当てはまるのですか、それとも一部のCPUには4倍以上のコアがあるのでしょうか?
トムバート

@Tombart現在、HTはファクター2です。将来的にはさらに増える可能性があります。コアは物理として記録されます。ソケットごとのコアの数は、兄弟から導出できます。
ニルス

あなたが持っている場合はlscpu利用でき、lscpu追加のメタデータの多くからの出力と一緒に同じ情報を提供するlscpu、より簡単に解析可能です。ただし、このソリューションは機能し、のみを使用し/proc/cpuinfoます。
トレバーボイドスミス

8

上記の例は、CPUがHTに対応しているかどうかを示していますが、使用されているかどうかは示していません。最後の方法は機能しますが、Xenserver物理CPU がないため、デュアルソケットサーバーとVMが物理CPUを表示しない場所でテストされていません。

これが最も簡単でコードの少ない方法であることがわかり、すべてのテスト環境でも機能しました。が必要bcです。

echo "testing ################################### "

nproc=$(grep -i "processor" /proc/cpuinfo | sort -u | wc -l)

phycore=$(cat /proc/cpuinfo | egrep "core id|physical id" | tr -d "\n" | sed s/physical/\\nphysical/g | grep -v ^$ | sort | uniq | wc -l)

if [ -z "$(echo "$phycore *2" | bc | grep $nproc)" ]

then

echo "Does not look like you have HT Enabled"

if [ -z "$( dmidecode -t processor | grep HTT)" ]

 then

echo "HT is also not Possible on this server"

 else

echo "This server is HT Capable,  However it is Disabled"

fi

else

   echo "yay  HT Is working"

fi


echo "testing ################################### "

これはすべてのプラットフォームで動作し、そのCPUが有効かどうか、有効になっているかどうかがわかります。少し厄介かもしれませんが、私はスクリプト作成の初心者です。CentOS XENSERVER vm、Ubuntu、およびOpenfiler(rpath)でテストしました


あなたのスクリプトは、読むだけで非常に簡単になります/sys/devices/system/cpu/smt/controlオスカーの答え
maxschlepzig

6

このコマンドでCPUのHT機能を確認できます

# grep ht /proc/cpuinfo

次のコマンドを使用して、カーネルから見た物理CPUと論理CPUをリストできます。

# egrep -i "processor|physical id" /proc/cpuinfo

シングルコアHT対応CPUで次の出力を提供します。

processor   : 0
physical id : 0
processor   : 1
physical id : 0

次のように結果を読むことができます:

processor   : 0 (CPU 0, first logical)
physical id : 0 (CPU 0 is on the first physical)
processor   : 1 (CPU 1, second logical)
physical id : 0 (CPU 1 is on the first physical)
=> It means I have HT enabled

1
これは、HTが実際に使用されているかどうかではなく、プロセッサがHT対応かどうかのみを示します。プロセッサがHT対応であるが、HTが有効になっていないノードhtは、CPUフラグでアドバタイズします。
リッカルドムリ14

@RiccardoMurri私の知る限り、HTが無効になっていると、/ proc / cpuinfoにhtフラグが表示されません
Coren 14

6
そうではないと確信しています。HTが有効なサーバーとHTが無効なサーバーの両方があり、すべてのサーバーにhtフラグが表示されます。
リッカルドムリ14

2
4コアのXeonプロセッサがある場合、1つの物理IDと4つのプロセッサとして表示されます。したがって、ハイパートレッドなしで物理IDごとに複数のプロセッサを使用できます。
アンドマー14年

2
私は2ソケットのマシンを持っていますが、これはphysical idソケット/チップを表しているようです。core id同一の物理コアを指すように思える
Heartinpiece

6

この1つのライナーは私のためにトリックをしているようです(ルート権限が必要です):

dmidecode -t processor | grep -E '(Core Count|Thread Count)'

出力は次のとおりです。

Core Count: 2
Thread Count: 4

スレッド数はコア数の2倍なので、ハイパースレッディングを有効にします。

または、要求どおりにperlスクリプトが本当に必要な場合は...

perl -e 'print grep(/Core Count/ || /Thread Count/, `dmidecode -t processor`);'

1
IntelベースのHT対応システムでHTをオフにしましたが、dmidecodeで返されるスレッドカウントはコアカウントの2倍です。CPUがHT対応かどうかを示すように見えますが、HTが有効かどうかは表示されません。
ドミトリチュバロフ

@Dmitri奇妙な。ハイパースレッディングを無効にして、HT対応サーバー(2つのIntel Xeon E5-2670 v3を搭載)でこれを実行しましたが、コアとスレッドの数は同じでした。何が行動の違いを引き起こすのか分かりません。さらに検討する必要があります。
ビリー

これは、2つのX5680プロセッサを搭載したDell R610でハイパースレッディングをオフにして実行しただけで、スレッド数はコア数の2倍です。ステファニーアの答え(lscpu)は機能しているようです。iDRAC(Dellの消灯、帯域外プロセッサ(知識のない人向け))を再確認しましたが、ハイパースレッディングはオフになっています。だから私dmidecodeは信頼できるとは思わない。
マイクS

Dell 1950(x5460 CPU、ハイパースレッディング不可)をチェックしましたが、lscpuは正しかったです。また、Dell R620(E5-2690 [v1、私は信じる])およびそれは正しかった。
マイクS

しかし、上記の回答の1つにある@Cedric Martinのコメントは、lscpu必ずしも信頼できるとは限らないことを示しています。scottbbの答えが好きです。
マイクS

3
perl -ne'
  $i++ if /^\s*$/;
  push @{$x[$i]}, [/^(.+?) \s*:\s* (.+)/x] if /core|sibling|physical id/; }{
  $r= shift @x; 
  for $i (0..$#$r) {
    $$r[$i][1] .= " ".$$_[$i][1] for @x;
    printf "%-15s: %s\n", @{$$r[$i]};
  }
' /proc/cpuinfo

この結果は、siblings数値(12)がcpu cores(6)より大きいため、HTが有効になっていることを示しています

physical id    : 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1
siblings       : 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
core id        : 0 1 2 8 9 10 0 1 2 8 9 10 0 1 2 8 9 10 0 1 2 8 9 10
cpu cores      : 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6

2

を読むと/sys/devices/system/cpu/cpu0/topology/thread_siblings_list、CPU 0のスレッド兄弟(ハイパースレッド「コア」)のコンマ区切りリストが返されます。

たとえば、ハイパースレッディングを有効にした2ソケット6コアXeonでは、次のようになります。

cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0,12

しかし、BIOSでハイパースレッディングをオフにすると、次のようになります。

cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0

CPU 0が常に使用可能であると仮定すると、CPU 0のthread_sibling_listprocfsファイルで複数のノードを確認するか、コンマまたはを超えるものを探す0ことで、ハイパースレッディングが有効かどうかを示します。


私はPerlで答えますが、1)Perlがわからない、2)解決策はかなり些細なワンライナーだと思います。


2

Linuxでは、これはうまく機能します。

$ lscpu -e  
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE  
0   0    0      0    0:0:0:0       yes  
1   0    0      1    1:1:1:0       yes  
2   0    0      2    2:2:2:0       yes  
3   0    0      3    3:3:3:0       yes  
4   0    0      4    4:4:4:0       yes  
5   0    0      5    5:5:5:0       yes  
6   0    0      6    6:6:6:0       yes  
7   0    0      7    7:7:7:0       yes  
8   1    1      8    8:8:8:1       yes  
9   1    1      9    9:9:9:1       yes  
10  1    1      10   10:10:10:1    yes  
11  1    1      11   11:11:11:1    yes  
12  1    1      12   12:12:12:1    yes  
13  1    1      13   13:13:13:1    yes  
14  1    1      14   14:14:14:1    yes  
15  1    1      15   15:15:15:1    yes  
16  0    0      0    0:0:0:0       yes  
17  0    0      1    1:1:1:0       yes   
18  0    0      2    2:2:2:0       yes  
19  0    0      3    3:3:3:0       yes  
20  0    0      4    4:4:4:0       yes  
21  0    0      5    5:5:5:0       yes  
22  0    0      6    6:6:6:0       yes  
23  0    0      7    7:7:7:0       yes  
24  1    1      8    8:8:8:1       yes  
25  1    1      9    9:9:9:1       yes  
26  1    1      10   10:10:10:1    yes  
27  1    1      11   11:11:11:1    yes  
28  1    1      12   12:12:12:1    yes  
29  1    1      13   13:13:13:1    yes  
30  1    1      14   14:14:14:1    yes  
31  1    1      15   15:15:15:1    yes  

上記の例では、2つのNUMAソケットがあります(SOCKET = 1または2)。16個の物理コア(CORE = 0〜15)があります。各COREには兄弟ハイパースレッドがあります(たとえば、CORE = 0にはCPU 0,16が含まれます。

次のようにハイパースレッドを検証できます。

$ cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list  
0,16

キャッシュメモリの階層は次のとおりです。

CPU 0 --> L1D_0|L1I_0 -> L2_0 -> L3_0  
          ^                      ^
CPU 16 ---|                      |     
                                 |         
CPU 1 --> L1D_1|L1I_1 -> L2_1 ---> 
          ^    
CPU 17 ---|   
...    

lscpu -pは、簡単なプログラム解析のためにcsv形式の出力を提供します。

$ lscpu -p  
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,0,0,,1,1,1,0
2,2,0,0,,2,2,2,0
3,3,0,0,,3,3,3,0
4,4,0,0,,4,4,4,0
...

2

Pythonベースのアプローチを次に示します-必要に応じて無効にする方法も提案します。

import re    

total_logical_cpus = 0
total_physical_cpus = 0
total_cores = 0

logical_cpus = {}
physical_cpus = {}
cores = {}

hyperthreading = False

for line in open('/proc/cpuinfo').readlines():
    if re.match('processor', line):
        cpu = int(line.split()[2])

        if cpu not in logical_cpus:
            logical_cpus[cpu] = []
            total_logical_cpus += 1

    if re.match('physical id', line):
        phys_id = int(line.split()[3])

        if phys_id not in physical_cpus:
            physical_cpus[phys_id] = []
            total_physical_cpus += 1

    if re.match('core id', line):
        core = int(line.split()[3])

        if core not in cores:
            cores[core] = []
            total_cores += 1

        cores[core].append(cpu)

if (total_cores * total_physical_cpus) * 2 == total_logical_cpus:
    hyperthreading = True

print("  This system has %d physical CPUs" % total_physical_cpus)
print("  This system has %d cores per physical CPU" % total_cores)
print("  This system has %d total cores" % (total_cores * total_physical_cpus))
print("  This system has %d logical CPUs" % total_logical_cpus)

if hyperthreading:
    print("  HT detected, if you want to disable it:")
    print("  Edit your grub config and add 'noht'")
    print("  -OR- disable hyperthreading in the BIOS")
    print("  -OR- try the following to offline those CPUs:")

    for c in cores:
        for p, val in enumerate(cores[c]):
            if p > 0:
                print("    echo 0 > /sys/devices/system/cpu/cpu%d/online" % (val))

ハイパースレッディングを無効にするための提案は次善です-ハイパースレッディングを無効にする直接的な方法はecho off > /sys/devices/system/cpu/smt/control(BIOSで無効にする以外に)です。直接確認については、オスカーの回答も参照してください。
maxschlepzig

1

たくさんの警告とここにある答えの中にwhat-ifがあります...答えはそれほど明白ではないようです。lscpu「コアと論理プロセッサを数えてから比較」という答えに当てはまる落とし穴があります。単純なエコーコマンドを使用して論理プロセッサを停止できるためです(...これは、たとえばターボモードに依存している大規模なエンタープライズ環境では重要になる可能性があります)。

これが私の試みです。インスピレーションをくれた@scottbbに感謝します。

printf "HT is "; egrep -q [:punct:] /sys/devices/system/cpu/cpu0/topology/thread_siblings_list && echo on || echo off 

Dell Xeonベースのマシンでは、HTがオンの場合、兄弟リストにコンマが含まれています。私のラップトップには、ハイフン(i5-3210mプロセッサー)が含まれています。だから私は句読点のegrep'ingです。

考え?批判?

リクエスターがperlを要求したので、ここに行きます:

perl -ane 'chomp; print "Hyperthreading is "; if (/\D/) { print "ON\n" } else { print "OFF\n" }' < /sys/devices/system/cpu/cpu0/topology/thread_siblings_list

grep -q [-.]これは入力するのが少ないので使用します。FWIW、私はいくつかのXeons / i5 / i7(モバイルバリアントを含む)をチェックしましたが、いずれにもハイフンがありませんthread_siblings_list。cpu0をチェックするだけでは不十分ですgrep -q , /sys/devices/system/cpu/cpu*/topology/thread_siblings_list。したがって、このようなものはより堅牢になります。ただし、a grep 1 /sys/devices/system/cpu/smt/active -qはさらに重要です-cf. オスカーの答え
maxschlepzig

1

SMT(HTの総称、Intelブランドのみ)がアクティブであるかどうかを確認する最も簡単な方法は次のとおりです。

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

非アクティブの場合は0、アクティブの場合は1

実際に実行時にオンまたはオフにすることができます:

echo [on|off] > /sys/devices/system/cpu/smt/control

Cattingは/sys/devices/system/cpu/smt/controlあるも可能と利回りon|off|forceoff|notsupported|notimplemented
maxschlepzig

0

「コアあたりのスレッド:1」が表示されるlscpuを確認すると、1コアあたり1つのスレッドのみを意味します。

    # 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:    1
Core(s) per socket:    4
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 63
Model name:            Intel(R) Xeon(R) CPU E5-2623 v3 @ 3.00GHz
Stepping:              2
CPU MHz:               1200.000
BogoMIPS:              5992.82
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              10240K
NUMA node0 CPU(s):     0,1,4,5
NUMA node1 CPU(s):     2,3,6,7

0

ステファニーアはすでに言及していlscpuます。それにもう少し加えたいと思いました。

オフライン論理コアがあるたびに、私のAMD Epycのプロセッサ上で、lscpu呼ばれる新しい追加の行を表示しますOff-line CPU(s) list:

# echo 0 > /sys/devices/system/cpu/cpu9/online
# echo 0 > /sys/devices/system/cpu/cpu16/online
# 
#lscpu
CPU(s):                64
On-line CPU(s) list:   0-8,10-15,17-63
Off-line CPU(s) list:  9,16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.