Comment savoir quels processeurs sont des cœurs physiques?

15

J'ai un Intel i7 2700k ici, et j'aimerais savoir comment je peux savoir quels processeurs sont physiques et lesquels sont virtuels (c'est-à-dire: hyperthreading). J'exécute actuellement un script Conky pour afficher les températures, les fréquences et les charges de mon processeur, mais je ne suis pas sûr de l'avoir fait correctement:

impressionnant

J'ai écrit mon propre script pour obtenir des températures et des fréquences i7z, mais celles-ci ne correspondent qu'à des cœurs physiques. J'affiche actuellement chaque noyau comme ceci:

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

Je ne suis pas sûr que ce soit vrai, à cause des charges et des températures que je vois parfois. Dans /proc/cpuinfo, comment les noyaux sont-ils triés? Tout d'abord physique puis virtuel? Chaque noyau physique puis son ou ses noyaux virtuels? Comment sont-ils triés?

Naftuli Kay
la source

Réponses:

16

Vous pouvez connaître chaque cœur de processeur en examinant chaque entrée cpuinfo:

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 idmontre l'identifiant du processeur. À moins que vous n'ayez une configuration multiprocesseur (ayant deux processeurs physiques séparés dans une machine), il sera toujours 0.

siblings affiche le nombre de processeurs connectés au même processeur physique.

core idafficher l'identifiant du noyau actuel, sur un total de cpu cores. Vous pouvez utiliser ces informations pour corréler le processeur virtuel qui va dans un seul cœur.

apicid(et original apicid) montrer le numéro du processeur (virtuel), tel que donné par le bios.

Notez qu'il y a 8 frères et sœurs et 4 cœurs, il y a donc 2 processeurs virtuels par cœur. Il n'y a pas de distinction entre «virtuel» ou «réel» en hyperthreading. Mais en utilisant ces informations, vous pouvez associer les processeurs du même noyau.

BatchyX
la source
5

Le /syssystème de fichiers contient une belle vue d'ensemble de ces informations. Voici un exemple d'une boîte quadcore SMP avec 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

Un contenu identique dénote des threads du même noyau. C'est à dire

  • cpu0 / cpu8
  • cpu1 / cpu9
  • etc.

Le core_siblingspseudo-fichier contient des informations similaires, ainsi que des informations sur la topologie.

Felix Frank
la source
3

Si vous voyez l' htindicateur ' ', l' /proc/cpuinfohyper-threading est activé et chaque noyau réel est divisé en plusieurs threads, il n'y a pas de concept de thread réel et de thread virtuel: les deux sont effectivement virtuels.

Ce que vous voudrez peut-être étudier, c'est comparer les cœurs et les sockets, utilisez l' physical ididentifiant de topologie ' ' pour regrouper les cœurs.

Steve-o
la source
L' htindicateur indique uniquement que le multithread (HTT) est pris en charge par le processeur - pas s'il est activé ou non. Même alors, il ne peut pas toujours être invoqué, par exemple, il indique à tort qu'un i5 i5-6500 prend en charge HTT: ark.intel.com/content/www/us/en/ark/products/88184/…
Anthony G - justice pour Monica
1

La réponse précédente est très intéressante.

Après quelques recherches sur Google, j'ai trouvé des sujets connexes:

Sur le dernier lien, le script python ne fonctionne pas lorsque votre hôte possède de nombreux ID physiques. J'ai essayé de le modifier avec une condition différente à la fin:

En changeant:

if p > 0:

à

if p % 2 == 1:

Mais cela ne fonctionne pas comme prévu, sur la base du message précédent. Soit dit en passant, vous pouvez faire quelque chose de plus complet que:

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

avec:

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

[...]

Ce qui est intéressant sur un hôte à plusieurs cœurs avec activation d'hyperthreading, c'est la distribution des cœurs logiques sur le matériel.

Par exemple, sur l'un de mes ordinateurs (48 cœurs logiques, 2 processeurs physiques, 24 (12 * 2) «cœurs réels» (donc, également 24 cœurs virtuels)):

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

Cela signifie que cpu0 et cpu24 partagent la même "adresse" matérielle physique. Même chose pour cpu1 et cpu25 ...

Donc, fondamentalement, si je souhaite désactiver l'hyperthreading à partir de mon système d'exploitation Linux, je devrais mettre "0" dans cpu {24..47} / en ligne avec

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

Vous remarquerez à quel point mon système numérote les cœurs.

remyd1
la source
Veuillez utiliser des blocs de code au lieu de guillemets pour les choses sur le terminal; c'est beaucoup plus simple à lire.
HalosGhost
1

vous pouvez également utiliser lscpu:

# 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

ici les cœurs logiques 0 et 4 vont au cœur 0

NickSoft
la source