我这里有一个 Intel i7 2700k,我想知道如何辨别哪些处理器是物理的,哪些是虚拟的(即:超线程)。我目前正在运行 Conky 脚本来显示我的 CPU 温度、频率和负载,但我不确定我是否做得正确:
我编写了自己的脚本来获取温度和频率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
,核心是如何排序的?首先是物理的,然后是虚拟的?每个物理核心然后是它的虚拟核心吗?它们是如何排序的?
答案1
您可以通过检查每个 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
.您可以使用此信息来关联哪个虚拟处理器进入单个核心。
apicid
(和original apicid
)显示 BIOS 给出的(虚拟)处理器的编号。
请注意,有 8 个同级处理器和 4 个核心,因此每个核心有 2 个虚拟处理器。超线程中没有“虚拟”或“真实”的区别。但使用此信息,您可以关联哪些处理器来自同一核心。
答案2
您还可以使用 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
答案3
文件/sys
系统很好地概述了这些信息。以下是具有超线程功能的 SMP 四核机箱的示例:
# 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
相同内容表示同一核心的线程。 IE
- 中央处理器0/中央处理器8
- 中央处理器1/中央处理器9
- ETC。
伪文件中有类似的信息core_siblings
,以及更多的拓扑信息。
答案4
前面的回答很有意思。
经过一番谷歌搜索后,我发现了一些相关主题:
https://serverfault.com/questions/235825/disable-hyperthreading-from-within-linux-no-access-to-bios
https://stackoverflow.com/questions/7274585/linux-find-out-hyper-threaded-core-id
在最后一个链接中,当您的主机有许多物理 ID 时,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}/online 中
for fake_cpu in {24..47}; do echo 0 > /sys/devices/system/cpu/cpu$fake_cpu/online;done
您会注意到我的系统对核心进行编号是多么有趣。