如何通过 sysfs 导出 CPU 拓扑信息

CPU 拓扑信息通过 sysfs 导出。其中的条目(属性)与某些架构的 /proc/cpuinfo 输出类似。它们位于 /sys/devices/system/cpu/cpuX/topology/ 中。请参阅 ABI 文件:ABI 文件 stable/sysfs-devices-system-cpu

架构无关的代码(drivers/base/topology.c)会导出这些属性。但是,仅当架构提供了下述相关宏时,才会创建与 die(裸片)、cluster(簇)、book(书)和 drawer(抽屉)层级相关的 sysfs 文件。

为了使某种架构支持此功能,必须在 include/asm-XXX/topology.h 中定义其中的一些宏

#define topology_physical_package_id(cpu)
#define topology_die_id(cpu)
#define topology_cluster_id(cpu)
#define topology_core_id(cpu)
#define topology_book_id(cpu)
#define topology_drawer_id(cpu)
#define topology_sibling_cpumask(cpu)
#define topology_core_cpumask(cpu)
#define topology_cluster_cpumask(cpu)
#define topology_die_cpumask(cpu)
#define topology_book_cpumask(cpu)
#define topology_drawer_cpumask(cpu)

**_id 的类型是 int。**_cpumask 的类型是 (const) struct cpumask *。后者对应于相应的 **_siblings sysfs 属性(topology_sibling_cpumask() 除外,它对应于 thread_siblings)。

为了在所有架构上保持一致,include/linux/topology.h 为 include/asm-XXX/topology.h 中未定义的上述任何宏提供了默认定义

  1. topology_physical_package_id: -1

  2. topology_die_id: -1

  3. topology_cluster_id: -1

  4. topology_core_id: 0

  5. topology_book_id: -1

  6. topology_drawer_id: -1

  7. topology_sibling_cpumask: 仅给定的 CPU

  8. topology_core_cpumask: 仅给定的 CPU

  9. topology_cluster_cpumask: 仅给定的 CPU

  10. topology_die_cpumask: 仅给定的 CPU

  11. topology_book_cpumask: 仅给定的 CPU

  12. topology_drawer_cpumask: 仅给定的 CPU

此外,CPU 拓扑信息在 /sys/devices/system/cpu 下提供,并包含这些文件。输出的内部来源在方括号 (“[]”) 中。

kernel_max

内核配置允许的最大 CPU 索引。[NR_CPUS-1]

offline

由于已通过热插拔(HOTPLUGGED)下线或超过了内核配置允许的 CPU 限制(上述 kernel_max)而未上线的 CPU。[~cpu_online_mask + cpus > NR_CPUS]

online

在线并正在被调度的 CPU [cpu_online_mask]

possible

已分配资源且如果存在即可上线的 CPU。[cpu_possible_mask]

present

已被识别为存在于系统中的 CPU。[cpu_present_mask]

上述输出的格式与 cpulist_parse() 兼容 [见 <linux/cpumask.h>]。下面是一些示例。

在此示例中,系统中有 64 个 CPU,但 CPU 32-63 超过了内核最大值,该值因 NR_CPUS 配置选项为 32 而被限制在 0..31。还要注意,CPU 2 和 4-31 不在线,但由于它们既存在(present)又可能(possible),因此可以上线

kernel_max: 31
   offline: 2,4-31,32-63
    online: 0-1,3
  possible: 0-31
   present: 0-31

在此示例中,NR_CPUS 配置选项为 128,但内核启动时使用了 possible_cpus=144。系统中有 4 个 CPU,cpu2 被手动下线(它是唯一可以上线的 CPU。)

kernel_max: 127
   offline: 2,4-127,128-143
    online: 0-1,3
  possible: 0-127
   present: 0-3

有关 possible_cpus=NUM 内核启动参数以及关于各种 cpumask 的更多信息,请参阅 内核中的 CPU 热插拔