我们有 16 个 cpu 的物理 Linux 机器
lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 16
我们想禁用该机器上的 14 个 cpu ,所以实际上就像我们的 Linux 机器只有 2 个 cpu 一样
为了实现这一目标,我做了以下工作
echo 0 > /sys/devices/system/cpu/cpu15/online
echo 0 > /sys/devices/system/cpu/cpu14/online
echo 0 > /sys/devices/system/cpu/cpu13/online
echo 0 > /sys/devices/system/cpu/cpu12/online
echo 0 > /sys/devices/system/cpu/cpu1/online
echo 0 > /sys/devices/system/cpu/cpu11/online
echo 0 > /sys/devices/system/cpu/cpu10/online
echo 0 > /sys/devices/system/cpu/cpu9/online
echo 0 > /sys/devices/system/cpu/cpu8/online
echo 0 > /sys/devices/system/cpu/cpu7/online
echo 0 > /sys/devices/system/cpu/cpu6/online
echo 0 > /sys/devices/system/cpu/cpu5/online
echo 0 > /sys/devices/system/cpu/cpu4/online
echo 0 > /sys/devices/system/cpu/cpu5/online
echo 0 > /sys/devices/system/cpu/cpu4/online
然后也运行mpstat
我们得到
08:26:13 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
08:26:13 AM all 0.34 0.00 0.09 0.04 0.00 0.00 0.00 0.00 0.00 99.53
08:26:13 AM 0 0.42 0.00 0.12 0.01 0.00 0.00 0.00 0.00 0.00 99.45
08:26:13 AM 1 0.37 0.00 0.10 0.01 0.00 0.00 0.00 0.00 0.00 99.52
08:26:13 AM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:26:13 AM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:26:13 AM 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:26:13 AM 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:26:13 AM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:26:13 AM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:26:13 AM 8 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:26:13 AM 9 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:26:13 AM 10 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:26:13 AM 11 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:26:13 AM 12 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:26:13 AM 13 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:26:13 AM 14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:26:13 AM 15 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
我们可以看到只有2个cpu在线
但我不确定这种方法是否真的有效,我需要建议,例如如何确保任何 PID 不会使用其他被禁用的 14 个 cpu?
让我知道我的程序是否禁用 14 个 cpu,并且进程将仅使用 2 个 cpu
答案1
这可能取决于应用程序,也可能不取决于应用程序。
如果应用程序只是使用 API 来轮询可用内核的数量,则可能无法正常工作,因为 Linux 内核可能会返回所有内核。
然而,在 BIOS 中禁用 CPU 内核必须有效 - 这取决于您的 BIOS 实现,因此请查阅您的主板文档。
如果我是您,我会以不同的方式处理这个问题:我会在虚拟机中运行应用程序并为其分配所需数量的核心。这样您的主机操作系统仍然能够使用剩余的核心。
最后,您不需要运行 echo 14 次。
这是 bash 的一个更简单的版本:
echo 0 | sudo tee /sys/devices/system/cpu/cpu{2..15}/online
最后确保留下两个物理核心而不是一个具有 HT 的核心。要了解您的 CPU 拓扑,请运行:
lscpu -p
通常,Linux 内核首先看到物理内核,然后是 HT/SMT 内核,但我不确定情况是否总是如此。