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.
linux
cpu
hyperthreading
Doppeldecker
quelle
quelle
dmidecode
du musst root sein.Antworten:
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
Unter Linux suche ich in der Regel nur nach "ht" in der Zeile "flags" von
/proc/cpuinfo
. Siehe zum Beispieloder wenn Sie das "ht" in das Muster aufnehmen möchten
(
\b
Stimmt mit den Wortgrenzen überein und hilft, Fehlalarme zu vermeiden, wenn "ht" Teil eines anderen Flags ist.)quelle
lscpu
ist der Weg zu überprüfen.Ich habe immer nur Folgendes verwendet und mir "Thread (s) pro Kern" angesehen.
Beachten Sie jedoch, dass diese Technik fehlschlägt, wenn ein logischer Prozessor mit einem einfachen ausgeschaltet wurde
quelle
echo 0 > /sys/devices/system/cpu/cpu31/online
, jetzt lscpu-BerichteThread(s) per core: 1
. Schlechtlscpu
! Ich schätze, ich werde das nicht mehr benutzen.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 :
quelle
$NUMCORE > $NUMLOG
wir sagen können, dass Hyperthreading aktiviert ist, richtig? Ist2 * $NUMCORE = $NUMLOG
dies immer der Fall oder haben manche CPUs 4x mehr Kerne?lscpu
verfügbar,lscpu
werden dieselben Informationen zusammen mit vielen zusätzlichen Metadaten bereitgestellt, und die Ausgabe vonlscpu
ist einfacher zu analysieren. aber diese lösung funktioniert und nutzt nur/proc/cpuinfo
.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
Xenserver
denen 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
.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
quelle
/sys/devices/system/cpu/smt/control
. Siehe auch die Antwort von OscarMit diesem Befehl können Sie die HT-Fähigkeit der CPU überprüfen
Mit dem folgenden Befehl können Sie die physische und logische CPU auflisten, die der Kernel sieht:
Diese Ausgabe wird auf einer Single-Core-HT-fähigen CPU ausgegeben:
Sie können das Ergebnis folgendermaßen lesen:
quelle
ht
in den CPU-Flags angezeigt.physical id
scheint den Sockel / Chip zu repräsentieren. Dascore id
scheint auf den gleichen physischen KernDieser eine Liner scheint den Trick für mich zu machen (erfordert Root-Rechte):
Die Ausgabe ist:
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 ...
quelle
dmidecode
zuverlässig.lscpu
nicht immer zuverlässig sein wird. Ich mag die Antwort von scottbb.Dieses Ergebnis zeigt an, dass HT aktiviert ist, da
siblings
Nummer (12) größer alscpu cores
(6) ist.quelle
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:
Aber nachdem ich das Hyperthreading im BIOS ausgeschaltet habe, bekomme ich:
Unter der Annahme, dass CPU 0 immer verfügbar ist, zeigt das Überprüfen der
thread_sibling_list
procfs-Datei von CPU 0 auf mehr als einen Knoten oder das Suchen nach einem Komma oder auch nur nach etwas anderem0
an, 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.
quelle
Unter Linux funktioniert das gut:
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:
Die Cache-Speicherhierarchie lautet:
lscpu -p gibt eine Ausgabe im CSV-Format zum einfachen Parsen von Programmen aus.
quelle
Hier ist ein Python-basierter Ansatz - er schlägt auch Möglichkeiten vor, ihn bei Bedarf zu deaktivieren.
quelle
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.Viele Vorbehalte und Was-wäre-wenn in den Antworten hier ... die Antwort scheint nicht so offensichtlich zu sein.
lscpu
Hat 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:
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.
quelle
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 derthread_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 agrep 1 /sys/devices/system/cpu/smt/active -q
ist noch wichtiger - vgl. Oskars AntwortDer einfachste Weg, um zu überprüfen, ob SMT (generisch für HT, bei dem es sich nur um Intel Branding handelt) aktiv ist, ist:
gibt 0 für inaktiv oder 1 für aktiv
Sie können es tatsächlich zur Laufzeit ein- oder ausschalten mit:
quelle
/sys/devices/system/cpu/smt/control
ist auch möglich und ergibton|off|forceoff|notsupported|notimplemented
.Besser Sie überprüfen lscpu, wo Sie "Thread (s) pro Kern: 1" sehen können, bedeutet nur einen Thread pro 1 Kern.
quelle
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,
lscpu
eine neue zusätzliche Zeile mit dem Namen angezeigtOff-line CPU(s) list:
quelle