整个线程应该很有用。
我会寻找一种方法来限制“init”进程在 cpu 1 上运行。
在一般情况下,最后一句话应该是“在除 1 之外的所有 CPU 上运行”。我想可以使用一些内核参数;irqaffinity
,isolcpus
看起来很有希望。
关于isolcpus
在内核参数文件:
此选项是隔离 CPU 的首选方法。另一种选择——手动设置系统中所有任务的 CPU 掩码——可能会导致问题和次优的负载平衡器性能。
我做了一些测试。结果:
内核参数isolcpus
是您可以用来限制init
进程和隔离 CPU 的参数。
在我看来,内核参数irqaffinity
不会影响隔离的 CPU。您可能不需要此参数。
当我隔离CPU0 时,它并没有完全空闲。尽管隔离,该系统或硬件是否需要使用它进行一些计算?- 我不知道。
当我隔离CPU1或CPU7 时,它像岩石一样闲置。
要隔离CPU1添加isolcpus=1
到您的 中grub.cfg
,如下所示:
linux /vmlinuz-
(...此处的所有当前参数...) isolcpus=1
或者,在系统启动后,您可以重新分配所有当前正在运行的进程的关联,但这似乎不太优雅。
我同意它看起来不太优雅,但它可能工作得足够好(编辑:它可能会导致问题和次优的负载平衡器性能,如上所述)。在我的 Debian 中,有一种快速而肮脏的单行程序:
sudo bash -c 'cd /proc ; for i in [1-9]* ; do taskset -a -p fffffffe $i ; done'
Run Code Online (Sandbox Code Playgroud)
我收到了一些pid的错误,但htop
表明此后一个核心实际上处于空闲状态。当然,您必须稍后运行脚本,以某种方式排除它或简单地重新分配:
taskset -a -p 1 PID
Run Code Online (Sandbox Code Playgroud)
我希望您不需要重复上述单行代码来涵盖新进程,因为 CPU 亲和力是继承的。