我有一台 AMD CPU,有 8 个内核,每个内核有 2 个线程。Linux(正确地)将其显示为 16 个“cpus”。但是,sysfs 实际上显示 32 个“可能的”cpus,其中 16 个不存在且处于脱机状态:
$ cat /sys/devices/system/cpu/possible
0-31
$ cat /sys/devices/system/cpu/present
0-15
$ cat /sys/devices/system/cpu/online
0-15
$ cat /sys/devices/system/cpu/offline
16-31
需要明确的是,这里没有任何问题;确实有 16 个逻辑 CPU 存在并且在线。我不清楚的是为什么 Linux 检测到额外的 16 个逻辑 CPU,这些 CPU 不存在但可能存在。
我认为这些是相关的内核文档:https://www.kernel.org/doc/html/latest/core-api/cpu_hotplug.html。但我没有看到任何关于如何选择可能的 CPU 数量的说明。 (请注意,它远低于kernel_max
CPU 数量,我的系统上为 8191。)
(一点额外的背景:我有一些代码需要解析这些值。做正确的事情似乎很简单,但我想要一个清晰的文档字符串解释为什么可能的 CPU 数量可能超过普通台式计算机上现有 CPU 的数量。)
答案1
如果内核内存中有足够的空间,CPU 就是“可能的”。可能的CPU数量是可以在线的最大CPU数量,包括启动后热插拔的CPU。
sysfs 这部分的文档位于如何通过 sysfs 导出 CPU 拓扑信息:
possible:已分配资源并且可以联机(如果存在)的 CPU。 [cpu_possible_mask]
但更详细的文档cpu_possible_mask
位于内核中的CPU热插拔:
系统中可能可用的 CPU 的位图。这用于为 per_cpu 变量分配一些启动时内存,这些变量不会随着 CPU 可用或删除而增长/收缩。一旦在启动时间发现阶段设置,该映射就是静态的,即任何时候都不会添加或删除任何位。预先根据您的系统需求准确地调整它可以节省一些启动时间内存。
该参数可以通过配置命令行选项。在可能的情况下,您的硬件不支持在不重新启动的情况下插入另一个 CPU,并且您不打算休眠系统并使其使用更多 CPU 唤醒,您可以通过传递possible_cpus=16
内核来节省少量内核内存命令行。在典型的 PC 或服务器上,该数量可能太小,不值得付出努力。
在没有命令行选项的情况下,我认为你需要阅读源码弄清楚发生了什么事。如果内核编译时没有 CPU 热插拔支持 ( CONFIG_HOTPLUG_CPU
),它只会查看启动时有多少个 CPU。如果内核有CPU热插拔支持,根据prefill_possible_map
源代码中的注释:
- 如果 BIOS 在 ACPI/mptables 中指定禁用的 CPU,则使用该 CPU。
- 用户可以用 possible_cpus=NUM 覆盖它
- 否则不要保留额外的 CPU。
我还没有验证这就是代码的作用。
请注意,“可能的 CPU”的含义适用于所有架构,但确定 CPU 数量的方法是特定于架构的。在我的回答中,我假设 x86。