将单个核心分配给流程

Leo*_*nid 5 linux cpu cpu-usage process cpu-cores

我想要实现的是在带有 Debian 的 Raspberry Pi 2 上的它自己的核心上运行一个 python 脚本。可以使用taskset将进程绑定到特定核心。但是我需要这个核心同时不受操作系统和其他进程的负载的影响。我该怎么做?

Kam*_*ski 6

整个线程应该很有用。

我会寻找一种方法来限制“init”进程在 cpu 1 上运行。

在一般情况下,最后一句话应该是“在除 1 之外的所有 CPU 上运行”。我想可以使用一些内核参数irqaffinityisolcpus看起来很有希望。


编辑:

关于isolcpus内核参数文件

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

我做了一些测试。结果:

  • 内核参数isolcpus是您可以用来限制init进程和隔离 CPU 的参数。

  • 在我看来,内核参数irqaffinity不会影响隔离的 CPU。您可能不需要此参数。

  • 当我隔离CPU0 时,它并没有完全空闲。尽管隔离,该系统或硬件是否需要使用它进行一些计算?- 我不知道。

  • 当我隔离CPU1CPU7 时,它像岩石一样闲置。

要隔离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 亲和力是继承的。