概括

概括

我正在尝试禁用服务器的某些 CPU。
我找到了这个链接:https://www.cyberciti.biz/faq/debian-rhel-centos-redhat-suse-hotplug-cpu/linux-turn-on-off-cpu-core-commands/,它为我提供了如下方法:

这就是numactl --hardware给我的:
在此输入图像描述

我想禁用从 16 到 63 的所有 CPU,所以我编写了一个脚本,名称opCPUs.sh如下:

#!/bin/bash

for i in {16..63}; do
    if [[ "$1" == "enable" ]]; then
        echo 1 > /sys/devices/system/cpu/cpu$i/online
    elif [[ "$1" == "disable" ]]; then
        echo 0 > /sys/devices/system/cpu/cpu$i/online
    else
        echo 'illegal parameter'
    fi
done
grep "processor" /proc/cpuinfo

然后我执行它:我可以在脚本中./opCPUs.sh disable看到结果:grep
在此输入图像描述

似乎有效。

现在我认为所有进程都应该位于 CPU 0 - 15 中,因为其他进程已被禁用。
所以我使用现有的流程dbus来验证如下:
ps -Lo psr $(pgrep dbus)

我明白了:
在此输入图像描述

psr告诉我进程正在哪个 CPU 上运行,对吧?如果是这样,我已经禁用了 CPU 60、CPU 52 等,为什么它们还在这里?

答案1

除了@Yves 答案之外,您实际上可以使用isolcpus内核参数。

要在 Debian 或 Ubuntu 中禁用第四个 CPU/核心 (CPU 3):

/etc/default/grub添加isolcpus=3GRUB_CMDLINE_LINUX_DEFAULT

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=3"

跑步

sudo update-grub

重新启动服务器。

isolcpus — 将 CPU 与内核调度程序隔离。

概要 isolcpus= cpu_number [, cpu_number ,...]

描述 从通用内核 SMP 平衡和调度程序算法中删除由 cpu_number 值定义的指定 CPU。将进程移入或移出“隔离”CPU 的唯一方法是通过 CPU 关联系统调用。 cpu_number 从 0 开始,因此最大值比系统上的 CPU 数量少 1。

此选项是隔离 CPU 的首选方法。另一种方法是手动设置系统中所有任务的 CPU 掩码,这可能会导致问题和负载均衡器性能不佳。

有趣的是,使用此内核参数可以留出一个 CPU,以便稍后使用 CPU 与一个进程的亲和力/将进程固定到一个 CPU,从而确保没有更多的用户进程在该 CPU 上运行。

此外,还可以使服务器更加稳定,保证负载非常高的特定进程有自己的CPU来使用。在意识到这种设置之前,我已经看到 Meru 使用基于 Linux 的控制器来做到这一点。

将进程分配给第四个 CPU (CPU 3) 的相关命令是:

sudo taskset -cp PID

taskset用于在给定 PID 的情况下设置或检索正在运行的进程的 CPU 关联性,或使用给定的 CPU 关联性启动新的命令。 CPU 关联性是一种调度程序属性,它将进程“绑定”到系统上给定的一组 CPU。 Linux 调度程序将遵循给定的 CPU 关联性,并且该进程不会在任何其他 CPU 上运行。请注意,Linux 调度程序还支持自然 CPU 亲和性:出于性能原因,调度程序会尝试将进程保持在同一 CPU 上,只要可行。因此,强制特定的 CPU 关联性仅在某些应用程序中有用。


概括

有几种技术适用于这个问题:

在grub中设置isolcpus = 4并重新启动可以永久禁用用户态进程的第5个CPU/CPU 4;

echo 0 > /sys/devices/system/cpu/cpu4/online禁用第 5 个 CPU/CPU 4,它仍将继续为已分配给它的进程工作,但不会再将新进程分配给 CPU 4;

taskset -c 3 ./MyShell.sh将强制MyShell.sh分配给第 4 个 CPU/CPU 3,而如果 isolcpus 不排除它这样做,则第 4 个 CPU 仍然可以接受其他用户态进程。

附言。有趣的是,我在现场使用isolcpus/的最佳示例是 SSL 前端taskset很忙网站每隔几周就会变得不稳定,Ansible/ssh不再让我远程访问。

我应用了上面讨论的技术,从那时起它就一直以非常稳定的方式工作。

答案2

经过一些测试,我得到的结果如下:

echo 0 > /sys/devices/system/cpu/cpu4/online

确实禁用了第 4 个 CPU。

“禁用第4个CPU”意味着后面的进程将不再分配给第4个CPU。换句话说,“禁用第4个CPU”之前位于第4个CPU的进程在禁用CPU时不会被移出该CPU。

假设我有四个 CPU:0、1、2 和 3。所以我可以:

echo 0 > /sys/devices/system/cpu/cpu1/online
echo 0 > /sys/devices/system/cpu/cpu2/online
echo 0 > /sys/devices/system/cpu/cpu3/online
./MyShell.sh

强制./MyShell.sh将 分配给 CPU0。

顺便说一句,重新启动会自动启用所有 CPU。

相关内容