Skąd mam wiedzieć, które procesory są rdzeniami fizycznymi?

15

Mam tutaj procesor Intel i7 2700k i chciałbym wiedzieć, jak mogę stwierdzić, które procesory są fizyczne, a które wirtualne (tj. Hiperwątkowość). Obecnie uruchamiam skrypt Conky, aby wyświetlić moją temperaturę procesora, częstotliwości i obciążenia, ale nie jestem pewien, czy zrobiłem to dobrze:

niesamowite

Napisałem własny skrypt, aby uzyskać informacje o temperaturach i częstotliwościach i7z, ale odpowiadają one tylko rdzeniom fizycznym. Obecnie wyświetlam każdy rdzeń w ten sposób:

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

Nie jestem pewien, czy to prawda, z powodu obciążeń i temperatur, które czasem widzę. W /proc/cpuinfojaki sposób sortowane są rdzenie? Po pierwsze wszystkie fizyczne, a następnie wirtualne? Każdy rdzeń fizyczny, a następnie jego wirtualny rdzeń (rdzenie)? Jak są sortowane?

Naftuli Kay
źródło

Odpowiedzi:

16

Możesz dowiedzieć się o każdym rdzeniu procesora, sprawdzając każdy wpis 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 idpokazuje identyfikator procesora. O ile nie masz konfiguracji wieloprocesorowej (posiadającej dwa oddzielne, fizyczne procesory w maszynie), zawsze będzie wynosić 0.

siblings pokaż liczbę procesorów podłączonych do tego samego procesora fizycznego.

core idpokaż identyfikator bieżącego rdzenia, w sumie do cpu cores. Tych informacji można użyć do skorelowania, który procesor wirtualny przechodzi w pojedynczy rdzeń.

apicid (i original apicid ) pokaż numer (wirtualnego) procesora podany przez bios.

Pamiętaj, że jest tam 8 rodzeństwa i 4 rdzenie, więc na każdy rdzeń przypada 2 procesor wirtualny. W hyperthreading nie ma różnicy między „wirtualnym” a „rzeczywistym”. Ale korzystając z tych informacji możesz powiązać procesory z tego samego rdzenia.

BatchyX
źródło
5

System /sysplików zawiera ładny przegląd tych informacji. Oto przykład z SAD quadcore box z 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

Identyczna treść oznacza wątki tego samego rdzenia. To znaczy

  • cpu0 / cpu8
  • cpu1 / cpu9
  • itp.

core_siblingsPseudo-plik zawiera podobne informacje , a także dodatkowe informacje o topologii.

Felix Frank
źródło
3

Jeśli zobaczysz htflagę „ ”, oznacza /proc/cpuinfoto, że masz włączone hiperwątkowanie i każdy prawdziwy rdzeń jest podzielony na wiele wątków, nie ma pojęcia o prawdziwym wątku i wątku wirtualnym: oba są faktycznie wirtualne.

To, co możesz chcieć zbadać, to porównanie rdzeni i gniazd, użyj physical ididentyfikatora topologii, aby zgrupować rdzenie razem.

Steve-o
źródło
htFlaga wskazuje jedynie, że wielowątkowości (HTT) jest obsługiwany przez procesor - jeśli nie jest włączone czy nie. Nawet wtedy nie zawsze można polegać, np. Fałszywie wskazuje, że i5 i5-6500 obsługuje HTT: ark.intel.com/content/www/us/en/ark/products/88184/...
Anthony G. - sprawiedliwość dla Moniki
1

Poprzednia odpowiedź jest bardzo interesująca.

Po pewnym googlowaniu znalazłem pokrewne tematy:

W ostatnim linku skrypt Pythona nie działa, gdy host ma wiele fizycznych identyfikatorów. Na końcu próbowałem go zmodyfikować, stosując inny warunek:

Wymiana pieniędzy:

if p > 0:

do

if p % 2 == 1:

Ale to nie działa zgodnie z oczekiwaniami, w oparciu o poprzednią wiadomość. Nawiasem mówiąc, możesz zrobić coś bardziej kompleksowego niż:

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

z:

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

[...]

Co ciekawe na hoście z wieloma rdzeniami z włączoną funkcją hyperthreading, jest dystrybucja rdzeni logicznych na sprzęcie.

Na przykład na jednym z moich komputerów (48 rdzeń logiczny, 2 procesory fizyczne, 24 (12 * 2) „prawdziwe rdzenie” (czyli również 24 rdzenie wirtualne)):

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

Oznacza to, że cpu0 i cpu24 mają ten sam fizyczny „adres” sprzętowy. To samo dotyczy procesorów cpu1 i cpu25 ...

Zasadniczo, jeśli chciałbym wyłączyć hyperthreading z mojego systemu Linux, powinienem wstawić „0” w jednostce centralnej {24..47} / online z

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

Zauważysz, jak interesujący jest mój system numerowania rdzeni.

remyd1
źródło
Proszę używać bloków kodu zamiast cudzysłowów dla rzeczy na terminalu; jest o wiele prostszy do odczytania.
HalosGhost,
1

możesz także użyć 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

tutaj rdzenie logiczne 0 i 4 przechodzą do rdzenia 0

NickSoft
źródło