Как узнать, какие процессоры являются физическими ядрами?

15

У меня есть Intel i7 2700k, и я хотел бы узнать, как определить, какие процессоры являются физическими, а какие - виртуальными (например, гиперпоточность). В настоящее время я запускаю скрипт Conky для отображения температуры, частоты и нагрузки моего процессора, но я не уверен, что все сделал правильно:

классно

Я написал свой собственный скрипт для получения температур и частот i7z, но они соответствуют только физическим ядрам. В настоящее время я отображаю каждое ядро ​​так:

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

Я не уверен, что это правильно, из-за нагрузок и температур, которые я иногда вижу. В /proc/cpuinfo, как это ядра сортируют? Сначала все физическое, потом все виртуальное? Каждое физическое ядро, то его виртуальное ядро ​​(ядра)? Как они отсортированы?

Нафтули Кей
источник

Ответы:

16

Вы можете узнать о каждом ядре процессора, изучив каждую запись 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 idпоказывает идентификатор процессора. Если у вас нет многопроцессорной установки (с двумя отдельными физическими процессорами в машине), она всегда будет 0.

siblings показать номер процессора, подключенного к тому же физическому процессору.

core idпоказать идентификатор текущего ядра, в общей сложности cpu cores. Вы можете использовать эту информацию, чтобы сопоставить, какой виртуальный процессор входит в одно ядро.

apicidoriginal apicid) показать номер (виртуального) процессора, как указано в BIOS.

Обратите внимание, что там 8 братьев и сестер и 4 ядра, поэтому на каждое ядро ​​приходится 2 виртуальных процессора. В гиперпоточности нет различия между «виртуальным» и «реальным». Но используя эту информацию, вы можете определить, какие процессоры принадлежат одному ядру.

BatchyX
источник
5

/sysФайловая система имеет хороший обзор этой информации. Вот пример из квадроцикла SMP с 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

Одинаковое содержание обозначает потоки одного ядра. Т.е.

  • процессор0 / процессор8
  • процессор1 / процессор9
  • и т.п.

В core_siblingsпсевдофайле содержится аналогичная информация , а также дополнительная информация о топологии.

Феликс Франк
источник
3

Если вы видите htфлаг ' ', /proc/cpuinfoто у вас включена гиперпоточность, и каждое реальное ядро ​​разделено на несколько потоков, понятия реального и виртуального потоков не существует: оба они фактически являются виртуальными.

Возможно, вы захотите изучить сравнение ядер и сокетов, используйте physical idидентификатор топологии ' ', чтобы сгруппировать ядра вместе.

Стив-О
источник
Этот htфлаг указывает только на то, что многопоточность (HTT) поддерживается процессором, а не на том, включена она или нет. Даже тогда на это нельзя всегда полагаться, например, это неверно указывает, что i5 i5-6500 поддерживает HTT: ark.intel.com/content/www/us/en/ark/products/88184/…
Энтони Дж. - справедливость для Моники
1

Предыдущий ответ очень интересный.

После некоторого поиска в Google, я нашел некоторые связанные темы:

По последней ссылке скрипт Python не работает, когда у вашего хоста много физических идентификаторов. Я попытался изменить его с другим условием в конце:

Изменение:

if p > 0:

в

if p % 2 == 1:

Но это не работает, как ожидалось, основываясь на предыдущем сообщении. Кстати, вы можете сделать что-то более всеобъемлющее, чем:

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

с:

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

[...]

Что интересно на хосте с множеством ядер с поддержкой гиперпоточности, так это распределение логических ядер на оборудовании.

Например, на одном из моих компьютеров (48 логических ядер, 2 физических процессора, 24 (12 * 2) «реальных ядра» (а также 24 виртуальных ядра)):

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

Это означает, что cpu0 и cpu24 используют один и тот же физический аппаратный «адрес». То же самое для CPU1 и CPU25 ...

Так что, в принципе, если я хочу отключить гиперпоточность в моей ОС Linux, я должен поставить '0' в cpu {24..47} / онлайн с

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

Вы заметите, насколько интересна моя система нумерации ядер.

remyd1
источник
Пожалуйста, используйте кодовые блоки вместо кавычек для вещей на терминале; это гораздо проще читать.
HalosGhost
1

Вы также можете использовать 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

здесь логические ядра 0 и 4 идут к ядру 0

NickSoft
источник