web-dev-qa-db-ja.com

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

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

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

dmidecode -t processor | grep HTT

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

57
doubledecker

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

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

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

dmidecode -t processor | grep HTT

Linuxでは、通常、/proc/cpuinfoの「flags」行で「ht」を探します。たとえばを参照してください

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

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

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

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

28
xebeche

私は常に以下を使用し、「コアあたりのスレッド:」を調べました。

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
106
stephaniea

論理プロセッサーの数が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"
19
Nils

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

9
user63814

この1つのライナーは私にとってはトリックを行うようです(root権限が必要です)。

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`);'
7
billyw

このコマンドで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
5
Coren
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
4
mpapec

/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_list複数のノードのprocfsファイル、またはコンマ、または0、ハイパースレッディングが有効かどうかを示します。


私はPerlで回答しますが、1)Perlがわかりません、2)ソリューションはかなり簡単な1行であると思います。

3
scottbb

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

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

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

あなたは実際に実行時にそれをオンまたはオフにすることができます:

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

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))
2
Neil McGill

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
edW

Stephaniea はすでにlscpuについて言及しています。もう少し付け加えたかった。

AMD Epycプロセッサでは、オフラインの論理コアがある場合は常に、lscpuOff-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
1
talekeDskobeDa

多くの注意事項とここでの答えにあるものは...答えはそれほど明白ではないようです。 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しています。

考え?批判?

リクエスタが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
1
Mike S

lscpuはどうですか。次に、コアあたりのスレッド数など、CPUに関する多くの情報を取得します。それが1の場合、マルチスレッドはオフです。

0
Martijn
lscpu | grep Thread

戻り値->コアあたりのスレッド数:1

1つのハイパースレッディングが有効になっていない場合。

0
mannoj

「コアあたりのスレッド数: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
Gineesh