那个男人为了中央处理器组似乎没有清楚地列出如何找出哪些数字映射到哪些处理单元。我现在的机器有两个英特尔至强 E5645每个都有 6 个核心并启用了超线程,因此我总共有 24 个处理单元,可以用 cpusets 来参考。我的挑战是 1) 确定哪些 cpuset ID 号映射到哪个处理器 2) 确定哪些 cpuset ID 号配对(例如核心上的同级)
输出的数字是否与lscpu
我应该用来指代 cpu 集处理器的标识符相同?如果是这样,这里的数字似乎是交替的,并且这个答案(1)是“偶数是一个处理器,奇数是另一个处理器”,但我不确定我是否正确地阅读了它。
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 24
On-line CPU(s) list: 0-23
Thread(s) per core: 2
Core(s) per socket: 6
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 44
Stepping: 2
CPU MHz: 2393.964
BogoMIPS: 4788.01
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 12288K
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22
NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23
lstopo
从hwloc
包中似乎向我展示了(2)的答案,如果我正确阅读了手册页,这些P#...
位是“操作系统使用的”标识符,这让我相信这些是我需要传递给的cpu 集。因此,将进程限制在 cpus 0 和 12 上将允许在同一核心上使用两个线程,而将其限制在 cpus 0 和 2 上将允许在两个不同核心上使用两个线程。这看起来正确吗?
$ lstopo
Machine (35GB)
NUMANode L#0 (P#0 18GB) + Socket L#0 + L3 L#0 (12MB)
L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
PU L#0 (P#0)
PU L#1 (P#12)
L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1
PU L#2 (P#2)
PU L#3 (P#14)
L2 L#2 (256KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2
PU L#4 (P#4)
PU L#5 (P#16)
L2 L#3 (256KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3
PU L#6 (P#6)
PU L#7 (P#18)
L2 L#4 (256KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4
PU L#8 (P#8)
PU L#9 (P#20)
L2 L#5 (256KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5
PU L#10 (P#10)
PU L#11 (P#22)
NUMANode L#1 (P#1 18GB) + Socket L#1 + L3 L#1 (12MB)
L2 L#6 (256KB) + L1d L#6 (32KB) + L1i L#6 (32KB) + Core L#6
PU L#12 (P#1)
PU L#13 (P#13)
L2 L#7 (256KB) + L1d L#7 (32KB) + L1i L#7 (32KB) + Core L#7
PU L#14 (P#3)
PU L#15 (P#15)
L2 L#8 (256KB) + L1d L#8 (32KB) + L1i L#8 (32KB) + Core L#8
PU L#16 (P#5)
PU L#17 (P#17)
L2 L#9 (256KB) + L1d L#9 (32KB) + L1i L#9 (32KB) + Core L#9
PU L#18 (P#7)
PU L#19 (P#19)
L2 L#10 (256KB) + L1d L#10 (32KB) + L1i L#10 (32KB) + Core L#10
PU L#20 (P#9)
PU L#21 (P#21)
L2 L#11 (256KB) + L1d L#11 (32KB) + L1i L#11 (32KB) + Core L#11
PU L#22 (P#11)
PU L#23 (P#23)
HostBridge L#0
PCIBridge
PCI 14e4:163a
Net L#0 "eth0"
PCI 14e4:163a
Net L#1 "eth1"
PCIBridge
PCI 102b:0532
PCI 8086:2921
Block L#2 "sda"
PCI 8086:2926
答案1
使用
cat /proc/cpuinfo
在那里你会得到如下列出的每个超线程:
processor : 0
physical id : 0
core id : 1
“处理器”代表“逻辑处理器”,作为处理器呈现给操作系统。如果您打开了超线程,您将看到每个核心有两个“逻辑处理器”。 “物理 ID”将是您可以触摸的处理器(您有两个)。
以下是我的具有超线程功能的 1 处理器 4 核系统的列表:
# cat /proc/cpuinfo|egrep "processor|core id|physical id"
processor : 0
physical id : 0
core id : 0
processor : 1
physical id : 0
core id : 1
processor : 2
physical id : 0
core id : 2
processor : 3
physical id : 0
core id : 3
processor : 4
physical id : 0
core id : 0
processor : 5
physical id : 0
core id : 1
processor : 6
physical id : 0
core id : 2
processor : 7
physical id : 0
core id : 3
答案2
lstopo --cpuset
将告诉您应该使用哪些 cpuset 将每个逻辑处理器包含在掩码格式中。
您可以将其转换为处理器列表格式以检查处理器编号是否匹配。
或者,如果你像我一样而且很懒,你可以做类似的事情
taskset 0x00800000 grep -i Cpus_allowed /proc/self/status
你会得到类似的输出
Cpus_allowed: 000,00800000
Cpus_allowed_list: 23
当我lstopo --cpuset
在我的测试机上使用时,它匹配
PU L#46 (P#23) cpuset=0x00800000
因此,当您使用列表格式设置 cpuset 时,应该使用 (P#nn) 中的数字。