我试图寻找解决方案,但我发现的只是如何使用任务集或 sched_setaffinity 将进程固定到 CPU。但看起来这不会给予进程对 CPU 的独占访问权限,即调度程序可能会在该 CPU 上分配其他进程。有什么方法或命令可以确保CPU专用于该进程吗?使用任务集,我们可以确保特定进程仅在特定 CPU 上运行,但我也希望以其他方式运行,即 CPU 绑定到该进程。我发现了类似的问题如何为进程分配特定数量的 CPU 功率?和Linux中如何限制一个进程只能使用一个CPU核心?但它们被标记为重复如何在 Linux 上设置进程的处理器关联性?这不是我想要的。
答案1
您需要从整体调度中排除一个CPU,然后您可以通过以下方式将进程分配给它:
taskset
正如你已经发现的那样。要排除 CPU,请添加启动参数
isolcpus=N
数字 (N) 从 0 开始。
答案2
在运行 systemd 的系统上,您还可以在 systemd 配置中进行配置。假设您的系统有 4 个核心,您可以添加
[Manager]
CPUAffinity=0-2
以/etc/systemd/system.conf
确保 systemd (PID 1) 将在前三个 CPU 上运行。默认情况下,由 systemd 直接或间接启动的进程(对于所有进程都是如此)将继承此设置,因此不会使用第 4 个 CPU(编号 3)。只需添加
[Service]
CPUAffinity=3
到您想要在第四个核心上运行的服务的单元文件。这种方法的一个优点是,您可以在同一LimitMEMLOCK
位置调整其他实时相关设置LimitRTPRIO
- 无需摆弄一堆不同的工具。
注意:您需要重新启动系统以使 systemd 生效第一个更改。如果您仅修改了服务配置,则重新启动受影响的服务就足够了:
systemctl daemon-reload
systemctl restart my-service.service