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