我有一个 AMD CPU,有 8 个核心,每个核心有 2 个线程。Linux(正确地)将其显示为 16 个“cpu”。然而,sysfs 实际上显示了 32 个“可能的”CPU,其中 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
Run Code Online (Sandbox Code Playgroud)
需要明确的是,这里没有任何问题;确实有 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 数量普通台式电脑。)
如果内核内存中有足够的空间,CPU 就是 \xe2\x80\x9c 可能的\xe2\x80\x9d。可能的CPU数量是可以在线的最大CPU数量,包括启动后热插拔的CPU。
\nsysfs 这部分的文档位于如何通过 sysfs 导出 CPU 拓扑信息:
\n\n\npossible:已分配资源并且可以联机(如果存在)的 CPU。[cpu_possible_mask]
\n
但更详细的文档cpu_possible_mask
位于内核中的CPU热插拔中:
\n\n系统中可能可用的 CPU 的位图。这用于为 per_cpu 变量分配一些启动时内存,这些变量\xe2\x80\x99t 设计为随着 CPU 可用或删除而增长/收缩。一旦在启动时间发现阶段设置,映射就是静态的,即任何时候都不会添加或删除任何位。预先根据您的系统需求准确地调整它可以节省一些启动时间内存。
\n
该参数可以通过命令行选项进行配置。在可能的情况下,您的硬件不支持在不重新启动的情况下插入另一个 CPU,并且您不打算休眠系统并使其使用更多 CPU 唤醒,您可以通过传递来节省少量内核possible_cpus=16
内存内核命令行。在典型的 PC 或服务器上,该数量可能太小,不值得付出努力。
在没有命令行选项的情况下,我认为您需要阅读源代码才能弄清楚发生了什么。如果内核编译时没有 CPU 热插拔支持 ( CONFIG_HOTPLUG_CPU
),它只会查看启动时有多少个 CPU。如果内核有CPU热插拔支持,根据prefill_possible_map
源代码中的注释:
\n\n\n
\n- 如果 BIOS 在 ACPI/mptables 中指定禁用的 CPU,则使用该 CPU。
\n- 用户可以用 possible_cpus=NUM 覆盖它
\n- 否则不要保留额外的 CPU。
\n
我还没有验证这就是代码的作用。
\n请注意,\xe2\x80\x9cpossible CPUs\xe2\x80\x9d 的含义适用于所有体系结构,但确定 CPU 数量的方法是特定于体系结构的。在我的回答中,我假设 x86。
\n 归档时间: |
|
查看次数: |
3619 次 |
最近记录: |