Prüfen, ob HyperThreading aktiviert ist oder nicht?


51

Wie kann ich überprüfen, ob Hyperthreading auf einem Linux-Computer aktiviert ist, indem ich ein Perl-Skript verwende, um es zu überprüfen?

Ich versuche den folgenden Weg:

dmidecode -t processor | grep HTT

Lassen Sie mich wissen, ob ich auf dem richtigen Weg bin.


2
denn dmidecodedu musst root sein.
Nils

5
Ich mag, wie jeder das "Perl-Skript"
-Bit

Dies sollte die akzeptierte Antwort sein: unix.stackexchange.com/a/522295/1131
maxschlepzig

Antworten:


27

Anmerkungen hinzugefügt am 8. Juli 2014: Wie Riccardo Murri hervorhob, zeigt meine Antwort unten nur, ob der Prozessor Hyperthreading unterstützt. Im Allgemeinen sind * nix-Betriebssysteme so konfiguriert, dass Hyperthreading aktiviert wird, sofern dies unterstützt wird. Um dies jedoch programmatisch zu überprüfen, sehen Sie beispielsweise Nils 'Antwort !

---- Ursprüngliche Antwort vom 25. März 2012:

Du bist ja auf dem richtigen Weg :) mit

dmidecode -t processor | grep HTT

Unter Linux suche ich in der Regel nur nach "ht" in der Zeile "flags" von /proc/cpuinfo. Siehe zum Beispiel

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

oder wenn Sie das "ht" in das Muster aufnehmen möchten

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

( \bStimmt mit den Wortgrenzen überein und hilft, Fehlalarme zu vermeiden, wenn "ht" Teil eines anderen Flags ist.)


19
Dies sagt Ihnen nur, ob der Prozessor HT-fähig ist, nicht, ob HT tatsächlich verwendet wird.
Riccardo Murri

3
Das HTT-Feld zeigt nicht an, dass der Prozessor tatsächlich Hyperthreading in seinen Kernen ausführt. Überprüfen Sie den Wert von "Geschwister" und "CPU-Kerne" in / proc / cpuinfo
Silver Moon

@ Silver-Moon Kannst du erklären? dmidecode liest das SMBIOS und sollte die Fähigkeiten des Prozessors anzeigen. Es wird nicht angegeben, ob Hyper-Threading vom Betriebssystem erkannt oder verwendet wird. Dies wurde aber bereits kommentiert. Siehe auch Nils answer
xebeche

1
@xebeche auf meiner System-Dmidecode-Ausgabe zeigt "HTT (Multi-Threading)", aber mein Prozessor ist "Core 2 Quad Q8400", der kein Hyperthreading hat. Überprüfen Sie die Intel-Spezifikationen.
Silver Moon

1
+1 an Riccardo; Ich habe HT auf einem HT-fähigen Server deaktiviert und sehe, dass "HTT" gedruckt wird. lscpuist der Weg zu überprüfen.
Sudo

96

Ich habe immer nur Folgendes verwendet und mir "Thread (s) pro Kern" angesehen.

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

Beachten Sie jedoch, dass diese Technik fehlschlägt, wenn ein logischer Prozessor mit einem einfachen ausgeschaltet wurde

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

4
Dies ist die bisher beste Antwort. Es erfordert kein Lesen der Teeblätter, viele hilfreiche Informationen und kein Greifen.
MrMas

11
OMG Sie haben einen Shell-Befehl verwendet , um Ihre Antwort zu erhalten ?! Das ist so altmodisch. Was ist mit einem schönen Python-Skript ??? Sie würden nur einen Nachmittag brauchen, um zu schreiben. Da es nicht Python ist, noch ein -1. Aber +3 für die Kürze.
Mike S

@Mike S viel Sarkasmus, aber ... Die Ausgabe von lscpu ist nicht korrekt, wenn beispielsweise nur 1 Hyper-Thread-Kern auf einer 4-Kerne-CPU ausfällt (was ein vollständig gültiges Szenario ist). Denn dann wird "Thread (s) pro Kern: 1" gemeldet, obwohl 3 Kerne tatsächlich hyperthreaded sind (insgesamt 7 Threads).
Cedric Martin

@Cedric Martin ist dir aufgefallen. :-) ... Oooo! Guter Fang ... ich habe es geschafft! Habe einen Dual-8-Core-Rechner (Dell R620 / E5-2667 v2-CPU) ... er meldet 32 ​​CPUs ... durchgeführt echo 0 > /sys/devices/system/cpu/cpu31/online, jetzt lscpu-Berichte Thread(s) per core: 1. Schlecht lscpu! Ich schätze, ich werde das nicht mehr benutzen.
Mike S

3
@Mike S Du kannst immer noch lscpu verwenden , aber ich denke, nur nicht diese Zeile. Wenn Sie beispielsweise "lscpu -e -a" verwenden, werden alle Threads korrekt aufgelistet und es wird angegeben, ob sie aktiv sind oder nicht. Es ist nur so, dass "Thread (s) pro Kern" nicht viel Sinn macht, wenn Sie Threads auf jedem Kern unterschiedlich aktivieren / deaktivieren können.
Cedric Martin

18

Wenn die Anzahl der logischen Prozessoren doppelt so hoch ist wie die Anzahl der Kerne, die Sie über HT verfügen. Verwenden Sie folgendes Skript, um / proc / cpuinfo zu dekodieren :

#!/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"

Wenn $NUMCORE > $NUMLOGwir sagen können, dass Hyperthreading aktiviert ist, richtig? Ist 2 * $NUMCORE = $NUMLOGdies immer der Fall oder haben manche CPUs 4x mehr Kerne?
Tombart

@Tombart Derzeit ist HT Faktor 2. Ich kann mir vorstellen, dass es in Zukunft mehr sein könnte. Ein Kern wird als physisch bezeichnet. Die Anzahl der Kerne pro Sockel kann von Geschwistern abgeleitet werden.
Nils

Wenn lscpuverfügbar, lscpuwerden dieselben Informationen zusammen mit vielen zusätzlichen Metadaten bereitgestellt, und die Ausgabe von lscpuist einfacher zu analysieren. aber diese lösung funktioniert und nutzt nur /proc/cpuinfo.
Trevor Boyd Smith

8

Die obigen Beispiele zeigen, ob die CPU HT-fähig ist, nicht jedoch, ob sie verwendet wird. Die letzte Methode funktioniert, es werden jedoch keine Dual-Socket-Server und VMs getestet, auf Xenserverdenen keine physische CPU angezeigt wird, da es keine gibt.

Ich fand, dass dies die einfachste und einfachere Codemethode ist, die auch in allen meinen Testumgebungen funktioniert. aber erfordert 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 ################################### "

Ich glaube, das wird auf allen Plattformen funktionieren und Ihnen sagen, ob die CPU fähig ist und ob sie aktiviert ist. Kann ein wenig chaotisch sein, aber ich bin ein Anfänger in Skripten. Ich habe mit centos XENSERVER vm, Ubuntu und Openfiler (rpath) getestet


Ihr Skript könnte durch einfaches Lesen erheblich vereinfacht werden /sys/devices/system/cpu/smt/control. Siehe auch die Antwort von Oscar
maxschlepzig

6

Mit diesem Befehl können Sie die HT-Fähigkeit der CPU überprüfen

# grep ht /proc/cpuinfo

Mit dem folgenden Befehl können Sie die physische und logische CPU auflisten, die der Kernel sieht:

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

Diese Ausgabe wird auf einer Single-Core-HT-fähigen CPU ausgegeben:

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

Sie können das Ergebnis folgendermaßen lesen:

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
Dies sagt Ihnen nur, ob der Prozessor HT-fähig ist, nicht, ob HT tatsächlich verwendet wird. Knoten, deren Prozessor HT-fähig ist, bei denen HT jedoch nicht aktiviert ist, werden weiterhin htin den CPU-Flags angezeigt.
Riccardo Murri

@RiccardoMurri Soweit ich weiß, erscheint die ht-Flagge bei deaktiviertem HT nicht in / proc / cpuinfo
Coren,

6
Ich bin mir ziemlich sicher, dass es nicht so ist. Ich habe sowohl HT-fähige als auch HT-deaktivierte Server und alle zeigen das ht-Flag.
Riccardo Murri

2
Wenn Sie einen Xeon-Prozessor mit 4 Kernen haben, werden eine physische ID und vier Prozessoren angezeigt. Sie können also mehrere Prozessoren pro physischer ID verwenden, ohne HyperHeading durchführen zu müssen.
Andomar

2
Ich habe eine 2-Socket-Maschine und die physical idscheint den Sockel / Chip zu repräsentieren. Das core idscheint auf den gleichen physischen Kern
Heartinpiece

6

Dieser eine Liner scheint den Trick für mich zu machen (erfordert Root-Rechte):

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

Die Ausgabe ist:

Core Count: 2
Thread Count: 4

Die Anzahl der Threads ist doppelt so hoch wie die Anzahl der Kerne. Daher habe ich Hyperthreading aktiviert.

Oder wenn Sie wirklich Ihr Perl-Skript wollen, wie gewünscht ...

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

1
Ich habe HT auf einem Intel-basierten HT-fähigen System deaktiviert, aber die mit dmidecode zurückgegebene Thread-Anzahl ist doppelt so hoch wie die Core-Anzahl. Sieht so aus, als ob es zeigt, ob die CPU HT-fähig ist, nicht, ob HT aktiviert ist oder nicht.
Dmitri Chubarov

@ Dmitri Weird. Ich habe dies gerade auf einem HT-fähigen Server (mit zwei Intel Xeon E5-2670 v3) mit deaktiviertem Hyperthreading ausgeführt, und die Anzahl der Kerne und Threads war gleich. Ich bin nicht sicher, was den Unterschied im Verhalten verursachen würde. Ich muss noch näher darauf eingehen.
Billyw

Ich habe dies gerade auf einem Dell R610 mit zwei X5680-Prozessoren ausgeführt, Hyperthreading ausgeschaltet, und die Thread-Anzahl ist doppelt so hoch wie die Kernanzahl. stephanieas antwort (lscpu) scheint zu funktionieren. Ich habe den iDRAC (Dell's Lights-Out, Out-of-Band-Prozessor [für diejenigen, die nicht Bescheid wissen]) doppelt überprüft und es heißt, dass Hyperthreading ausgeschaltet ist. Ich halte das nicht für dmidecodezuverlässig.
Mike S

Ich habe einen Dell 1950 (x5460-CPUs, kein Hyperthreading möglich) überprüft und lscpu war korrekt. Auch ein Dell R620 (E5-2690 [v1, glaube ich]) und es war korrekt.
Mike S

Aber der Kommentar von @Cedric Martin in einer der obigen Antworten zeigt, dass dies lscpunicht immer zuverlässig sein wird. Ich mag die Antwort von scottbb.
Mike 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

Dieses Ergebnis zeigt an, dass HT aktiviert ist, da siblingsNummer (12) größer als cpu cores(6) ist.

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

Wenn Sie lesen /sys/devices/system/cpu/cpu0/topology/thread_siblings_list, wird eine durch Kommas getrennte Liste der Thread-Geschwister (dh Hyperthread- "Kerne") von CPU 0 zurückgegeben.

Beispielsweise erhalte ich auf meinem 6-Core-Xeon mit 2 Sockets und aktiviertem Hyperthreading Folgendes:

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

Aber nachdem ich das Hyperthreading im BIOS ausgeschaltet habe, bekomme ich:

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

Unter der Annahme, dass CPU 0 immer verfügbar ist, zeigt das Überprüfen der thread_sibling_listprocfs-Datei von CPU 0 auf mehr als einen Knoten oder das Suchen nach einem Komma oder auch nur nach etwas anderem 0an, ob Hyperthreading aktiviert ist.


Ich würde in Perl antworten, aber 1) ich kenne Perl nicht und 2) ich gehe davon aus, dass die Lösung ein ziemlich trivialer Einzeiler ist.


2

Unter Linux funktioniert das gut:

$ 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  

Im obigen Beispiel haben wir 2 NUMA-Buchsen (SOCKET = 1 oder 2). Wir haben 16 physikalische Kerne (CORE = 0 bis 15). Jeder CORE hat einen geschwisterlichen Hyperthread (CORE = 0 enthält z. B. CPU 0,16.

Wir können den Hyperthread folgendermaßen überprüfen:

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

Die Cache-Speicherhierarchie lautet:

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

lscpu -p gibt eine Ausgabe im CSV-Format zum einfachen Parsen von Programmen aus.

$ 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

Hier ist ein Python-basierter Ansatz - er schlägt auch Möglichkeiten vor, ihn bei Bedarf zu deaktivieren.

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))

Der Vorschlag zum Deaktivieren von Hyperthreading ist suboptimal - die direkte Möglichkeit zum Deaktivieren von Hyperthreading ist echo off > /sys/devices/system/cpu/smt/control(abgesehen vom Deaktivieren im BIOS). Siehe auch die Antwort von Oscar für eine direkte Überprüfung.
Maxschlepzig

1

Viele Vorbehalte und Was-wäre-wenn in den Antworten hier ... die Antwort scheint nicht so offensichtlich zu sein. lscpuHat seine Fallstricke, die für beliebige "Kerne zählen und logische Prozessoren, dann vergleichen" gelten, beantwortet. Weil Sie logische Prozessoren mit einem einfachen Echo-Befehl ausschalten können (... dies kann beispielsweise in einer großen Unternehmensumgebung, in der Sie vom Turbomodus abhängig sind, kritisch sein).

Hier ist mein Versuch; danke an @scottbb für die inspiration:

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

Auf meinen Dell Xeon-basierten Computern enthält die Geschwisterliste ein Komma, wenn HT aktiviert ist. Auf meinem Laptop befindet sich ein Bindestrich (i5-3210m-Prozessor). Ich bereite mich auf Interpunktion vor.

Gedanken? Kritik?

Der Anforderer hat nach Perl gefragt.

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

Ich würde nur verwenden, grep -q [-.]da dies weniger zu tippen ist. FWIW, ich habe mehrere Xeons / i5 / i7 (einschließlich mobiler Varianten) überprüft und keiner von ihnen hat einen Bindestrich in der thread_siblings_list. Es reicht nicht aus, nur Scheck cpu0 - so etwas wie dies wäre robuster: grep -q , /sys/devices/system/cpu/cpu*/topology/thread_siblings_list. Doch nur a grep 1 /sys/devices/system/cpu/smt/active -qist noch wichtiger - vgl. Oskars Antwort
maxschlepzig

1

Der einfachste Weg, um zu überprüfen, ob SMT (generisch für HT, bei dem es sich nur um Intel Branding handelt) aktiv ist, ist:

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

gibt 0 für inaktiv oder 1 für aktiv

Sie können es tatsächlich zur Laufzeit ein- oder ausschalten mit:

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

Catting /sys/devices/system/cpu/smt/controlist auch möglich und ergibt on|off|forceoff|notsupported|notimplemented.
Maxschlepzig

0

Besser Sie überprüfen lscpu, wo Sie "Thread (s) pro Kern: 1" sehen können, bedeutet nur einen Thread pro 1 Kern.

    # 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

Stephaniea hat es bereits erwähnt lscpu. Ich wollte dem noch ein bisschen mehr hinzufügen.

Auf meinem AMD Epyc-Prozessor wird immer dann, wenn ein logischer Offline-Kern vorhanden ist, lscpueine neue zusätzliche Zeile mit dem Namen angezeigtOff-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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.