人们可能会找到很多关于如何在正在运行的 Linux 系统中检查物理核心布局的信息,但我想知道物理核心首先是如何分配 cpu id 的。
在几台机器上进行体验后,在我看来,分配是确定性的(即从相同的硬件启动将导致相同的 cpu id 分配给物理处理核心)。另外,在我看来,分配工作在某种程度上是“循环”的,这样两个编号相邻的核心在物理上彼此距离很远。例如,在我正在处理的一台服务器中(2 个套接字 x 8 个 cpu x 2 个超线程,x86_64):cpu0
在套接字上0
,cpu1
在套接字 1 上,然后cpu2
再次在套接字 0 上,但它位于与 ; 不同的物理核心上cpu0
; ...像这样继续下去,直到cpu15
,然后cpu16
在与 相同的物理核心上实现超线程cpu0
。
如果这看起来是故意的,你知道我可以在哪里找到这种行为的记录吗?其背后的理由是什么?
我特别感谢任何对文档或 lkml 帖子的引用,但即使是指向源代码中正确位置的指针也可能会有所帮助。
答案1
几乎没有记录,并且很大程度上取决于平台。对于 x86,下一个可用 id 被分配给函数中的 CPUgeneric_processor_info()
因此,对于 x86,cpu id 取决于我们调用该函数的顺序。它在 APIC(中断控制器)初始化时调用,而 APIC 设置取自 ACPI MADT 表,ACPI 表由 BIOS 提供。
您可以尝试使用 ACPI 工具(acpica-tools
CentOS 中的软件包)自行解码它们:
# acpidump > acpi.dat
# acpixtract -a acpi.dat
# iasl -d apic.dat
...
# cat apic.dsl | awk -F: '/Subtable Type/ { st = $2 }
/Processor ID/ { id = $2 }
/Processor Enabled/ { print id, $2, st } '