如何在启动时禁用特定的 CPU 内核?

Sam*_*h93 7 boot multi-core cpu

我有一个 16 核 Intel Xeon 处理器,它成功启动到 BIOS 和 GRUB,但无法加载 Ubuntu(或任何操作系统)。事实证明,核心 #14 是所有问题的原因(在使用 memtest86 测试每个单独的核心后发现)。在 BIOS 中,我可以将系统设置为仅使用 2 个内核运行,并且系统在此配置下工作。但我希望能够使用 16 个内核中的 15 个。有没有办法在启动时仅禁用核心 #14?

Dou*_*ies 8

您可以利用CPU 热插拔功能来实现您的目标。您可以启动 CPU 0-13,然后添加其他 CPU(CPU 15-27 和 29-31)。

所有至强处理器都具有超线程,因此我假设您的意思是 16 个内核,每个内核 2 个线程,总共 32 个 CPU。这个答案是针对 4 核、每核 2 个线程的处理器编写和测试的,其中核心 2 是坏的。

首先,作为 sudo,编辑/etc/default/grub和添加最长启动时间 CPU,maxcpus=, 到您的GRUB_CMDLINE_LINUX_DEFAULT行。我的系统示例:

曾是:

GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 consoleblank=300 cpuidle_sysfs_switch cpuidle.governor=teo"
Run Code Online (Sandbox Code Playgroud)

现在:

GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 consoleblank=300 cpuidle_sysfs_switch cpuidle.governor=teo maxcpus=2"
Run Code Online (Sandbox Code Playgroud)

我用过的地方maxcpus=2你会用maxcpus=14.

先保存一份 grub,然后运行sudo update-grub。因此,系统将仅使用内核 0 和 1 启动,并且 CPU 0,1 在线:

doug@s15:~$ grep . /sys/devices/system/cpu/cpu*/online
/sys/devices/system/cpu/cpu1/online:1
/sys/devices/system/cpu/cpu2/online:0
/sys/devices/system/cpu/cpu3/online:0
/sys/devices/system/cpu/cpu4/online:0
/sys/devices/system/cpu/cpu5/online:0
/sys/devices/system/cpu/cpu6/online:0
/sys/devices/system/cpu/cpu7/online:0
Run Code Online (Sandbox Code Playgroud)

注意:对于默认的 Ubuntu 内核配置,CPU 0 始终在线,并且没有这样的事情:

doug@s15:~$ grep . /sys/devices/system/cpu/cpu0/online
grep: /sys/devices/system/cpu/cpu0/online: No such file or directory
Run Code Online (Sandbox Code Playgroud)

好的,现在,将其他所需的内核和 CPU 联机:

doug@s15:~$ echo 1 | sudo tee /sys/devices/system/cpu/cpu3/online
1
doug@s15:~$ echo 1 | sudo tee /sys/devices/system/cpu/cpu4/online
1
doug@s15:~$ echo 1 | sudo tee /sys/devices/system/cpu/cpu5/online
1
doug@s15:~$ echo 1 | sudo tee /sys/devices/system/cpu/cpu7/online
Run Code Online (Sandbox Code Playgroud)

并检查:

doug@s15:~$ grep . /sys/devices/system/cpu/cpu*/online
/sys/devices/system/cpu/cpu1/online:1
/sys/devices/system/cpu/cpu2/online:0
/sys/devices/system/cpu/cpu3/online:1
/sys/devices/system/cpu/cpu4/online:1
/sys/devices/system/cpu/cpu5/online:1
/sys/devices/system/cpu/cpu6/online:0
/sys/devices/system/cpu/cpu7/online:1
Run Code Online (Sandbox Code Playgroud)

所以现在,我有内核 0、1、3 在线和内核 2 离线和 6 个可用 CPU。请注意,核心 0 = cpus 0 和 4,核心 1 = cpus 1 和 5,...

编辑 1:对于 32 个 CPU,也许您有多个节点(处理器),因此内核到 CPU 的映射可能不同。

编辑 2:可能是启动后联机的 CPU 默认使用 intel_pstate CPU 频率缩放驱动程序中的性能调节器,这是内核配置默认值(在启动后 1 分钟更改为省电,对于启动启用的 CPU)。您可能希望根据自己的喜好检查和设置所有 CPU 调控器,通常是节能调控器。要检查做:

grep . /sys/devices/system/cpu/cpu*/cpufreq/scaling_driver
grep . /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
Run Code Online (Sandbox Code Playgroud)

例如,要更改州长,请注意(以 root 身份通知):

# for file in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do echo "powersave" > $file; done
Run Code Online (Sandbox Code Playgroud)

一旦您按照您希望的方式工作,您就可以在启动步骤后自动执行额外的在线操作(请参阅其他问题和答案以了解“如何操作”)。

注意:在我看来,您应该能够通过“possible_cpus=n”通过“cpu_possible_mask”操作在一个引导步骤中实现您的目标,但我无法让它工作。其他人可能知道。