![如何在启动时为*所有* Linux 进程绑定静态亲和性?](https://linux22.com/image/751474/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%90%AF%E5%8A%A8%E6%97%B6%E4%B8%BA*%E6%89%80%E6%9C%89*%20Linux%20%E8%BF%9B%E7%A8%8B%E7%BB%91%E5%AE%9A%E9%9D%99%E6%80%81%E4%BA%B2%E5%92%8C%E6%80%A7%EF%BC%9F.png)
我在服务器上有一个单线程进程,我想将其静态绑定到一个 CPU 核心,并始终为其提供所有可用的计算能力(这是一个实时进程,资源不足对其影响很大)。不幸的是,机器严重超载,因此 CPU 平均占用率为 60% 或更多,进程通常会被压垮。我已经分配了实时循环优先级 99,但还远远不够完美。
我怎样才能在启动时将所有其他进程分配给剩余的 7 个 CPU 核心,并将一个核心专用于此一个进程?我说的是所有新生成的进程从一开始就已绑定到 7 个核心的情况。
答案1
使用内核启动参数 isolcpus 删除您想要专用于实时进程的 CPU:
Remove the specified CPUs, as defined by the cpu_number values, from the general kernel SMP balancing and scheduler algroithms. The only way to move a process onto or off an "isolated" CPU is via the CPU affinity syscalls
如果你正在使用带有 systemd 的发行版,你可以CPUAffinity
在服务单元中使用
答案2
我从来没有这样做过所以这只是一个建议。
看来taskset
配置是继承的。因此,您可以在启动过程中尽早为 PID 1 进行这样的设置,以便 SystemD 此后启动的所有内容都只使用这些核心:
taskset -p 0x7F 1
或者您不关心在启动过程的哪个阶段发生这种情况,而只是迭代所有现有过程。
不要忘记更改您的特殊应用程序的设置...