![如何在 Linux-5.10.24 中禁用 CPU 热插拔功能(和内核线程)](https://linux22.com/image/219529/%E5%A6%82%E4%BD%95%E5%9C%A8%20Linux-5.10.24%20%E4%B8%AD%E7%A6%81%E7%94%A8%20CPU%20%E7%83%AD%E6%8F%92%E6%8B%94%E5%8A%9F%E8%83%BD%EF%BC%88%E5%92%8C%E5%86%85%E6%A0%B8%E7%BA%BF%E7%A8%8B%EF%BC%89.png)
我正在开发一个嵌入式 Linux 系统,该系统使用 kernel-5.10.24。
由于系统资源是有限的,所以我想尽量减少CPU/内存/存储的使用。
从ps -ax
我发现2个内核线程如下,
14 root 0:00 [cpuhp/0]
15 root 0:00 [cpuhp/1]
我认为它们用于 CPU 热插拔,并且该系统中没有 CPU 热插拔用例,因此我想禁用该功能并且不创建这 2 个内核线程。
我尝试强制禁用此配置(select SYS_SUPPORTS_HOTPLUG_CPU
从 arch/ARM/Kconfig 等中删除)。
但是部署新内核后,这2个内核线程仍然存在。
通过检查代码,似乎这2个线程的创建与 和 无关CONFIG_HOTPLUG_CPU
,CONFIG_SYS_SUPPORTS_HOTPLUG_CPU
这意味着当配置SMP时,这2个线程始终存在!
所以我不确定是否有办法禁用这两个内核线程的创建。如果不是,我必须忍受它们,假设它们不会占用太多的 CPU 和内存来运行。
根据 dhanushka 的评论更新了内核菜单配置
Symbol: HOTPLUG_CPU [=y]
Type : bool
Defined at arch/mips/Kconfig:2942
Prompt: Support for hot-pluggable CPUs
Depends on: SMP [=y] && SYS_SUPPORTS_HOTPLUG_CPU [=y]
Location:
-> Kernel type
(2) -> Multi-Processing support (SMP [=y])
Selected by [y]:
- PM_SLEEP_SMP [=y] && SMP [=y] && (ARCH_SUSPEND_POSSIBLE [=y] || ARCH_HIBERNATION_POSSIBLE [=y]) && PM_SLEEP [=y]
与 dhanushka 的评论相同。
我会尝试禁用它并更新这个问题。
正如我所说,cpuhp0/1
似乎无法禁用。
答案1
并不是真正的答案,但想添加一些东西。您一定已经尝试过这些,但请参阅下文以防万一您错过了。
如果你有top(1),你可以检查他们的资源使用情况。或者您可以使用 /proc/[pid]/status 等来检查它们。无论哪种方式,您都会看到它们并不消耗资源,并且大多处于睡眠(S)状态。
您还可以从内核文档和配置中看到它与电源管理(SMP 挂起/恢复)相关,因此请考虑您的电源管理要求以及禁用 CPU 热插拔会对它们产生怎样的影响。
内核配置:
内核文档说需要启用 CONFIG_HOTPLUG_CPU 才能使 CPU 热插拔工作。
- 你是否从menuconfig中禁用了?
- 如果没有,您是否检查了 menuconfig 以查看更改后它是否已被禁用?
如果您尝试从 menuconfig 禁用它,您首先必须禁用一系列其他配置,并在禁用它们后能够成功构建内核。例如,这是 menuconfig 在我的平台上显示的内容:
CONFIG_HOTPLUG_CPU:
Say Y here to experiment with turning CPUs off and on. CPUs
can be controlled through /sys/devices/system/cpu.
Symbol: HOTPLUG_CPU [=y]
Type : bool
Defined at arch/arm64/Kconfig:985
Prompt: Support for hot-pluggable CPUs
Location:
-> Kernel Features
Selects: GENERIC_IRQ_MIGRATION [=y]
Selected by [y]:
- PM_SLEEP_SMP [=y] && SMP [=y] && (ARCH_SUSPEND_POSSIBLE [=y] || ARCH_HIBERNATION_POSSIBLE [=y]) && PM_SLEEP [=y]
因此,我根本无法从 menuconfig 中禁用它,除非我解决了
Selected by [y]:
- PM_SLEEP_SMP [=y] && SMP [=y] && (ARCH_SUSPEND_POSSIBLE [=y] || ARCH_HIBERNATION_POSSIBLE [=y]) && PM_SLEEP [=y]
这使得它成为可能。
你也会有类似的限制。您可以尝试解决它们并最终禁用 CONFIG_HOTPLUG_CPU,但我怀疑您之后是否能够构建内核,因为某些驱动程序不能很好地处理依赖项(但看起来对您有用)。