Woher weiß ich, welche Prozessoren physische Kerne sind?

15

Ich habe hier einen Intel i7 2700k und möchte wissen, wie ich feststellen kann, welche Prozessoren physisch und welche virtuell sind (dh Hyperthreading). Ich führe derzeit ein Conky-Skript aus, um meine CPU-Temperaturen, Frequenzen und Lasten anzuzeigen, bin mir aber nicht sicher, ob ich es richtig gemacht habe:

genial

Ich habe mein eigenes Skript geschrieben, um Temperaturen und Frequenzen zu ermitteln i7z, aber diese beziehen sich nur auf physische Kerne. Ich zeige momentan jeden Kern so an:

${cpu cpu1} ${lua display_temp 0} ${lua display_load 0}
${cpu cpu2}
${cpu cpu3} ${lua display_temp 1} ${lua display_load 1}
${cpu cpu4}
# ...

Ich bin nicht sicher, ob das richtig ist, wegen der Belastungen und Temperaturen, die ich manchmal sehe. In /proc/cpuinfo, wie werden die Kerne sortiert? Erst alles physisch, dann alles virtuell? Jeder physische Kern dann seine virtuellen Kerne? Wie werden sie sortiert?

Naftuli Kay
quelle

Antworten:

16

Sie können über jeden Prozessorkern Bescheid wissen, indem Sie jeden Eintrag in cpuinfo untersuchen:

processor       : 0
[...]
physical id     : 0
siblings        : 8
core id         : 0
cpu cores       : 4
apicid          : 0

processor       : 1
[...]
physical id     : 0
siblings        : 8
core id         : 1
cpu cores       : 4
apicid          : 2 

processor       : 2
[...]
physical id     : 0
siblings        : 8
core id         : 2
cpu cores       : 4
apicid          : 4 

processor       : 3
[...]
physical id     : 0
siblings        : 8
core id         : 3
cpu cores       : 4
apicid          : 6

processor       : 4
[...]
physical id     : 0
siblings        : 8
core id         : 0
cpu cores       : 4
apicid          : 1

[and so on]

physical idZeigt die Kennung des Prozessors an. Sofern Sie nicht über ein Multiprozessor-Setup verfügen (zwei separate physische Prozessoren auf einem Computer), ist es immer 0.

siblings Zeigt die Anzahl der Prozessoren an, die an denselben physischen Prozessor angeschlossen sind.

core idZeigt die Kennung des aktuellen Kerns bis zu einer Gesamtsumme von cpu cores. Sie können diese Informationen verwenden, um zu korrelieren, welcher virtuelle Prozessor in einen einzelnen Kern integriert wird.

apicid(und original apicid) zeigen die Nummer des (virtuellen) Prozessors, wie vom BIOS angegeben.

Beachten Sie, dass es 8 Geschwister und 4 Kerne gibt, sodass 2 virtuelle Prozessoren pro Kern vorhanden sind. Beim Hyperthreading wird nicht zwischen "virtuell" und "real" unterschieden. Mithilfe dieser Informationen können Sie jedoch zuordnen, welche Prozessoren aus demselben Kern stammen.

BatchyX
quelle
5

Das /sysDateisystem enthält einen schönen Überblick über diese Informationen. Hier ist ein Beispiel von einer SMP Quadcore Box mit Hyperthreading:

# grep . /sys/devices/system/cpu/cpu{,1}?/topology/thread_siblings | tr : \\t | sed 's,^,    ,'
/sys/devices/system/cpu/cpu0/topology/thread_siblings   00000000,00000101
/sys/devices/system/cpu/cpu1/topology/thread_siblings   00000000,00000202
/sys/devices/system/cpu/cpu2/topology/thread_siblings   00000000,00000404
/sys/devices/system/cpu/cpu3/topology/thread_siblings   00000000,00000808
/sys/devices/system/cpu/cpu4/topology/thread_siblings   00000000,00001010
/sys/devices/system/cpu/cpu5/topology/thread_siblings   00000000,00002020
/sys/devices/system/cpu/cpu6/topology/thread_siblings   00000000,00004040
/sys/devices/system/cpu/cpu7/topology/thread_siblings   00000000,00008080
/sys/devices/system/cpu/cpu8/topology/thread_siblings   00000000,00000101
/sys/devices/system/cpu/cpu9/topology/thread_siblings   00000000,00000202
/sys/devices/system/cpu/cpu10/topology/thread_siblings  00000000,00000404
/sys/devices/system/cpu/cpu11/topology/thread_siblings  00000000,00000808
/sys/devices/system/cpu/cpu12/topology/thread_siblings  00000000,00001010
/sys/devices/system/cpu/cpu13/topology/thread_siblings  00000000,00002020
/sys/devices/system/cpu/cpu14/topology/thread_siblings  00000000,00004040
/sys/devices/system/cpu/cpu15/topology/thread_siblings  00000000,00008080

Identischer Inhalt kennzeichnet Threads desselben Kerns. Dh

  • cpu0 / cpu8
  • CPU1 / CPU9
  • etc.

Die core_siblingsPseudodatei enthält ähnliche Informationen sowie weitere Informationen zur Topologie.

Felix Frank
quelle
3

Wenn Sie das htFlag ' ' in sehen /proc/cpuinfo, ist Hyper-Threading aktiviert und jeder reale Kern ist in mehrere Threads aufgeteilt. Es gibt kein Konzept für einen realen Thread und einen virtuellen Thread: Beide sind effektiv virtuell.

Was Sie möglicherweise untersuchen möchten, ist das Vergleichen von Kernen und Sockeln. Verwenden Sie die physical idTopologie-ID, um Kerne zu gruppieren.

Steve-o
quelle
Das htFlag zeigt nur an, dass Multi-Threading (HTT) von der CPU unterstützt wird - nicht, ob es aktiviert ist oder nicht. Selbst dann kann man sich nicht immer darauf verlassen, dass beispielsweise ein i5 i5-6500 fälschlicherweise HTT unterstützt: ark.intel.com/content/www/us/en/ark/products/88184/…
Anthony G - Gerechtigkeit für Monica
1

Die vorherige Antwort ist sehr interessant.

Nach einigem googeln habe ich einige verwandte Themen gefunden:

Bei der letzten Verknüpfung funktioniert das Python-Skript nicht, wenn Ihr Host über viele physische IDs verfügt. Ich habe versucht, es mit einer anderen Bedingung am Ende zu ändern:

Ändern:

if p > 0:

zu

if p % 2 == 1:

Aber es funktioniert nicht wie erwartet, basierend auf der vorherigen Nachricht. Übrigens können Sie etwas umfassenderes tun als:

grep . /sys/devices/system/cpu/cpu{,1}?/topology/thread_siblings | tr : \\\t | sed -r 's,^,\s\s\s\s,'

mit:

for file in /sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_list; do echo -n "$file "; cat $file; done |sort -k2 -n

[...]

Was bei einem Host mit vielen Kernen mit aktivierter Hyperthreading-Funktion interessant ist, ist die Verteilung der logischen Kerne auf der Hardware.

Zum Beispiel auf einem meiner Computer (48 logische Kerne, 2 physische Prozessoren, 24 (12 * 2) "reale Kerne" (also auch 24 virtuelle Kerne)):

for file in /sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_list; do echo -n "$file "; cat $file; done |sort -k2 -n

 /sys/devices/system/cpu/cpu0/topology/thread_siblings_list 0,24
 /sys/devices/system/cpu/cpu24/topology/thread_siblings_list 0,24
 /sys/devices/system/cpu/cpu1/topology/thread_siblings_list 1,25
 /sys/devices/system/cpu/cpu25/topology/thread_siblings_list 1,25
 /sys/devices/system/cpu/cpu26/topology/thread_siblings_list 2,26
 /sys/devices/system/cpu/cpu2/topology/thread_siblings_list 2,26
 /sys/devices/system/cpu/cpu27/topology/thread_siblings_list 3,27
 /sys/devices/system/cpu/cpu3/topology/thread_siblings_list 3,27
 /sys/devices/system/cpu/cpu28/topology/thread_siblings_list 4,28
 /sys/devices/system/cpu/cpu4/topology/thread_siblings_list 4,28
 /sys/devices/system/cpu/cpu29/topology/thread_siblings_list 5,29
 /sys/devices/system/cpu/cpu5/topology/thread_siblings_list 5,29
 /sys/devices/system/cpu/cpu30/topology/thread_siblings_list 6,30
 /sys/devices/system/cpu/cpu6/topology/thread_siblings_list 6,30
 /sys/devices/system/cpu/cpu31/topology/thread_siblings_list 7,31
 /sys/devices/system/cpu/cpu7/topology/thread_siblings_list 7,31
 /sys/devices/system/cpu/cpu32/topology/thread_siblings_list 8,32
 /sys/devices/system/cpu/cpu8/topology/thread_siblings_list 8,32
 /sys/devices/system/cpu/cpu33/topology/thread_siblings_list 9,33
 /sys/devices/system/cpu/cpu9/topology/thread_siblings_list 9,33
 /sys/devices/system/cpu/cpu10/topology/thread_siblings_list 10,34
 /sys/devices/system/cpu/cpu34/topology/thread_siblings_list 10,34
 /sys/devices/system/cpu/cpu11/topology/thread_siblings_list 11,35
 /sys/devices/system/cpu/cpu35/topology/thread_siblings_list 11,35
 /sys/devices/system/cpu/cpu12/topology/thread_siblings_list 12,36
 /sys/devices/system/cpu/cpu36/topology/thread_siblings_list 12,36
 /sys/devices/system/cpu/cpu13/topology/thread_siblings_list 13,37
 /sys/devices/system/cpu/cpu37/topology/thread_siblings_list 13,37
 /sys/devices/system/cpu/cpu14/topology/thread_siblings_list 14,38
 /sys/devices/system/cpu/cpu38/topology/thread_siblings_list 14,38
 /sys/devices/system/cpu/cpu15/topology/thread_siblings_list 15,39
 /sys/devices/system/cpu/cpu39/topology/thread_siblings_list 15,39
 /sys/devices/system/cpu/cpu16/topology/thread_siblings_list 16,40
 /sys/devices/system/cpu/cpu40/topology/thread_siblings_list 16,40
 /sys/devices/system/cpu/cpu17/topology/thread_siblings_list 17,41
 /sys/devices/system/cpu/cpu41/topology/thread_siblings_list 17,41
 /sys/devices/system/cpu/cpu18/topology/thread_siblings_list 18,42
 /sys/devices/system/cpu/cpu42/topology/thread_siblings_list 18,42
 /sys/devices/system/cpu/cpu19/topology/thread_siblings_list 19,43
 /sys/devices/system/cpu/cpu43/topology/thread_siblings_list 19,43
 /sys/devices/system/cpu/cpu20/topology/thread_siblings_list 20,44
 /sys/devices/system/cpu/cpu44/topology/thread_siblings_list 20,44
 /sys/devices/system/cpu/cpu21/topology/thread_siblings_list 21,45
 /sys/devices/system/cpu/cpu45/topology/thread_siblings_list 21,45
 /sys/devices/system/cpu/cpu22/topology/thread_siblings_list 22,46
 /sys/devices/system/cpu/cpu46/topology/thread_siblings_list 22,46
 /sys/devices/system/cpu/cpu23/topology/thread_siblings_list 23,47
 /sys/devices/system/cpu/cpu47/topology/thread_siblings_list 23,47

Dies bedeutet, dass cpu0 und cpu24 dieselbe physikalische Hardware- "Adresse" haben. Gleiches gilt für cpu1 und cpu25 ...

Wenn ich also Hyperthreading unter meinem Linux-Betriebssystem deaktivieren möchte, sollte ich '0' in CPU {24..47} / online mit setzen

for fake_cpu in {24..47}; do echo 0 > /sys/devices/system/cpu/cpu$fake_cpu/online;done

Sie werden feststellen, wie interessant mein System die Kerne nummeriert.

remyd1
quelle
Bitte verwenden Sie Codeblöcke anstelle von Anführungszeichen für Dinge auf dem Terminal. es ist viel einfacher zu lesen.
HalosGhost
1

Sie können auch lscpu verwenden:

# lscpu --all --extended
CPU NODE SOCKET CORE L1d:L1i:L2:L3:L4 ONLINE MAXMHZ    MINMHZ
0   0    0      0    0:0:0:0:0        yes    3200.0000 800.0000
1   0    0      1    1:1:1:0:0        yes    3200.0000 800.0000
2   0    0      2    2:2:2:0:0        yes    3200.0000 800.0000
3   0    0      3    3:3:3:0:0        yes    3200.0000 800.0000
4   0    0      0    0:0:0:0:0        yes    3200.0000 800.0000
5   0    0      1    1:1:1:0:0        yes    3200.0000 800.0000
6   0    0      2    2:2:2:0:0        yes    3200.0000 800.0000
7   0    0      3    3:3:3:0:0        yes    3200.0000 800.0000

Hier gehen die logischen Kerne 0 und 4 zu Kern 0

NickSoft
quelle