Come faccio a sapere quali processori sono core fisici?


15

Ho un Intel i7 2700k qui e mi piacerebbe sapere come posso sapere quali processori sono fisici e quali sono virtuali (es: hyperthreading). Attualmente sto eseguendo uno script Conky per visualizzare le temperature, le frequenze e i carichi della mia CPU, ma non sono sicuro di averlo fatto bene:

eccezionale

Ho scritto la mia sceneggiatura per ottenere temperature e frequenze i7z, ma queste corrispondono solo ai core fisici. Attualmente sto visualizzando ogni core in questo modo:

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

Non sono sicuro che sia giusto, a causa dei carichi e delle temperature che vedo a volte. In /proc/cpuinfo, come vengono ordinati i core? Prima tutto fisico poi tutto virtuale? Ogni core fisico quindi i suoi core virtuali? Come vengono ordinati?

Risposte:


16

Puoi conoscere ogni core del processore esaminando ogni voce di 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 idmostra l'identificatore del processore. A meno che tu non abbia una configurazione multiprocessore (con due processori fisici separati in una macchina), sarà sempre 0.

siblings mostra il numero di processori collegati allo stesso processore fisico.

core idmostra l'identificatore del core attuale, per un totale di cpu cores. È possibile utilizzare queste informazioni per correlare quale processore virtuale entra in un singolo core.

apicid (e original apicid ) mostra il numero del processore (virtuale), come indicato dal BIOS.

Nota che ci sono 8 fratelli e 4 core, quindi ci sono 2 processori virtuali per core. Non esiste alcuna distinzione tra "virtuale" o "reale" nell'hyperthreading. Ma usando queste informazioni puoi associare quali processori provengono dallo stesso core.


5

Il /sysfilesystem contiene una buona panoramica di queste informazioni. Ecco un esempio da una scatola quadcore SMP con 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

Il contenuto identico indica i thread dello stesso core. ie

  • cpu0 / cpu8
  • cpu1 / cpu9
  • eccetera.

Ci sono informazioni simili nello core_siblingspseudo-file, insieme a ulteriori informazioni sulla topologia.


3

Se vedi il htflag ' ' in /proc/cpuinfoallora hai l'hyper-threading abilitato e ogni core reale è diviso in più thread, non esiste un concetto di thread reale e thread virtuale: entrambi sono effettivamente virtuali.

Quello che potresti voler indagare è il confronto di core e socket, utilizzare l' physical ididentificatore della topologia per raggruppare i core.


Il htflag indica solo che il multi-threading (HTT) è supportato dalla CPU, non se è abilitato o meno. Anche in questo caso, non si può sempre fare affidamento, ad esempio, indica erroneamente che un i5-6500 supporta HTT: ark.intel.com/content/www/us/en/ark/products/88184/…
Anthony G - giustizia per Monica,

1

La risposta precedente è molto interessante.

Dopo aver cercato su Google, ho trovato alcuni argomenti correlati:

Nell'ultimo collegamento, lo script python non funziona quando l'host ha molti ID fisici. Ho provato a modificarlo con una condizione diversa alla fine:

Mutevole:

if p > 0:

per

if p % 2 == 1:

Ma non funziona come previsto, in base al messaggio precedente. A proposito, puoi fare qualcosa di più completo di:

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

con:

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

[...]

Ciò che è interessante su un host con molti core con abilitazione hyperthreading è la distribuzione di core logici sull'hardware.

Ad esempio, su uno dei miei computer (48 core logici, 2 processori fisici, 24 (12 * 2) "core reali" (quindi anche 24 core virtuali)):

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

Significa che cpu0 e cpu24 condividono lo stesso "indirizzo" fisico dell'hardware. Stessa cosa per cpu1 e cpu25 ...

Quindi, in sostanza, se desidero disabilitare l'hyperthreading dal mio sistema operativo Linux, dovrei mettere '0' in cpu {24..47} / online con

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

Noterai quanto sia interessante il mio sistema numerando i core.


Si prega di utilizzare i blocchi di codice anziché le virgolette per le cose sul terminale; è molto più semplice da leggere.
HalosGhost

1

puoi anche usare 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

qui i core logici 0 e 4 vanno al core 0

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.